import { useContext, useEffect, useState } from "react";
import { AppContext } from "../../../../contexts/AppContext";
import { useDispatch } from "react-redux";
import { useFormik } from "formik";
import { Yup } from "../../../../lib/yup/yup";
import { Grid } from "../../../../components/grid/Grid";
import { Autocomplete, IconButton, TextField, Typography } from "@mui/material";
import { SPACING } from "../../../../data/spacing";
import SearchIcon from "@mui/icons-material/Search";
import { extractProvinceFromAddress } from "../../../../utils/address";
import { getCarcassesBuyerInfoService } from "../../../steward/services/get-carcasses-buyer-info";
import {
  slaughterEditBuyerDataService,
  slaughterSubmitBuyerDataService,
} from "../../../slaughter-house/services/slaughter-house-submit-buyer";
export const validationSchemaForAdminAddBuyer = (isEdit, isRealPerson) =>
  Yup.object({
    mobile: Yup.string()
      .required("این فیلد اجباری است!")
      .min(11, "شماره موبایل باید 11 رقم باشد")
      .max(11, "شماره موبایل باید 11 رقم باشد")
      .matches(/^09\d{9}$/, "شماره موبایل باید با 09 شروع شود و 11 رقم باشد"),
    firstName: Yup.string()
      .required("این فیلد اجباری است!")
      .typeError("لطفا فیلد را به درستی وارد کنید!"),
    lastName: Yup.string()
      .required("این فیلد اجباری است!")
      .typeError("لطفا فیلد را به درستی وارد کنید!"),
    unit_name: Yup.string()
      .required("این فیلد اجباری است!")
      .typeError("لطفا فیلد را به درستی وارد کنید!"),
    province: Yup.string()
      .required("این فیلد اجباری است!")
      .typeError("لطفا فیلد را به درستی وارد کنید!"),
    city: Yup.string()
      .required("این فیلد اجباری است!")
      .typeError("لطفا فیلد را به درستی وارد کنید!"),
    nationalId:
      !isRealPerson && isEdit
        ? Yup.string().nullable()
        : Yup.string()
            .required("این فیلد اجباری است!")
            .matches(/^\d{10,11}$/, "شناسه باید 10 یا 11 رقم و فقط عدد باشد"),
  }).test(
    "at-least-one-key",
    "حداقل یک کشتارگاه یا مباشر باید انتخاب شود",
    (value) =>
      value?.steward_keys?.length > 0 || value?.kill_house_keys?.length > 0
  );

export const handleSubmitForAdminAddBuyer = (
  formik,
  dispatch,
  isEdit,
  tableData,
  updateTable,
  openNotif,
  DRAWER,
  isRealPerson,
  buyerType
) => {
  if (isEdit) {
    const submitData = {
      buyer_type: buyerType,
      buyer_key: tableData?.key,
      mobile: formik.values.mobile,
      first_name: formik.values.firstName,
      last_name: formik.values.lastName,
      city: formik.values.city,
      province: formik.values.province,
      national_id: formik.values.nationalId,
      unit_name: formik.values.unit_name,
      steward_keys: formik.values.steward_keys || [],
      kill_house_keys: formik.values.kill_house_keys || [],
    };

    dispatch(slaughterEditBuyerDataService(submitData)).then((r) => {
      updateTable();
      if (r.payload.error) {
        openNotif({
          vertical: "top",
          horizontal: "center",
          msg: r.payload.error,
          severity: "error",
        });
      } else {
        dispatch(DRAWER({ right: false, bottom: false, content: null }));

        openNotif({
          vertical: "top",
          horizontal: "center",
          msg: "عملیات با موفقیت انجام شد.",
          severity: "success",
        });
      }
    });
  } else {
    const submitData = {
      mobile: formik.values.mobile,
      buyer_type: buyerType,
      first_name: formik.values.firstName,
      last_name: formik.values.lastName,
      city: formik.values.city,
      province: formik.values.province,
      unit_name: formik.values.unit_name,
      national_id: !isRealPerson ? null : formik.values.nationalId,
      steward_keys: formik.values.steward_keys || [],
      kill_house_keys: formik.values.kill_house_keys || [],
      ...(!isRealPerson && {
        isRealPerson: false,
        info_value: formik.values.nationalId,
      }),
    };

    // if (IS_STEWARD) {
    //   submitData.name = formik.values.unitName;
    //   delete submitData.unit_name;
    // }
    dispatch(slaughterSubmitBuyerDataService(submitData)).then((r) => {
      updateTable();
      if (r.payload.error) {
        openNotif({
          vertical: "top",
          horizontal: "center",
          msg: r.payload.error,
          severity: "error",
        });
      } else {
        dispatch(DRAWER({ right: false, bottom: false, content: null }));

        openNotif({
          vertical: "top",
          horizontal: "center",
          msg: "عملیات با موفقیت انجام شد.",
          severity: "success",
        });
      }
    });
  }
};

const extractStewardKeysFromInfo = (steward_info) => {
  if (!Array.isArray(steward_info)) return [];
  return steward_info
    .map((item) => item?.Steward?.key ?? item?.key)
    .filter(Boolean);
};

const extractKillHouseKeysFromInfo = (killHouseInfo) => {
  const arr = killHouseInfo ?? [];
  if (!Array.isArray(arr)) return [];
  return arr.map((item) => item?.killHouse?.key).filter(Boolean);
};

export const handleSetFormDataFromTableDataForAdminAddBuyer = (
  item,
  formik
) => {
  const steward_keys =
    item?.steward_keys ??
    extractStewardKeysFromInfo(item?.stewardInfo) ??
    formik.values?.steward_keys ??
    [];
  const kill_house_keys =
    extractKillHouseKeysFromInfo(item?.killHouseInfo) ?? [];

  const formData = {
    mobile: item.mobile || "",
    firstName: item.firstName || "",
    lastName: item.lastName || "",
    province: item.province || "",
    city: item.city || "",
    nationalId: item.nationalId || "",
    unit_name: item?.unitName || "",
    steward_keys,
    kill_house_keys,
  };

  formik.setValues(formData);

  setTimeout(() => {
    formik.validateForm();
  }, 1);
};

export const handleSetFormDataFromUserDataForAdminAddBuyer = (
  userData,
  formik
) => {
  if (userData) {
    const formData = {
      mobile: userData.mobile || "",
      firstName: userData.firstName || "",
      lastName: userData.lastName || "",
      province: userData.province || "",
      city: userData.city || "",
      nationalId: userData.nationalId || "",
      unit_name: userData?.unitName || "",
      steward_keys: formik.values?.steward_keys ?? [],
      kill_house_keys: formik.values?.kill_house_keys ?? [],
    };

    formik.setValues(formData);

    setTimeout(() => {
      formik.validateForm();
    }, 1);
  }
};

export const InquiryForAdminAddBuyer = ({
  notFound,
  setNotFound,
  setUserData,
  formik,
  isEdit,
  isRealPerson,
  provinceData,
}) => {
  const [inquiryInProgress, setInquiryInProgress] = useState(false);

  const [openNotif] = useContext(AppContext);
  const dispatch = useDispatch();

  const formik2 = useFormik({
    initialValues: {
      personType: isRealPerson ? "real" : "legal", // real | legal
      nationalCode: "",
    },
    validationSchema: Yup.object({
      nationalCode:
        isEdit && isRealPerson
          ? Yup.string().nullable()
          : Yup.string()
              .required("این فیلد اجباری است!")
              .when("personType", {
                is: "real",
                then: (schema) =>
                  schema
                    .length(10, "کد ملی باید 10 رقم باشد")
                    .matches(/^\d{10}$/, "کد ملی باید فقط شامل اعداد باشد"),
                otherwise: (schema) =>
                  schema
                    .length(11, "شناسه ملی حقوقی باید 11 رقم باشد")
                    .matches(
                      /^\d{11}$/,
                      "شناسه ملی حقوقی باید فقط شامل اعداد باشد"
                    ),
              }),
    }),
    validateOnMount: isEdit ? false : true,
  });

  const handleInquiry = async () => {
    if (!formik2.isValid || inquiryInProgress) {
      return;
    }

    const nationalCode = formik2.values.nationalCode;
    const personType = formik2.values.personType;
    const type = personType === "legal" ? "unit" : "person";

    setInquiryInProgress(true);
    setNotFound(false);
    setUserData(null);

    try {
      const response = await dispatch(
        getCarcassesBuyerInfoService({ info: nationalCode, type })
      );

      if (response.payload?.error) {
        openNotif({
          vertical: "top",
          horizontal: "center",
          msg: response.payload.error,
          severity: "error",
        });
        return;
      }

      const json = response.payload?.data;
      if (json?.status && json?.data) {
        const d = json.data;
        const extractedProvince = extractProvinceFromAddress(
          d.address || "",
          provinceData
        );
        const aggregatedUserData = {
          mobile: d.mobile || d.mobilenumber || "",
          firstName: d.firstName || d.name || "",
          lastName: d.lastName || d.name || "",
          unitName:
            d.unitName || d.title || d.corporationName || d.unionName || "",
          province: d.province || d.state || extractedProvince || "",
          city: d.city || "",
          nationalId:
            d.nationalId || d.nationalCode || d.nationalcode || nationalCode,
        };
        setUserData(aggregatedUserData);
        handleSetFormDataFromUserDataForAdminAddBuyer(
          aggregatedUserData,
          formik
        );
        formik2.setFieldValue(
          "nationalCode",
          aggregatedUserData.nationalId || nationalCode
        );
        openNotif({
          vertical: "top",
          horizontal: "center",
          msg:
            type === "unit"
              ? "اطلاعات حقوقی با موفقیت دریافت شد."
              : "اطلاعات با موفقیت دریافت شد.",
          severity: "success",
        });
      } else {
        setNotFound(true);
        formik.setFieldValue("nationalId", nationalCode);
        openNotif({
          vertical: "top",
          horizontal: "center",
          msg:
            type === "unit"
              ? "اطلاعات حقوقی برای این شناسه یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید."
              : "اطلاعاتی برای این کد ملی یافت نشد، لطفا اطلاعات را به صورت دستی ثبت کنید.",
          severity: "warning",
        });
      }
    } finally {
      setInquiryInProgress(false);
    }
  };

  useEffect(() => {
    if (notFound) {
      formik.setFieldValue("mobile", formik2.values.mobile);
    }
  }, [notFound]);

  return (
    <Grid container xs={12}>
      <Typography mt={2}>
        {"استعلام "}
        {!isRealPerson ? "شناسه ملی حقوقی" : "کد ملی"}
      </Typography>
      <Grid mt={SPACING.SMALL} display="flex" width={1}>
        <TextField
          fullWidth
          id="nationalCode"
          name="nationalCode"
          label={!isRealPerson ? "شناسه ملی حقوقی" : "کد ملی"}
          variant="outlined"
          value={formik2.values.nationalCode}
          error={Boolean(
            formik2.touched.nationalCode && formik2.errors.nationalCode
          )}
          onChange={formik2.handleChange}
          onBlur={formik2.handleBlur}
          helperText={
            formik2.touched.nationalCode && formik2.errors.nationalCode
          }
          inputProps={{
            maxLength: !isRealPerson ? 11 : 10,
          }}
        />
        <IconButton
          disabled={!formik2.isValid || inquiryInProgress}
          aria-label="search"
          color="primary"
          onClick={handleInquiry}
        >
          <SearchIcon />
        </IconButton>
      </Grid>
    </Grid>
  );
};

export const AdminAddBuyerForm = ({
  formik,
  provinceData,
  cityData,
  notFound,
  isRealPerson,
  killHouses,
  stewards,
  editData,
}) => {
  const getStewardLabel = (key) => {
    const item = stewards?.find((s) => s.key === key);
    if (item)
      return `${item?.name || ""} - ${item?.user?.fullname || ""} (${
        item?.user?.mobile || ""
      })`;
    const fromEdit = (editData?.stewardInfo || []).find(
      (s) => s?.Steward?.key === key || s?.key === key
    );
    if (fromEdit)
      return (
        fromEdit?.Steward?.name || fromEdit?.fullname || fromEdit?.name || null
      );
    return null;
  };
  const killHouseOptions = (killHouses || []).map((option) => ({
    key: option.key,
    killer: option.killer,
    label: option.killer
      ? `کشتارکن ${(option.name || "").trim()}`
      : `کشتارگاه ${(option.name || "").trim()}`,
  }));
  return (
    <Grid
      container
      justifyContent="space-between"
      alignItems="start"
      xs={12}
      direction="column"
      gap={2}
    >
      <TextField
        fullWidth
        id="nationalId"
        name="nationalId"
        label={!isRealPerson ? "شناسه ملی حقوقی" : "کد ملی"}
        disabled={true}
        variant="outlined"
        value={formik.values.nationalId}
        onChange={formik.handleChange}
        onBlur={formik.handleBlur}
        helperText={formik.touched.nationalId && formik.errors.nationalId}
      />
      <Autocomplete
        fullWidth
        multiple
        disablePortal
        id="steward_keys"
        options={stewards.map((item) => ({
          key: item?.key,
          label: `${item?.name || ""} - ${item?.user?.fullname || ""} (${
            item?.user?.mobile || ""
          })`,
        }))}
        getOptionLabel={(option) => option.label || ""}
        isOptionEqualToValue={(option, value) => option.key === value.key}
        onChange={(event, value) => {
          formik.setFieldValue(
            "steward_keys",
            value ? value.map((v) => v.key) : []
          );
        }}
        value={(formik.values.steward_keys || [])
          .map((key) => {
            const label = getStewardLabel(key);
            return label ? { key, label } : null;
          })
          .filter(Boolean)}
        renderInput={(params) => (
          <TextField {...params} label="انتخاب مباشر (چندگانه)" />
        )}
      />
      <Autocomplete
        fullWidth
        multiple
        disablePortal
        id="kill_house_keys"
        options={killHouseOptions}
        getOptionLabel={(option) => option.label || ""}
        isOptionEqualToValue={(option, value) => option.key === value.key}
        onChange={(event, value) => {
          formik.setFieldValue(
            "kill_house_keys",
            value ? value.map((v) => v.key) : []
          );
        }}
        value={(formik.values.kill_house_keys || [])
          .map((key) => {
            const option = killHouseOptions.find((k) => k.key === key);
            return option
              ? { key, killer: option.killer, label: option.label }
              : null;
          })
          .filter(Boolean)}
        renderInput={(params) => (
          <TextField {...params} label="انتخاب کشتارگاه یا کشتارکن (چندگانه)" />
        )}
      />
      <TextField
        fullWidth
        id="mobile"
        label="شماره موبایل"
        variant="outlined"
        value={formik.values.mobile}
        onChange={formik.handleChange}
        onBlur={formik.handleBlur}
        error={Boolean(formik.errors.mobile)}
        helperText={formik.errors.mobile}
      />
      <TextField
        fullWidth
        id="firstName"
        label="نام"
        variant="outlined"
        value={formik.values.firstName}
        onChange={formik.handleChange}
        onBlur={formik.handleBlur}
        helperText={formik.touched.firstName && formik.errors.firstName}
        error={Boolean(formik.errors.firstName)}
      />
      <TextField
        fullWidth
        id="lastName"
        label="نام خانوادگی"
        variant="outlined"
        value={formik.values.lastName}
        onChange={formik.handleChange}
        onBlur={formik.handleBlur}
        helperText={formik.touched.lastName && formik.errors.lastName}
        error={Boolean(formik.errors.lastName)}
      />
      <TextField
        fullWidth
        id="unit_name"
        label="نام واحد"
        variant="outlined"
        value={formik.values.unit_name}
        onChange={formik.handleChange}
        onBlur={formik.handleBlur}
        helperText={formik.touched.unit_name && formik.errors.unit_name}
        error={Boolean(formik.errors.unit_name)}
      />

      <Autocomplete
        style={{ width: "100%" }}
        disablePortal
        id="province"
        options={
          provinceData
            ? provinceData.map((i) => ({ id: i.name, label: i.name }))
            : []
        }
        isOptionEqualToValue={(option, value) => option.id === value.id}
        onChange={(e, value) => {
          formik.setFieldValue("province", value ? value.id : "");
          formik.setFieldValue("city", "");
        }}
        value={
          formik.values.province
            ? {
                id: formik.values.province,
                label: formik.values.province,
              }
            : null
        }
        renderInput={(params) => (
          <TextField {...params} label="استان را انتخاب کنید" />
        )}
      />
      {!notFound && (
        <Typography variant="caption" color="error">
          استان: {formik.values.province}
        </Typography>
      )}
      {cityData && formik.values.province && (
        <>
          <Autocomplete
            minWidth={210}
            style={{ width: "100%" }}
            disablePortal
            id="city"
            options={
              cityData
                ? cityData.map((i) => ({ id: i.name, label: i.name }))
                : []
            }
            isOptionEqualToValue={(option, value) => option.id === value.id}
            onChange={(e, value) => {
              formik.setFieldValue("city", value ? value.id : "");
            }}
            value={cityData.find((i) => i.name === formik.values.city)?.name}
            renderInput={(params) => (
              <TextField {...params} label="شهر را انتخاب کنید" />
            )}
          />

          {!notFound && (
            <Typography variant="caption" color="error">
              شهر: {formik.values.city}
            </Typography>
          )}
        </>
      )}
    </Grid>
  );
};
