import {UPDATE_USER_MANAGEMENT} from "@/core/data/apiRoutes";
import useNotification from "@/lib/app/hooks/useNotification";
import useRequest from "@/lib/app/hooks/useRequest";
import {
    Button,
    DialogActions,
    DialogContent,
    FormControl,
    FormHelperText,
    InputLabel,
    MenuItem,
    Select,
    Stack,
    TextField
} from "@mui/material"
import {useFormik} from "formik";
import {useTranslations} from "next-intl";
import * as Yup from "yup";

const UpdateContent = ({row, mutate, setOpenConfirmDialog}) => {
    const t = useTranslations();
    const requestServer = useRequest({auth: true})
    const {update_notification} = useNotification()

    const validationSchema = Yup.object().shape({
        phone_number: Yup.mixed().test("is-number", `${t("AddDialog.phone_number_number")}`, (value) => !isNaN(value)).test("positive", `${t("AddDialog.phone_number_positive")}`, (value) => value >= 0)
            .test("max", `${t("AddDialog.phone_number_max")}`, (value) => value.length == 11)
            .required(t("AddDialog.phone_number_error")),
        national_id: Yup.mixed().test("is-number", `${t("AddDialog.national_id_number")}`, (value) => !isNaN(value)).test("positive", `${t("AddDialog.national_id_positive")}`, (value) => value >= 0)
            .test("max", `${t("AddDialog.national_id_max")}`, (value) => value.length <= 10)
            .required(t("AddDialog.national_id_error")),
        type_id: Yup.number().required(t("AddDialog.type_id_error")),
        navgan_id: Yup.number().when('type_id', {
            is: 1, // Condition: Check if type_id is equal to 1
            then: (schema) => schema.required(t("AddDialog.navgan_id_error")),
            otherwise: (schema) => schema, // No validation for navgan_id when type_id is not 1
        })
    });

    const formik = useFormik({
        initialValues: {
            phone_number: row.getValue("phone_number"),
            national_id: row.getValue("national_id"),
            type_id: row.original.type_id,
            navgan_id: row.original.type_id === 1 ? row.getValue("navgan_id") : '',
        }, validationSchema, onSubmit: (values, {setSubmitting}) => {
            const formData = new FormData();
            formData.append("phone_number", values.phone_number);
            formData.append("national_id", values.national_id);
            formData.append("type_id", values.type_id);
            if (formik.values.type_id === 1) formData.append("navgan_id", values.navgan_id);
            requestServer(`${UPDATE_USER_MANAGEMENT}/${row.getValue("id")}`, 'post', {
                data: formData,
            }).then((response) => {
                setOpenConfirmDialog(false)
                mutate()
                update_notification()
            }).catch(() => {
            }).finally(() => {
                setSubmitting(false);
            });
        },
    });
    return (
        <>
            <DialogContent>
                <Stack spacing={2}>
                    <Stack>
                        <TextField
                            name="phone_number"
                            rows={8}
                            label={t("UpdateDialog.phone_number")}
                            value={formik.values.phone_number}
                            onChange={(event) => {
                                if (event.target.value.length <= 11) return formik.handleChange(event)
                            }}
                            fullWidth
                            variant="outlined"
                            onBlur={formik.handleBlur("phone_number")}
                            error={formik.touched.phone_number && Boolean(formik.errors.phone_number)}
                            helperText={formik.touched.phone_number && formik.errors.phone_number}
                            sx={{mt: 1}}
                        />
                    </Stack>
                    <Stack>
                        <TextField
                            name="national_id"
                            rows={8}
                            label={t("UpdateDialog.national_id")}
                            value={formik.values.national_id}
                            onChange={(event) => {
                                if (event.target.value.length <= 10) return formik.handleChange(event)
                            }}
                            fullWidth
                            variant="outlined"
                            onBlur={formik.handleBlur("national_id")}
                            error={formik.touched.national_id && Boolean(formik.errors.national_id)}
                            helperText={formik.touched.national_id && formik.errors.national_id}
                            sx={{mt: 1}}
                        />
                    </Stack>
                    <Stack>
                        <FormControl
                            error={formik.touched.type_id && Boolean(formik.errors.type_id)}
                        >
                            <InputLabel>{t("UpdateDialog.type_id")}</InputLabel>
                            <Select
                                name="type_id"
                                label={t("UpdateDialog.type_id")}
                                value={formik.values.type_id}
                                onChange={formik.handleChange}
                                onBlur={formik.handleBlur}
                                fullWidth
                                variant="outlined"
                                sx={{mt: 1}}
                            >
                                <MenuItem value={1}>
                                    {t("UpdateDialog.navgan")}
                                </MenuItem>
                                <MenuItem value={2}>
                                    {t("UpdateDialog.refahi")}
                                </MenuItem>
                            </Select>
                            <FormHelperText>
                                {formik.touched.type_id && formik.errors.type_id}
                            </FormHelperText>
                        </FormControl>
                    </Stack>
                    <Stack>
                        {formik.values.type_id === 1 ? (<TextField
                            name="navgan_id"
                            rows={8}
                            label={t("UpdateDialog.navgan_id")}
                            value={formik.values.navgan_id}
                            onChange={formik.handleChange}
                            fullWidth
                            variant="outlined"
                            onBlur={formik.handleBlur("navgan_id")}
                            error={formik.touched.navgan_id && Boolean(formik.errors.navgan_id)}
                            helperText={formik.touched.navgan_id && formik.errors.navgan_id}
                            sx={{mt: 1}}
                        />) : null}
                    </Stack>
                </Stack>
            </DialogContent>
            <DialogActions>
                <Button onClick={() => setOpenConfirmDialog(false)} variant="outlined" color="secondary"
                        disabled={formik.isSubmitting} autoFocus>
                    {t("UpdateDialog.button-cancel")}
                </Button>
                <Button onClick={formik.handleSubmit} variant="contained" color="primary"
                        disabled={formik.isSubmitting || !formik.dirty || !formik.isValid}>
                    {t("UpdateDialog.button-update")}
                </Button>
            </DialogActions>
        </>
    )
}
export default UpdateContent