import { tr } from "date-fns/locale";
import React, { useEffect, useState, useMemo, useContext } from "react";
import { TaxiOrder_type, TaxiOrder_initial, TaxiOrder_fieldName, TaxiOrder_tableData } from '../types/taxiOrderType';
import { differenceInDays } from 'date-fns';
import { getCsrfToken } from "../../../../../resources/js/services/getCsrfService";
import { Button, TextInput, Select, Option } from '@SharePoint/rencredit_uikit';
import { EntityHistoryProps } from "../../../../../resources/js/components/entityHistory/EntityHistory";
import { HistoryProvider, HistoryContext } from "../../../../../resources/js/contexts/HistoryContext";
import { PopupContext } from "../../../../../resources/js/contexts/PopupContext";
import { PreloaderContext } from "../../../../../resources/js/contexts/PreloaderContext";
import api from "../../../../../resources/js/api";

type EmpSupervisorsData = {
  emp_login: string, 
  emp_supervisor: string
}

export default function TaxiHome ()
{
  //Массив полей для отображения в таблицах с заяками. Учитывается, в том числе, порядок
  const rqstTableFields = ['id', 'emp_login', 'emp_supervisor', 'emp_phone', 'taxi_date', 'taxi_time', 'taxi_address_from', 'taxi_address_to', 'cancel_rqst'];
  //Формируем объект с полями для таблицы  
  const rqstTableHeaderFields: Record<keyof TaxiOrder_tableData, string> = Object.assign({}, ...rqstTableFields.map( field => {return {[field]: TaxiOrder_fieldName[field]}}));
  const rqstTableHeader:string[] = Object.keys(TaxiOrder_fieldName).map(rqstFieldName => TaxiOrder_fieldName[rqstFieldName]);
  const [ccEmp, setCcEmp] = useState<string[]>([]);
  //Стейт для руководителей сотрудников
  const [empSupervisors, setEmpSupervisors] = useState<EmpSupervisorsData[]>([]);
  const [allOrders, setAllOrders] = useState<TaxiOrder_type[]>([]);
  const [filterOrders, setFilterOrders] = useState<TaxiOrder_type[]>([]);
  const [startSearch, setStartSearch] = useState<boolean>(false);
  const [rqstNumber, setRqstNumber] = useState<string>('');
  const [rqstTime, setRqstTime] = useState<string>('');
  const [rqstLogin, setRqstLogin] = useState<string>('');
  const [orderTimePeriods, setOrderTimePeriods] = useState<[{time_period: string}]>([{time_period: ''}]);

  const popupContext = useContext(PopupContext);
  const preloaderContext = useContext(PreloaderContext);

  useEffect ( () => {
    api.get('/taxi/getTimePeriods', 
    ).then(timePeriods_json => setOrderTimePeriods(timePeriods_json.data));

    // fetch('/public/api/taxi/getTimePeriods', {
    //   method: 'GET',
    //   credentials: 'include',
    // }).then(timePeriods_resp => timePeriods_resp.json().then( timePeriods_json => {
    //   setOrderTimePeriods(timePeriods_json);
    // }));
    
    setTimeout(() => {
      popupContext.addPopupArrTest([
        {message: 'для информации', timeOut: true, type: 'attention'} 
      ])
      popupContext.addPopupArrTest([
        {message: 'ошибка', timeOut: true, type: 'error'} 
      ])
    }, 1000);
    console.log(Object.keys(TaxiOrder_fieldName)) 
  }, [])

  //ГАВРИЛОВ
  //ЕСЛИ ОБЪЕКТ СО ЗНАЧЕНИЯМИ ДЛЯ ПОИСКА ПУСТОЙ - НЕ ВЫПОЛНЯЕМ ПОИСК, ВОЗВРАЩАЕМ ОПОВЕЩЕНИЕ О ПУСТЫХ УСЛОВИЯХ
  const getFilterOrders = () => {
    console.log(rqstTime)
    console.log(rqstNumber)
    console.log(rqstLogin)
    setStartSearch(true);
    // ГАВРИЛОВ. проверь
    api.post('/taxi/getFilterOrders', {
      id: rqstNumber,
      taxi_time: rqstTime,
      emp_login: rqstLogin
    }).then(filterOrdersJson => {
      setFilterOrders(filterOrdersJson.data);
    })
    // fetch('/public/api/taxi/getFilterOrders', {
    //   credentials: 'include',
    //   method: 'POST', 
    //   body: JSON.stringify({
    //     id: rqstNumber,
    //     taxi_time: rqstTime,
    //     emp_login: rqstLogin
    //   }),
    //   headers: {
    //     'content-type': 'application/json'
    //   }
    // }).then(filterOrdersRqst => filterOrdersRqst.json())
    // .then(filterOrdersJson => {
    //   setFilterOrders(filterOrdersJson);
    // })
  }

  const timePeriodOptions: Option<string>[] = useMemo(() => {
    return orderTimePeriods.map((time: {time_period: string}) => {
      return {
        caption: time.time_period,
        value: time.time_period,
        id: time.time_period
      }
    })
  }, [orderTimePeriods])

  const empLoginOptions: Option<string>[] = useMemo(() => {
    return ccEmp.map((empLogin: string) => {
      return {
        caption: empLogin,
        value: empLogin,
        id: empLogin
      }
    })
  }, [ccEmp])

  useEffect ( () => {
    Promise.all(
      [
        // fetch('/public/api/taxi/getEmpInfo', {
        //   credentials: 'include',
        //   method: 'GET',
        // }).then( empInfo_resp => empInfo_resp.json() ),
        api.get('taxi/getEmpInfo'),
        api.get('taxi/getActiveOrders'),
        // fetch('/public/api/taxi/getActiveOrders', {
        //   credentials: 'include',
        //   method: 'GET',
        // }).then( allOrders_resp => allOrders_resp.json() )
      ]
    ).then(
      ([
        {data: empInfo_json}, 
        {data: allOrders_json}
      ]) => {
        setCcEmp(empInfo_json.map( (empInfoEl: {emp_login: String}) => empInfoEl.emp_login ));
        setAllOrders(allOrders_json);
        setEmpSupervisors(empInfo_json.map( (empInfoEl: {emp_login: String, emp_group: String}) => ({emp_login: empInfoEl.emp_login, emp_supervisor: empInfoEl.emp_group}) ));
      }
    )
    
  }, [])

  const isReady = ccEmp.length > 0 && orderTimePeriods.length > 0;

  useEffect ( () => {
    console.log(!isReady)
    preloaderContext.setPreloaderVisible(!isReady)
    // setPreloaderProp(!isReady);
    // console.log(empSupervisors)
  }, [isReady])

  if (!ccEmp.length || !orderTimePeriods.length) {
    //setIsReady(true);
    return;
  } else {
    //setIsReady(false);
    // console.log(allOrders);
    console.log(ccEmp);
    console.log(orderTimePeriods);
  }

  // ГАВРИЛОВ. ОФОРМИ РЕЗУЛЬТАТЫ ПОИСКА. ПОСЛЕ ПОИСКА ПЛАВНО ОПУСКАЙ ДО ТАБЛИЦЫ РЕЗУЛЬТАТЫ ПОИСКА, ТАКЖЕ ВЫВЕДИ ЗОТЯ БЫ ТЕКСТ "РЕЗУЛЬТАТЫ ПОИСКА, СЕЙЧАС ЭТО ПРОСТО ТАБЛИЦА"

  //Гаврилов
  //Реализовать подтягивание информации
  //Реализовать переключение между БД (new and old Magic)

  //console.log(sanctumToken())

  let newDate = new Date('2024-06-05');
    newDate.setHours(0, 0, 0);

  // function callHistory(entityId) {
  //   console.log(entityId)
  
  //   return fakeObjArr;
  // }
    

  // let resultObj = {
  //   entityId: 1,
  //   entityProps: fakeObjArr
  // }

  return (
    <div id='taxi-container'>
      <Button  
        type = 'button' 
        text = 'Новая заявка' 
        onClick = { 
          () => document.location.href = 'createRqst' 
        }
        className = "taxi-btn"
      />
      <div className = "elem--title el-title--big">Активные заявки</div>
      <div className='container__table-block' id='taxi__rqst--active'>
        <HistoryProvider>
          <RqstTable
            allOrders={allOrders}
            rqstTableHeader={rqstTableHeaderFields}
            empSupervisors={empSupervisors}
          />
        </HistoryProvider>
      </div>
      <div id="taxi__home__filter-form">
        <div className = "elem--title el-title--big">Поиск заявки</div>
        <form>
          <input 
            type="hidden" 
            name="_token" 
            value={getCsrfToken()}
          />
          <div>
            <TextInput 
              labelText = 'Номер заявки'
              value = {rqstNumber}
              onChange = {(e: string) => setRqstNumber(e)}
            />
            {/* <label htmlFor="">Номер заявки</label>
            <input type="number" onChange={ e => {
              setRqstNumber(e.target.value)
            }}></input> */}
          </div>
          {/* <div>
            <label htmlFor="">Дата с</label>
            <input type="date" />
          </div>
          <div>
            <label htmlFor="">Дата по</label>
            <input type="date" />
          </div> */}
          <div>
            <Select
              labelText = "Время"
              options = {timePeriodOptions}
              size = '1'
              onChange = { (e: string) => {
                setRqstTime(e)
              }}
            />
            {/* <label htmlFor="">Время</label>
            <select name="taxi_time" id="" onChange={ e => {
              setRqstTime(e.target.value)
            }}>
              <option key='0' value=''></option>
              {
                orderTimePeriods.map( (timePeriodEl, timePeriodIndex ) => 
                  <option key={timePeriodIndex++} value={timePeriodEl.time_period}>{timePeriodEl.time_period}</option>
                )
              }
            </select> */}
          </div>
          <div>
            <Select
              labelText = "Сотрудник"
              options = {empLoginOptions}
              size = '1'
              onChange = { (e, selectedOption: {value: string}) => {
                setRqstLogin(selectedOption.value)
              }}
            />
            {/* <label htmlFor="">Логин</label>
            <select onChange={ e => setRqstLogin(e.target.value) }>
              <option key="0" value=""></option>
              {
                ccEmp.map( (empDataEl: string, empDataIndex: number) => 
                  <option key={empDataIndex++} value={empDataEl}>{empDataEl}</option>
                )
              }
            </select> */}
          </div>
          <Button 
            className = "taxi-btn"
            type = 'button'
            text = 'Искать' 
            onClick = { getFilterOrders } 
            size = 's'
            ui = 'secondary'
          />
          {/* <button type="button" onClick={getFilterOrders}>Искать</button> */}
        </form>
      </div>
      <div id = "container__filter-rqst-table">
        {
          startSearch ?
          <table>
          <thead>
            <tr>
              {
                rqstTableHeader.map( (headEl, headElIndex) => 
                  <th key={headElIndex} className = "table-header">
                    {headEl}
                  </th>)
              }
            </tr>
          </thead>
          <tbody>
            {
              filterOrders.length ?
              filterOrders.map( (rqstData: TaxiOrder_type, rqstIndex: number) => 
                <tr key={rqstIndex}>
                  {
                    Object.keys(TaxiOrder_initial).map(initField => 
                      <td>
                        {initField == 'cancel_rqst' ? (rqstData[initField] ? 'Нет' : 'Да') : rqstData[initField]}
                      </td>)
                  }
                </tr>)
              : <tr>
                  <td>Запросов не найдено</td>
                </tr>
            }
            </tbody>
          </table>
          : ''
        }
      </div>
    </div>
  )
}


function RqstTable(props: {allOrders: TaxiOrder_type[], rqstTableHeader: Record<keyof TaxiOrder_tableData, string>, empSupervisors: EmpSupervisorsData[]}){
  const historyContext = useContext(HistoryContext);
  if (!historyContext) {
    return null;
  }
  let newDate = new Date('2024-06-05');
  newDate.setHours(0, 0, 0); 
  return (
    props.allOrders.length ? 
      <table className="taxi-orders">
        <thead>
          <tr>
            {
              Object.entries(props.rqstTableHeader).map((el, index) => 
                <th key={index} className="table-header">{el[1]}</th>
              )
            }
            <th className = "table-header">Управление</th>
          </tr>
        </thead>
        <tbody>
          {
            props.allOrders.map( (rqstData: TaxiOrder_type, rqstIndex: number) => 
              <tr key = {rqstIndex}>
                {
                  Object.entries(props.rqstTableHeader).map( el => {
                    return (
                      // Если поле - руководитель сотрудника - вычисляем значение, ориентируясь на список props.empSupervisors
                      el[0] === 'emp_supervisor' ? 
                        <td key={el[0]}>{ props.empSupervisors.find(empData => empData.emp_login == rqstData.emp_login)?.emp_supervisor }</td>
                        : <td key={el[0]}>{ rqstData[el[0]] }</td>
                    )
                  })
                }
                <td className="taxi-orders__order-options">
                {/* Можно взаимодействовать только с заявками на такси на сегодняшнюю, либо завтрашнюю дату */}
                  {differenceInDays(new Date(rqstData.taxi_date), new Date()) >= 0 && !rqstData.cancel_rqst ? 
                    <>
                      <Button 
                        type = 'button'
                        onClick = { () => { document.location.href = `editOrder/${rqstData.id}` } }
                        text = {'Редактировать'}
                        ui = 'secondaryPurple'
                      />
                      <Button 
                        type = 'button'
                        onClick = { () => { document.location.href = `cancelRqst/${rqstData.id}` } }
                        text = {'Отменить'}
                        ui = 'secondaryPurple'
                      />
                      <Button 
                        type = 'button'
                        onClick = { () => { historyContext.getHistoryFromMagic('taxi', rqstData.id, TaxiOrder_fieldName) } }
                        text = {'История'}
                        ui = 'secondaryPurple'
                      />
                    </> 
                    : ""
                  }
                </td>
              </tr>
            )
          }
        </tbody>
      </table>
    : <div>Нет активных заявок</div>
  )
}
