"use client";

import Check from "@mui/icons-material/Check";
import Close from "@mui/icons-material/Close";
import Button from "@mui/material/Button";
import Stack from "@mui/material/Stack";
import { useRouter } from "next/navigation";
import React, { useCallback, useState } from "react";
import { useTranslation } from "react-i18next";
import ClaimFormInfo from "./ClaimFormInfo";
import { ProjectCombo } from "@/app/api/claims";
import { Typography } from "@mui/material";
import { FormProvider, SubmitErrorHandler, SubmitHandler, useForm } from "react-hook-form";
import { ClaimInputFormByStaff, saveClaim } from "@/app/api/claims/actions";
import { DoneAll } from "@mui/icons-material";
import { expenseTypeCombo } from "@/app/utils/comboUtil";
import { convertDateToString } from "@/app/utils/formatUtil";
import { errorDialog, submitDialog, successDialog, warningDialog } from "../Swal/CustomAlerts";

export interface Props {
    projectCombo: ProjectCombo[]
}

const ClaimSave: React.FC<Props> = ({ projectCombo }) => {
    const { t } = useTranslation("common");
    const [serverError, setServerError] = useState("");
    const router = useRouter();

    const formProps = useForm<ClaimInputFormByStaff>({
        defaultValues: {
            id: null,
            expenseType: expenseTypeCombo[0],
            addClaimDetails: []
        },
    });

    const handleCancel = () => {
        router.back();
    };

    const onSubmit = useCallback<SubmitHandler<ClaimInputFormByStaff>>(
        async (data, event) => {
            try {
                if (data.isGridEditing) {
                    warningDialog(t("Please save all the rows before submitting"), t)
                    return false
                }

                let haveError = false
                if (data.addClaimDetails.length === 0 || data.addClaimDetails.filter(row => String(row.description).trim().length === 0 || String(row.amount).trim().length === 0 || row.project === null || row.project === undefined || ((row.oldSupportingDocument === null || row.oldSupportingDocument === undefined) && (row.newSupportingDocument === null || row.newSupportingDocument === undefined))).length > 0) {
                    haveError = true
                    formProps.setError("addClaimDetails", { message: "Claim details include empty fields", type: "required" })
                }

                if (data.addClaimDetails.length > 0 && data.addClaimDetails.filter(row => row.invoiceDate.getTime() > new Date().getTime()).length > 0) {
                    haveError = true
                    formProps.setError("addClaimDetails", { message: "Claim details include invalid invoice date", type: "invalid_date" })
                }

                if (data.addClaimDetails.length > 0 && data.addClaimDetails.filter(row => row.project === null || row.project === undefined).length > 0) {
                    haveError = true
                    formProps.setError("addClaimDetails", { message: "Claim details include empty project", type: "invalid_project" })
                }
                
                if (data.addClaimDetails.length > 0 && data.addClaimDetails.filter(row => row.amount <= 0).length > 0) {
                    haveError = true
                    formProps.setError("addClaimDetails", { message: "Claim details include invalid amount", type: "invalid_amount" })
                }

                if (haveError) {
                    return false
                }

                const buttonName = (event?.nativeEvent as any).submitter.name
                const formData = new FormData()
                formData.append("expenseType", data.expenseType)
                data.addClaimDetails.forEach((ClaimSave) => {
                    console.log(ClaimSave)
                    formData.append("addClaimDetailIds", JSON.stringify(ClaimSave.id))
                    formData.append("addClaimDetailInvoiceDates", convertDateToString(ClaimSave.invoiceDate, "YYYY-MM-DD"))
                    formData.append("addClaimDetailProjectIds", JSON.stringify(ClaimSave.project))
                    formData.append("addClaimDetailDescriptions", ClaimSave.description)
                    formData.append("addClaimDetailAmounts", JSON.stringify(ClaimSave.amount))
                    formData.append("addClaimDetailNewSupportingDocuments", ClaimSave.newSupportingDocument)
                    formData.append("addClaimDetailOldSupportingDocumentIds", JSON.stringify(ClaimSave?.oldSupportingDocument?.id ?? -1))
                })
                // for (let i = 0; i < data.addClaimDetails.length; i++) {
                //     const updatedData = {
                //         id: data.addClaimDetails[i].id,
                //         // project: data.addClaimDetails[i].project,
                //         invoiceDate: convertDateToString(data.addClaimDetails[i].invoiceDate, "YYYY-MM-DD"),
                //         description: data.addClaimDetails[i].description,
                //         amount:data.addClaimDetails[i].amount,
                //         // oldSupportingDocument: data.addClaimDetails[i].oldSupportingDocument,
                //     }
                //     formData.append("addClaimDetails", JSON.stringify(updatedData))
                //     formData.append("addClaimDetailsFiles", data.addClaimDetails[i].newSupportingDocument)
                //     formData.append("testFiles", data.addClaimDetails[i].newSupportingDocument)
                // }
                if (buttonName === "submit") {
                    formData.append("status", "Waiting for Approval")
                } else if (buttonName === "save") {
                    formData.append("status", "Not Submitted")
                }
                formData.append("id", "-1")

                setServerError("");

                submitDialog(async () => {
                    const response = await saveClaim(formData);

                    if (response.message === "Success") {
                        successDialog(t("Submit Success"), t).then(() => {
                            router.replace("/staffReimbursement");
                        })
                    }
                }, t)
            } catch (e) {
                setServerError(t("An error has occurred. Please try again later."));
            }
        },
        [router, t],
    );

    const onSubmitError = useCallback<SubmitErrorHandler<ClaimInputFormByStaff>>(
        (errors) => {
            // Set the tab so that the focus will go there
            console.log(errors)
        },
        [],
    );

    return (
        <FormProvider {...formProps}>
            <Stack spacing={2} component={"form"} onSubmit={formProps.handleSubmit(onSubmit, onSubmitError)}>
                <ClaimFormInfo projectCombo={projectCombo} />
                {serverError && (
                    <Typography variant="body2" color="error" alignSelf="flex-end">
                        {serverError}
                    </Typography>
                )}
                <Stack direction="row" justifyContent="flex-end" gap={1}>
                    <Button variant="text" startIcon={<Close />} onClick={handleCancel}>
                        {t("Cancel")}
                    </Button>
                    <Button variant="outlined" name="save" startIcon={<Check />} type="submit" disabled={Boolean(formProps.watch("isGridEditing"))}>
                        {t("Save")}
                    </Button>
                    <Button variant="contained" name="submit" startIcon={<DoneAll />} type="submit" disabled={Boolean(formProps.watch("isGridEditing"))}>
                        {t("Submit")}
                    </Button>
                </Stack>
            </Stack>
        </FormProvider>
    );
};

export default ClaimSave;
