import { NavLink, useLocation } from "react-router-dom";
import { useState, useEffect } from 'react';
import { observer } from "mobx-react";
import { toJS } from "mobx";
import { Row, Col, Space, Button, Table, Input, Typography, DatePicker, Radio, Modal, App, Select } from 'antd';
import { useStore } from '@/stores/StoreContext.js';
import { DATE_PRESETS } from "@/config";
import dayjs from "dayjs";

const { Title } = Typography;

function Newest() {
  const reservationListColumns = [
    {
      title: 'Reference number',
      dataIndex: 'referenceNumber',
      key: 'Reference number',
      render: (text, record) => <NavLink to={`/reservation/${record.reservationId}`}>{text}</NavLink>,
    },
    {
      title: 'Arrival date',
      dataIndex: 'arrivalDate',
      key: 'Arrival date',
    },
    {
      title: 'Pax',
      key: 'Pax',
      dataIndex: 'pax'
    },
    {
      title: 'Status',
      key: 'Status',
      dataIndex: 'status'
    },
    {
      title: 'Reservation date',
      key: 'Reservation date',
      dataIndex: 'reservationDate'
    },
    {
      title: 'Guide',
      key: 'Guide',
      dataIndex: 'guide',
      render: guideRender
    },
  ];
  
  function guideRender(text, reservation) {
    if (reservation.guide === '') {
      return (
        <Space size="middle">
          <Button type="link" onClick={() => showCityGuideModal(reservation)}>Fill in</Button>
        </Space>
      );
    } else {
      return (
        <Space size="middle">
          <span>{reservation.guide}</span>
          <Button type="link" onClick={() => showCityGuideModal(reservation)}>Modify</Button>
        </Space>
      );
    }
  }

  function cityGuideRender(text, city) {
    return (
      <Select
        showSearch
        style={{
          width: 280,
        }}
        bordered={false}
        allowClear
        placeholder="Select a guide"
        optionFilterProp="children"
        defaultValue={(guideSelectOptions.length == 0 || city.tourGuideId == 0) ? null : city.tourGuideId}
        onChange={(guideId) => {
          reservationStore.setupCityGuide(city.cityId, guideId);
        }}
        onSearch={(value) => {
          console.log('search:', value);
        }}
        filterOption={(input, option) =>
          (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
        }
        options={toJS(guideSelectOptions)}
      />
    );
  }

	const location = useLocation();
  const { reservationStore } = useStore();
  const { reservationList, reservationPage, referenceNo, arrivalDateRange, cityList, cityGuideList } = reservationStore;
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [dataLoading, setDataLoading] = useState(false);
  const { notification } = App.useApp();
  const guideSelectOptions = cityGuideList.map((data, index) => {
    return {
      value: data.guideId,
      label: data.guideName
    }
  });

  useEffect (() => {
    if (location.search !== '?back') {      
      onSearchClick();
    }
    return () => {
      console.info('unmount...');
    };
  }, []);

  const showCityGuideModal = (reservation) => {
    setDataLoading(true);  
    setIsModalOpen(true);
    reservationStore.editReservation(reservation);
    reservationStore.fetchAllGuideList();
    reservationStore.fetchCityList(reservation.reservationId)
      .catch(ex => {
        notification.error({
          message: `Notification`,
          description: ex.message,
          placement: 'top',
          duration: 4,
        });
      })
      .finally(() => {
        setDataLoading(false);
      });
  };
  const handleOk = () => {
    reservationStore.updateReservationGuide()
      .finally(() => {
        setIsModalOpen(false);
        setDataLoading(false);
      });
  };
  const handleCancel = () => {
    setIsModalOpen(false);
    setDataLoading(false);
  };
  
  const onSearchClick = (current=1) => {
    setDataLoading(true);
    reservationStore.fetchReservationList(current)
      .catch(ex => {
        notification.error({
          message: `Notification`,
          description: ex.message,
          placement: 'top',
          duration: 4,
        });
      })
      .finally(() => {
        setDataLoading(false);
      });
  }

  return (
    <>
      <Modal
        centered
        open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
      >
        <Space direction="vertical" style={{ width: '100%' }}>
          <Row>
            <Col span={24}>
              <Table
                bordered
                loading={dataLoading}
                pagination={false}
                columns={[
                  {
                    title: 'City',
                    dataIndex: 'cityName',
                    key: 'cityName'
                  },
                  {
                    title: 'Tour Guide',
                    dataIndex: 'tourGuide',
                    key: 'tourGuide',
                    render: cityGuideRender,
                  }
                ]}
                dataSource={toJS(cityList)}
              />
            </Col>
          </Row>
        </Space>
      </Modal>
      <Space direction="vertical" style={{ width: '100%' }}>
        <Title level={3}>Newest Reservations</Title>
        <Row gutter={{ md: 24 }}>
          <Col span={6}>
            <Input placeholder="Reference number" value={referenceNo} onChange={(e) => { reservationStore.updatePropertyValue('referenceNo', e.target.value)} } />
          </Col>
          <Col span={18}>
            <Space direction="horizontal">
              Arrival Date
              <DatePicker.RangePicker
                allowClear={true}
                inputReadOnly={true}
                presets={DATE_PRESETS}
                defaultValue={toJS(arrivalDateRange)}
                placeholder={['From', 'Thru']}
                onChange={(dateRange) => { 
                  reservationStore.updatePropertyValue('arrivalDateRange', dateRange == null ? [] : dateRange)
                }}
              />
              <Button type='primary' onClick={() => onSearchClick()} loading={dataLoading}>Search</Button>
            </Space>
          </Col>
        </Row>
        <Row>
          <Col span={24}>
            <Table
              title={() => 'Reservations without the tour guide information will be highlighted in red if the arrival date is within 3 days.'}
              bordered
              loading={dataLoading}
              pagination={{
                position: ['bottomCenter'],
                current: reservationPage.current,
                pageSize: reservationPage.size,
                total: reservationPage.total,
                simple: true
              }}
              onChange={(pagination, filters, sorter, extra) => {onSearchClick(pagination.current);}}
              columns={reservationListColumns} dataSource={reservationList}
            />
          </Col>
        </Row>
      </Space>
    </>
  );
}

export default observer(Newest);