// @mui
import {
  Box,
  Button,
  Card,
  Collapse,
  IconButton,
  MenuItem,
  Table,
  TableBody,
  TableCell,
  TableRow,
  TextField,
  Typography,
  Stack,
  Menu,
  ButtonGroup,
  Tooltip,
} from '@mui/material';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
import AddIcon from '@mui/icons-material/Add';
import AssessmentIcon from '@mui/icons-material/Assessment';
import UploadIcon from '@mui/icons-material/Upload';
import CancelIcon from '@mui/icons-material/Cancel';
// hooks
import React, { ChangeEvent, useEffect, useRef, useState } from 'react';
import { Link, Navigate, useNavigate, useSearchParams } from 'react-router-dom';
// components
import axios from '../../utils/axios';
import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../@types/paginated-data';
import DataTable from '../../components/LaravelTable';
import { fCurrency } from '../../utils/formatNumber';
import EditRoundedIcon from '@mui/icons-material/EditRounded';
import { Chip } from '@mui/material';
import Iconify from '@/components/Iconify';
import { enqueueSnackbar } from 'notistack';

export default function List() {
  const [searchParams, setSearchParams] = useSearchParams();
  const [importResult, setImportResult] = useState(null);
  const navigate = useNavigate();

  function SearchInput(props: any) {
    // SEARCH
    const searchInput = useRef<HTMLInputElement>(null);
    const [searchText, setSearchText] = useState('');

    const handleSearchChange = (event: any) => {
      const newSearchText = event.target.value ?? '';
      setSearchText(newSearchText);
    };

    const handleSearchSubmit = (event: any) => {
      event.preventDefault();
      props.onSearch({ search: searchText }); // Trigger to Parent
    };

    const handleGetData = (type :string) => {
      axios.get(`claims/1/data-claim`)
        .then((response) => {
          const link = document.createElement('a');
          link.href = response.data.data.file_url;
          link.setAttribute('download', response.data.data.file_name);
          document.body.appendChild(link);
          link.click();
        })
    }

    useEffect(() => {
      // Trigger First Search
      setSearchText(searchParams.get('search') ?? '');
    }, []);

    return (
      <form onSubmit={handleSearchSubmit} style={{ width: '100%' }}>
        <Stack direction={'row'} spacing={2} sx={{ mb: 2 }}>
          <TextField
            id="search-input"
            ref={searchInput}
            label="Search"
            variant="outlined"
            fullWidth
            onChange={handleSearchChange}
            value={searchText}
          />
        <Tooltip title="Benefit Usage Report">
            <Button variant="outlined" startIcon={<AssessmentIcon />}  sx={{ p: 1.8 }}  onClick={handleGetData}/>
        </Tooltip>
        </Stack>
      </form>
    );
  }

  function ImportForm(props: any) {
    // IMPORT
    // Create Button Menu
    const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);

    return (
      <div>
        <Stack direction={'row'} spacing={2} sx={{ p: 2 }}>
          <SearchInput onSearch={applyFilter} />
          {/* <Button
            variant="outlined"
            startIcon={<AddIcon />}
            sx={{ p: 1.8 }}
            onClick={() => {
              navigate('/claims/create');
            }}
          >
            Create
          </Button> */}
        </Stack>
      </div>
    );
  }

  // Dummy Default Data
  const [dataTableIsLoading, setDataTableLoading] = useState(true);
  const [dataTableData, setDataTableData] = useState<LaravelPaginatedData>(
    LaravelPaginatedDataDefault
  );

  const loadDataTableData = async (appliedFilter: any | null = null) => {
    setDataTableLoading(true);
    const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]);
    const response = await axios.get('/claims', { params: filter });
    // console.log(response.data);
    setDataTableLoading(false);

    setDataTableData(response.data);
  };

  const applyFilter = async (searchFilter: { search: string }) => {
    await loadDataTableData(searchFilter);
    setSearchParams(searchFilter);
  };

  const handlePageChange = (event: ChangeEvent, value: number): void => {
    const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]);
    loadDataTableData(filter);
    setSearchParams(filter);
  };

  useEffect(() => {
    loadDataTableData();
  }, []);

  const headStyle = {
    fontWeight: 'bold',
  };

  // Called on every row to map the data to the columns
  function createData(data: any): any {
    return {
      ...data,
    };
  }

  {
    /* ------------------ TABLE ROW ------------------ */
  }
  function Row(props: { row: ReturnType<typeof createData> }) {
    const { row } = props;
    const [open, setOpen] = React.useState(false);

    return (
      <React.Fragment>
        <TableRow sx={{ '& > *': { borderBottom: 'unset' } }}>
          <TableCell>
            <IconButton aria-label="expand row" size="small" onClick={() => setOpen(!open)}>
              {open ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />}
            </IconButton>
          </TableCell>
          <TableCell align="left">{row.code}</TableCell>
          <TableCell align="left">{row.member?.full_name}</TableCell>
          <TableCell align="left">{row.plan?.code}</TableCell>
          <TableCell align="left">{row.claim_request?.service?.name}</TableCell>
          <TableCell align="left">
            ({row.diagnoses[0]?.icd?.code}) {row.diagnoses[0]?.icd?.name}
          </TableCell>
          <TableCell align="left">{fCurrency(row.total_claim)}</TableCell>
          <TableCell align="center">
            {row.status == 'draft' && (<Chip label='Draft' color="default" variant="outlined" />)}
            {row.status == 'requested' && (<Chip label='Requested' color="primary" />)}
            {row.status == 'received' && (<Chip label='Received' color="success" variant='outlined' />)}
            {row.status == 'approved' && (<Chip label='Approved' color="success" />)}
            {row.status == 'postpone' && (<Chip label='Postpone' color="primary" variant="outlined" />)}
            {row.status == 'paid' && (<Chip label='Paid' color="warning" />)}
            {row.status == 'declined' && (<Chip label='Declined' color="error" />)}
          </TableCell>

          <TableCell align="right">
            {['approved', 'paid'].includes(row.status) && (
            <Iconify icon="eva:eye-fill" onClick={(e) => {
                navigate('/claims/' + row.id);
              }}></Iconify>
            )}
            {!['approved', 'paid'].includes(row.status) && (
            <Iconify icon="eva:edit-outline" onClick={(e) => {
                navigate('/claims/' + row.id);
              }}></Iconify>
            )}
          </TableCell>
        </TableRow>
        {/* COLLAPSIBLE ROW */}
        <TableRow>
          <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={99}>
            <Collapse in={open} timeout="auto" unmountOnExit>
              {/* <Box sx={{ borderBottom: 1 }}>
                <Typography variant="body2" gutterBottom component="div">
                  Description : {row.description}
                </Typography>
              </Box> */}
            </Collapse>
          </TableCell>
        </TableRow>
      </React.Fragment>
    );
  }
  {
    /* ------------------ END TABLE ROW ------------------ */
  }

  function TableContent() {
    return (
      <Table aria-label="collapsible table">
        {/* ------------------ TABLE HEADER ------------------ */}
        <TableBody>
          <TableRow>
            <TableCell style={headStyle} align="left" />
            <TableCell style={headStyle} align="left">
              Code
            </TableCell>
            <TableCell style={headStyle} align="left">
              Member Name
            </TableCell>
            <TableCell style={headStyle} align="left">
              Plan
            </TableCell>
            <TableCell style={headStyle} align="left">
              Benefit
            </TableCell>
            <TableCell style={headStyle} align="left">
              Diagnosis
            </TableCell>
            <TableCell style={headStyle} align="left">
              Total Claim
            </TableCell>
            <TableCell style={headStyle} align="left">
              Status
            </TableCell>
            <TableCell style={headStyle} align="right">
              Action
            </TableCell>
          </TableRow>
        </TableBody>
        {/* ------------------ END TABLE HEADER ------------------ */}

        {/* ------------------ TABLE ROW ------------------ */}
        {dataTableIsLoading ? (
          <TableBody>
            <TableRow>
              <TableCell colSpan={8} align="center">
                Loading
              </TableCell>
            </TableRow>
          </TableBody>
        ) : dataTableData.data.length === 0 ? (
          <TableBody>
            <TableRow>
              <TableCell colSpan={8} align="center">
                No Data
              </TableCell>
            </TableRow>
          </TableBody>
        ) : (
          <TableBody>
            {dataTableData.data.map((row) => (
              <Row key={row.id} row={row} />
            ))}
          </TableBody>
        )}
        {/* ------------------ END TABLE ROW ------------------ */}
      </Table>
    );
  }

  return (
    <Card>
      <ImportForm />

      <DataTable
        isLoading={dataTableIsLoading}
        lastRequest={0}
        data={dataTableData}
        handlePageChange={handlePageChange}
        TableContent={<TableContent />}
      />
    </Card>
  );
}
