import * as React from 'react';
import { DataGrid } from '@mui/x-data-grid';
import { GridColDef } from '@mui/x-data-grid';
import TextField from '@mui/material/TextField';
import { Button, CardContent, IconButton, Typography } from '@mui/material';
import CurrencyTextField from '@lupus-ai/mui-currency-textfield';
import { DateField } from '@mui/x-date-pickers/DateField';
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import X from '@mui/icons-material/X';
import { Close, Upload } from '@mui/icons-material';
import Tooltip from '@mui/material/Tooltip';
import dayjs from 'dayjs';
import { useRouter } from 'next/router';
import { ClipboardCheck, OpenInNew } from 'mdi-material-ui';
import Chip from '@mui/material/Chip';

import {Check, Refresh } from '@mui/icons-material';
import PriceCheckIcon from '@mui/icons-material/PriceCheck';
import AssignmentTurnedInIcon from '@mui/icons-material/AssignmentTurnedIn';
import AssignmentLateIcon from '@mui/icons-material/AssignmentLate';
import { Card, CardHeader } from '@mui/material';
import { Dialog, DialogActions, DialogContent, DialogTitle, Grid, Stack } from '@mui/material';
import RequestReferences from '../../../components/requestReferences';

export default function ServerPaginationGrid() {
  const router = useRouter();
  const columns = [
    { field: 'id', headerName: 'ID', flex: 0.1},
    { field: 'status', headerName: 'Status', flex: 0.15,
      renderCell: (params) => {
        if(params.row.completed){
            return <Chip icon={<Check />} label="Completed" variant="filled" color="success" />
        }
        else if(params.row.paid){
            return <Chip icon={<PriceCheckIcon />} label="Paid" variant="filled" color="success" />
        }
        else if(params.row.accepted && params.row.paid==false){
            return <Chip icon={<PriceCheckIcon />} label="Pending Payment" variant="filled" color="warning" />
        }
        else if(params.row.accepted && params.row.paid){
            return <Chip icon={<AssignmentTurnedInIcon />} label="Accepted" variant="filled" color="info" />
        }
        else if(params.row.declined){
            return <Chip icon={<AssignmentLateIcon />} label="Declined" variant="filled" color="error" />
        }
        else{
            return <Chip icon={<Refresh />} label="Pending" variant="filled" color="secondary" />
        }
      }
  },
    { field: 'message', headerName: 'Message', flex: 0.5,
      renderCell: (params) => {
          return <TextField size="small" fullWidth value={params.row.message} disabled />;
      }},
    { field: 'amount', headerName: 'Amount', flex: 0.1, renderCell: (params) => {
      return <CurrencyTextField size="small" fullWidth value={params.row.amount} currencySymbol="$" disabled />;
    }},
    { field: 'requestDate', headerName: 'Request Date', flex:0.15, 
      renderCell: (params) =>{

          let formattedTime = ""
          const date = new Date(params.row.requestDate);  
          formattedTime = date.toLocaleTimeString('en-US', { month: 'long', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); // Example format  
          return <DateField
          size='small'
          disabled
          defaultValue={dayjs(params.row.requestDate)}
          format="LL"
        />
      } },
      { field: 'action', headerName: '', flex:0.15, 
        renderCell: (params) =>{

            const acceptRequest = async () => {
              let response = await fetch('/api/artist/requests/'+params.row["id"]+"/accept", { method: 'PUT' })
              if(response.status === 200){
                router.reload()
              }
              else{
                alert("Error accepting request.")
              }
            }

            const viewRequest = async () => {

            }

            const denyRequest = async () => {
              let response = await fetch('/api/artist/requests/'+params.row["id"]+"/deny", { method: 'PUT' })
              if(response.status === 200){
                router.reload()
              }
              else{
                alert("Error accepting request.")
              }
            }

            const completeRequest = async () => {
              let response = await fetch('/api/artist/requests/'+params.row["id"]+"/complete", { method: 'PUT' })
              if(response.status === 200){
                router.reload()
              }
              else{
                alert("Error accepting request.")
              }
            }

            const [open, setOpen] = React.useState(false);
              
            const handleClickOpen = () => {
              setOpen(true);
            };
          
            const handleClose = () => {
              setOpen(false);
            };

            let formattedTime = ""
            const date = new Date(params.row.requestDate);  
            formattedTime = date.toLocaleTimeString('en-US', { month: 'long', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); // Example format  

            return (<>
              <Dialog
                fullWidth={true}
                maxWidth={"lg"}
                open={open}
                onClose={handleClose}
              >
                <DialogTitle>Request submitted on {formattedTime ?? ''}</DialogTitle>
                <DialogContent>
                  <Grid container spacing={3} sx={{paddingTop:"1%"}}>
                      <Grid item xs={12} md={6}>
                          <Grid container spacing={3}>
                              <Grid item xs={12} md={12}>
                                  <TextField
                                      multiline={true}
                                      rows={10}
                                      fullWidth
                                      label="Request Message"
                                      value={params.row.message}
                                      disabled
                                  />
                              </Grid>
                              <Grid item xs={12} md={12}>
                                <Card>
                                  <CardContent>
                                    <Grid container>
                                      <Grid item xs={12} md={12}>
                                        <Typography variant="h6" align="center">Reference Images</Typography>
                                      </Grid>
                                      <Grid item xs={12} md={12}>
                                        <RequestReferences id={params.row.id} />
                                      </Grid>
                                    </Grid>
                                  </CardContent>
                                </Card>
                              </Grid>
                          </Grid>
                      </Grid>
                      <Grid item xs={12} md={6}>
                          <Grid container spacing={3}>
                              <Grid item xs={12} md={12}>
                                  <Tooltip arrow title="Decline this request.">
                                    <IconButton onClick={denyRequest} disabled={params.row.declined || params.row.accepted} color="error"><Close/></IconButton>
                                  </Tooltip>
                                  <Tooltip arrow title="Accept this request.">
                                    <IconButton onClick={acceptRequest} disabled={params.row.declined || params.row.accepted} color="success"><Check/></IconButton>
                                  </Tooltip>
                                  <Tooltip arrow title="Upload asset image for customer.">
                                    <IconButton disabled={!params.row.paid} color="primary"><Upload/></IconButton>
                                  </Tooltip>
                                  <Tooltip arrow title="Complete this request.">
                                    <IconButton disabled={!params.row.paid || params.row.completed} color="success"><AssignmentTurnedInIcon/></IconButton>
                                  </Tooltip>
                                  {(!params.row.declined && !params.row.accepted && !params.row.paid && !params.row.completed ? (
                                  <Chip icon={<Refresh />} label="Pending" variant="filled" color="secondary" />
                                ):null)}
                                {(params.row.declined ? (
                                  <Chip icon={<AssignmentLateIcon />} label="Declined" variant="filled" color="error" />
                                ):null)}
                                {(params.row.accepted ? (
                                  <Chip icon={<AssignmentTurnedInIcon />} label="Accepted" variant="filled" color="info" />
                                ):null)}
                                {(params.row.paid ? (
                                  <Chip  icon={<PriceCheckIcon />} label="Paid" variant="filled" color="success" />
                                ):null)}
                                {(params.row.paid==false && params.row.accepted ? (
                                   <Chip icon={<PriceCheckIcon />} label="Pending Payment" variant="filled" color="warning" />
                                ):null)}
                                {(params.row.completed ? (
                                  <Chip disabled={!params.row.completed} icon={<Check />} label="Completed" variant="filled" color="success" />
                                ):null)}
                              </Grid>
                              <Grid item xs={12} md={12}>
                                <Card>
                                  <CardContent>
                                    <Grid container>
                                      <Grid item xs={12} md={12}>
                                      </Grid>
                                      <Grid item xs={12} md={12}>
                                      </Grid>
                                    </Grid>
                                  </CardContent>
                                </Card>
                              </Grid>
                          </Grid>
                      </Grid>
                  </Grid>
                </DialogContent>
                <DialogActions>
                  <Button onClick={handleClose}>Close</Button>
                </DialogActions>
              </Dialog>
              <Tooltip arrow title="View more details."><IconButton onClick={viewRequest}  aria-label="accept" color="primary" onClick={handleClickOpen}><OpenInNew/></IconButton></Tooltip>
              {((params.row.accepted==false && params.row.declined==false && params.row.completed==false) ? (
                  <>
                  <Tooltip arrow title="Accept this request.">
                  <IconButton onClick={acceptRequest}  aria-label="accept" color="success"><Check/></IconButton>
                </Tooltip>
                  <Tooltip arrow title="Deny this request.">
                    <IconButton  onClick={denyRequest} aria-label="deny" sx={{marginLeft:"2px"}} color="error"><Close/></IconButton>
                  </Tooltip>
                  </>
              ): null
              )}
              {((params.row.accepted==true && params.row.declined==false && params.row.completed==false && params.row.paid==true) ? (
                  <>
                  <Tooltip arrow title="Complete this request.">
                    <IconButton onClick={completeRequest}  aria-label="complete" color="success"><ClipboardCheck/></IconButton>
                  </Tooltip>
                  </>
              ): null
              )}
          </>
          )
        } }
  ];
  const [isLoading, setIsLoading] = React.useState(true);
  const [requestCount, setRequestCount] = React.useState(null);  
  const [requestData, setRequestData] = React.useState({});  
  const [paginationModel, setPaginationModel] = React.useState({
    page: 0,
    pageSize: 15,
  });


  const handlePageChange = async (params) => {
    setPaginationModel(params);
  }

  const getRequests = async () => {
    setIsLoading(true);
    const response = await fetch('/api/artist/requests', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            completed: true, // Example query parameter
            declined: true, // Example query parameter
            accepted: true, // Example query parameter
            paid: true, // Example query parameter
            offset: paginationModel.page*paginationModel.pageSize, // Example query parameter
            pageSize: paginationModel.pageSize
        }),
    });
    const data = await response.json();
    setRequestData(data);
    setIsLoading(false);
  }
  const getRequestsCount = async () => {
    const response = await fetch('/api/artist/requestcount', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            completed: true, // Example query parameter
            declined: true, // Example query parameter
            accepted: true, // Example query parameter
            paid: true, // Example query parameter
            offset: paginationModel.page*paginationModel.pageSize, // Example query parameter
            pageSize: paginationModel.pageSize
        })
    });
    const data = await response.json();
    setRequestCount(data);
    setRowCountState((prevRowCountState) =>
      data !== undefined
        ? data
        : prevRowCountState,
    );
    return data;
  } 

  // Some API clients return undefined while loading
  // Following lines are here to prevent `rowCountState` from being undefined during the loading
  const [rowCountState, setRowCountState] = React.useState(0);
  React.useEffect(() => {
     getRequestsCount();
     getRequests();
  }, [requestCount, setRowCountState,paginationModel]);

  return (
    <div style={{ height: '100%', width: '100%' }}>

    <LocalizationProvider dateAdapter={AdapterDayjs}>
      <DataGrid
        rows={requestData}
        columns={columns}
        rowCount={rowCountState}
        loading={isLoading}
        pageSizeOptions={[15]}
        paginationModel={paginationModel}
        paginationMode="server"
        onPaginationModelChange={handlePageChange}
      />
        </LocalizationProvider>
    </div>
  );
}