import {
    Grid,
    Typography,
    Stack,
    Button,
    Dialog, DialogTitle, DialogContent, DialogActions,
} from '@mui/material';
import * as UrlUtils from "utils/ApiPathConst";
import * as React from "react";
import * as HttpUtils from "utils/HttpUtils";

import Loadable from 'components/Loadable';
const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent')));
const HolidayTable = Loadable(React.lazy(() => import('pages/Holiday/DataGrid')));
import titleBackgroundImg from 'assets/images/dashboard/gazette-bar.png';
import MainCard from 'components/MainCard';
const SearchForm = Loadable(React.lazy(() => import('./SearchForm')));

const BackgroundHead = {
    backgroundImage: `url(${titleBackgroundImg})`,
    width: '100%',
    height: '100%',
    backgroundSize: 'contain',
    backgroundRepeat: 'no-repeat',
    backgroundColor: '#0C489E',
    backgroundPosition: 'right'
};

import { PNSPS_LONG_BUTTON_THEME } from "themes/buttonConst";
import { ThemeProvider } from "@emotion/react";
import { dateStr_Year } from "utils/DateUtils";
import { notifySaveSuccess } from 'utils/CommonFunction';
import { isGrantedAny } from "auth/utils";

// ==============================|| DASHBOARD - DEFAULT ||============================== //

const Index = () => {

    const [record, setRecord] = React.useState([]);
    const [comboData, setComboData] = React.useState([]);
    const [onReady, setOnReady] = React.useState(false);
    const [onSearchReady, setOnSearchReady] = React.useState(false);
    const [onGridReady, setGridOnReady] = React.useState(false);

    const [searchCriteria, setSearchCriteria] = React.useState({
        year: dateStr_Year(new Date()),
    });
    const [attachments, setAttachments] = React.useState([]);
    const [waitImport, setWaitImport] = React.useState(false);
    const [waitDownload, setWaitDownload] = React.useState(false);
    const [isWarningPopUp, setIsWarningPopUp] = React.useState(false);
    const [warningText, setWarningText] = React.useState("");

    React.useEffect(() => {
        setOnSearchReady(false);
        loadForm();
    }, [searchCriteria]);

    function loadForm() {
        HttpUtils.get({
            url: UrlUtils.GET_HOLIDAY,
            params: searchCriteria,
            onSuccess: (responseData) => {
                setRecord(responseData);
                if (comboData.length === 0) {
                    loadCombo();
                } else {
                    setOnSearchReady(true);
                }
            }
        });
    }

    function loadCombo() {
        HttpUtils.get({
            url: UrlUtils.GET_HOLIDAY_COMBO,
            onSuccess: (responseData) => {
                let combo = responseData;
                setComboData(combo);
                setOnReady(true);
                setOnSearchReady(true);
            }
        });
    }

    function applySearch(input) {
        setGridOnReady(true);
        setSearchCriteria(input);
    }

    function applyGridOnReady(input) {
        setGridOnReady(input);
    }

    React.useEffect(() => {
        if (attachments.length > 0) {
            importHoliday();
        }
    }, [attachments]);

    const readFile = (event) => {
        let file = event.target.files && event.target.files[0];
        if (file) {
            if (!file.name.toLowerCase().endsWith(".xlsx")) {
                setWarningText("Please upload a valid file (File format: .xlsx).");
                setIsWarningPopUp(true);
                // clear the input value
                event.target.value = "";
                return;
            }
            file['id'] = attachments.length;
            setAttachments(prev => [...prev, file]);
            // clear the input value
            event.target.value = "";
        }
    };

    const doExport = () => {
        setWaitDownload(true);
        HttpUtils.fileDownload({
            url: UrlUtils.GET_HOLIDAY_TEMPLATE,
            onResponse: () => {
                setTimeout(() => setWaitDownload(false), 500);
            }
        });
    };

    const importHoliday = () => {
        setWaitImport(true);
        setOnSearchReady(false);
        if (!attachments || attachments.length <= 0) {
            setWarningText("Please upload file.");
            setWaitImport(false);
            return;
        }
        HttpUtils.postWithFiles({
            url: UrlUtils.POST_HOLIDAY,
            files: attachments,
            onSuccess: () => {
                notifySaveSuccess();
                setWaitImport(false);
                setAttachments([]);
                loadForm();
            }
        });
    };

    return (
        !onReady ?
            <Grid container sx={{ minHeight: '87vh', mb: 3 }} direction="column" justifyContent="center" alignItems="center">
                <Grid item>
                    <LoadingComponent />
                </Grid>
            </Grid>
            :
            (
                <Grid container sx={{ minHeight: '87vh', backgroundColor: 'backgroundColor.default' }} direction="column" justifyContent="flex-start" alignItems="center" >
                    <Grid item xs={12} width="100%">
                        <div style={BackgroundHead} width="100%">
                            <Stack direction="row" height='70px'>
                                <Typography ml={15} color='#FFF' variant="h4" sx={{ pt: 2 }}>Holiday Setting</Typography>
                            </Stack>
                        </div>
                    </Grid>

                    <Grid item xs={12} md={12} lg={6} width="100%">
                        <Stack direction="row" justifyContent="flex-start" alignItems="center" spacing={2} sx={{ ml: 2, mt: 1 }} >

                            <ThemeProvider theme={PNSPS_LONG_BUTTON_THEME}>
                                <Button
                                    variant="contained"
                                    size="large"
                                    disabled={waitDownload}
                                    onClick={doExport}
                                    aria-label="Export holiday template"
                                >
                                    <Typography variant="h5">Export</Typography>
                                </Button>
                            </ThemeProvider>
                            {isGrantedAny(["MAINTAIN_GAZETTE_ISSUE"]) ?
                                <ThemeProvider theme={PNSPS_LONG_BUTTON_THEME}>
                                    <Button
                                        component="label"
                                        variant="contained"
                                        size="large"
                                        disabled={waitImport}
                                    >
                                        <Typography variant="h5">Upload Files</Typography>
                                        <input
                                        id="uploadFileBtn"
                                        name="file"
                                        type="file"
                                        accept=".xlsx"
                                        hidden
                                        disabled={waitImport}
                                        onChange={readFile}
                                        aria-label="Upload Excel file (.xlsx)"
                                        />
                                    </Button>
                                </ThemeProvider>
                                : null
                            }
                        </Stack>
                    </Grid>

                    {/* row 1 */}
                    <Grid item xs={12} md={12} lg={12} width="100%">
                        <SearchForm
                            applySearch={applySearch}
                            searchCriteria={searchCriteria}
                            comboData={comboData}
                            onGridReady={onGridReady}
                        />
                    </Grid>

                    {/* row 2 */}
                    {!onSearchReady ?
                        <LoadingComponent /> :
                        <Grid item xs={12} md={12} lg={12} width="100%">
                            <MainCard elevation={0} border={false} content={false}>
                                <HolidayTable
                                    recordList={record}
                                    applyGridOnReady={applyGridOnReady}
                                />
                            </MainCard>
                        </Grid>
                    }

                    <Dialog
                        open={isWarningPopUp}
                        onClose={() => setIsWarningPopUp(false)}
                        PaperProps={{
                            sx: {
                                minWidth: '40vw',
                                maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' },
                                maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' }
                            }
                        }}
                    >
                        <DialogTitle><Typography variant="h3">Warning</Typography></DialogTitle>
                        <DialogContent style={{ display: 'flex' }}>
                            <Typography variant="h4" style={{ padding: '16px' }}>{warningText}</Typography>
                        </DialogContent>
                        <DialogActions>
                            <Button onClick={() => setIsWarningPopUp(false)}><Typography variant="h5">OK</Typography></Button>
                        </DialogActions>
                    </Dialog>
                </Grid >
            )
    );
};

export default Index;
