import {
  Autocomplete,
  Button,
  Chip,
  Divider,
  FormControl,
  InputLabel,
  MenuItem,
  Select,
  TextField,
} from "@mui/material";
import { Grid } from "../../../../components/grid/Grid";
import { SPACING } from "../../../../data/spacing";
import React, { useEffect } from "react";
import { Yup } from "../../../../lib/yup/yup";
import { useFormik } from "formik";
import { useDispatch } from "react-redux";
import { cityGetProvinces } from "../../services/CityGetProvinces";
import {
  DRAWER,
  LOADING_END,
  LOADING_START,
} from "../../../../lib/redux/slices/appSlice";
import { useState } from "react";
import { cityGetCity } from "../../services/city-get-city";
import { cityEditAvicultureInfo } from "../../services/city-edit-avculture.info";
import { useContext } from "react";
import { AppContext } from "../../../../contexts/AppContext";
import { PropTypes } from "prop-types";
import { cityGetPoultryFarm } from "../../services/city-get-poultry-farms";

export const CityEditAvicultureInfoForm = ({ item }) => {
  const dispatch = useDispatch();
  const [openNotif] = useContext(AppContext);
  const [provinceData, setProvinceData] = useState();
  const [cityData, setCityData] = useState();
  const [provinceKey, setProvinceKey] = useState();
  const [cityKey, setCityKey] = useState();

  const [isExistProvince, setIsExistProvince] = useState(true);

  const formik = useFormik({
    initialValues: {
      avicultureName: item?.unitName ? item?.unitName : "",
      postal: item?.address.postalCode ? item?.address.postalCode : "",
      address: item?.address.address ? item?.address.address : "",
      bankUser: item?.userBankInfo?.nameOfBankUser
        ? item?.userBankInfo?.nameOfBankUser
        : "",
      card: item?.userBankInfo?.card ? item?.userBankInfo.card : "",
      account: item?.userBankInfo?.account ? item?.userBankInfo.account : "",
      bankName: "",
      shaba: item?.userBankInfo?.shaba ? item?.userBankInfo.shaba : "",
      hall: item?.numberOfHalls ? item?.numberOfHalls : "",
      breedingUniqueId: item?.breedingUniqueId ? item?.breedingUniqueId : "",
      systemCode: item?.systemCode ? item?.systemCode : "",
      epidemiologicalCode: item?.epidemiologicalCode
        ? item?.epidemiologicalCode
        : "",
      totalCapacity: item?.totalCapacity ? item?.totalCapacity : "",
      healthCertificateNumber: item?.healthCertificateNumber
        ? item?.healthCertificateNumber
        : "",
    },
    validationSchema: Yup.object({
      avicultureName: Yup.string().typeError(
        "لطفا فیلد را به درستی وارد کنید!"
      ),
      address: Yup.string().typeError("لطفا فیلد را به درستی وارد کنید!"),
      card: Yup.number().typeError("لطفا فیلد را به درستی وارد کنید!"),

      bankUser: Yup.string().typeError("لطفا فیلد را به درستی وارد کنید!"),
      postal: Yup.number().typeError("لطفا فیلد را به درستی وارد کنید!"),
      account: Yup.number().typeError("لطفا فیلد را به درستی وارد کنید!"),
      bankName: Yup.string().typeError("لطفا فیلد را به درستی وارد کنید!"),
      shaba: Yup.string().typeError("لطفا فیلد را به درستی وارد کنید!"),
      hall: Yup.number().typeError("لطفا فیلد را به درستی وارد کنید!"),
      breedingUniqueId: Yup.number().typeError(
        "لطفا فیلد را به درستی وارد کنید!"
      ),
      systemCode: Yup.number().typeError("لطفا فیلد را به درستی وارد کنید!"),
      epidemiologicalCode: Yup.number().typeError(
        "لطفا فیلد را به درستی وارد کنید!"
      ),
      totalCapacity: Yup.number().typeError("لطفا فیلد را به درستی وارد کنید!"),
      healthCertificateNumber: Yup.number().typeError(
        "لطفا فیلد را به درستی وارد کنید!"
      ),
    }),
  });

  useEffect(() => {
    formik.validateForm();
  }, []);

  useEffect(() => {
    dispatch(LOADING_START());
    dispatch(cityGetProvinces())?.then((r) => {
      dispatch(LOADING_END());
      setProvinceData(r.payload.data);
    });
  }, []);

  useEffect(() => {
    if (provinceKey) {
      dispatch(LOADING_START());
      dispatch(cityGetCity(provinceKey)).then((r) => {
        setCityData(r.payload.data);
        setIsExistProvince(false);
        dispatch(LOADING_END());
      });
    }
  }, [provinceKey]);

  return (
    <Grid
      container
      gap={SPACING.SMALL}
      direction="column"
      flex="1"
      height="100%"
      justifyContent="space-between"
      display="block"
    >
      <Grid container direction="column" gap={SPACING.SMALL}>
        <Grid>
          <TextField
            id="breedingUniqueId"
            label="شناسه یکتا"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.breedingUniqueId}
            error={
              formik.touched.breedingUniqueId
                ? Boolean(formik.errors.breedingUniqueId)
                : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.breedingUniqueId &&
              Boolean(formik.errors.breedingUniqueId)
                ? formik.errors.breedingUniqueId
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="systemCode"
            label="کد سیستمی"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.systemCode}
            error={
              formik.touched.systemCode
                ? Boolean(formik.errors.systemCode)
                : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.systemCode && Boolean(formik.errors.systemCode)
                ? formik.errors.systemCode
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="epidemiologicalCode"
            label="کد اپیدمیولوژیک"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.epidemiologicalCode}
            error={
              formik.touched.epidemiologicalCode
                ? Boolean(formik.errors.epidemiologicalCode)
                : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.epidemiologicalCode &&
              Boolean(formik.errors.epidemiologicalCode)
                ? formik.errors.epidemiologicalCode
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="avicultureName"
            label="نام مرغداری"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.avicultureName}
            error={
              formik.touched.avicultureName
                ? Boolean(formik.errors.avicultureName)
                : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.avicultureName &&
              Boolean(formik.errors.avicultureName)
                ? formik.errors.avicultureName
                : null
            }
          />
        </Grid>
        <Grid>
          <Autocomplete
            disablePortal
            id="province"
            options={
              provinceData
                ? provinceData?.map((i) => ({ id: i.key, label: i.name }))
                : []
            }
            onChange={(event, value) => {
              setProvinceKey(value.id);
            }}
            renderInput={(params) => (
              <TextField {...params} label="استان را انتخاب  کنید" />
            )}
          />
        </Grid>
        <Grid>
          <Autocomplete
            disabled={isExistProvince}
            disablePortal
            id="city"
            options={
              cityData
                ? cityData.map((i) => ({ id: i.key, label: i.name }))
                : []
            }
            onChange={(event, value) => {
              setCityKey(value.id);
            }}
            renderInput={(params) => (
              <TextField {...params} label="شهر را انتخاب  کنید" />
            )}
          />
        </Grid>
        <Grid>
          <TextField
            id="address"
            label="آدرس"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.address}
            error={
              formik.touched.address ? Boolean(formik.errors.address) : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.address && Boolean(formik.errors.address)
                ? formik.errors.address
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="postal"
            label="کد پستی"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.postal}
            error={formik.touched.postal ? Boolean(formik.errors.postal) : null}
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.postal && Boolean(formik.errors.postal)
                ? formik.errors.postal
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="hall"
            label="تعداد سالن"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.hall}
            error={formik.touched.postal ? Boolean(formik.errors.hall) : null}
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.hall && Boolean(formik.errors.hall)
                ? formik.errors.hall
                : null
            }
          />
        </Grid>

        <Grid>
          <TextField
            id="totalCapacity"
            label="ظرفیت کل"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.totalCapacity}
            error={
              formik.touched.totalCapacity
                ? Boolean(formik.errors.totalCapacity)
                : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.totalCapacity &&
              Boolean(formik.errors.totalCapacity)
                ? formik.errors.totalCapacity
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="healthCertificateNumber"
            label="شماره گواهی بهداشتی"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.healthCertificateNumber}
            error={
              formik.touched.healthCertificateNumber
                ? Boolean(formik.errors.healthCertificateNumber)
                : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.healthCertificateNumber &&
              Boolean(formik.errors.healthCertificateNumber)
                ? formik.errors.healthCertificateNumber
                : null
            }
          />
        </Grid>

        <Divider>
          <Chip label="اطلاعات بانکی" />
        </Divider>
        <Grid>
          <TextField
            id="bankUser"
            label="نام صاحب حساب"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.bankUser}
            error={
              formik.touched.bankUser ? Boolean(formik.errors.bankUser) : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.bankUser && Boolean(formik.errors.bankUser)
                ? formik.errors.bankUser
                : null
            }
          />
        </Grid>
        <Grid>
          <FormControl fullWidth>
            <InputLabel id="demo-simple-select-label">بانک</InputLabel>
            <Select
              id="bankName"
              label="نام بانک"
              value={formik.values.bankName}
              error={
                formik.touched.bankName ? Boolean(formik.errors.bankName) : null
              }
              onChange={(e) => {
                formik.setFieldValue("bankName", e.target.value);
              }}
              onBlur={formik.handleBlur}
            >
              <MenuItem value={"موسسه افضل توس"}>موسسه افضل توس</MenuItem>
              <MenuItem value={"انصار"}>انصار</MenuItem>
              <MenuItem value={"سپه"}>سپه</MenuItem>
              <MenuItem value={"دی"}>دی</MenuItem>
              <MenuItem value={"کاب"}>اقتصاد نوین</MenuItem>
              <MenuItem value={"گردشگری"}>گردشگری</MenuItem>
              <MenuItem value={"حکمت ایرانیان"}>حکمت ایرانیان</MenuItem>
              <MenuItem value={"ایران زمین"}>ایران زمین</MenuItem>
              <MenuItem value={"کشاورزی"}>کشاورزی</MenuItem>
              <MenuItem value={"مسکن"}>مسکن</MenuItem>
              <MenuItem value={"مهر ایران"}>مهر ایران</MenuItem>
              <MenuItem value={"مهر اقتصاد"}>مهر اقتصاد</MenuItem>
              <MenuItem value={"ملت"}>ملت</MenuItem>
              <MenuItem value={"ملی"}>ملی</MenuItem>
              <MenuItem value={"پارسیان"}>پارسیان</MenuItem>
              <MenuItem value={"پاسارگاد"}>پاسارگاد</MenuItem>
              <MenuItem value={"پست بانک ایران"}>پست بانک ایران</MenuItem>
              <MenuItem value={"صادرات"}>صادرات</MenuItem>
              <MenuItem value={"سامان"}>سامان</MenuItem>
              <MenuItem value={"صنعت و معدن"}>صنعت و معدن</MenuItem>
              <MenuItem value={"سرمایه"}>سرمایه</MenuItem>
              <MenuItem value={"شهر"}>شهر</MenuItem>
              <MenuItem value={"سینا"}>سینا</MenuItem>
              <MenuItem value={"تجارت"}>تجارت</MenuItem>
              <MenuItem value={"موسسه اعتباری توسعه"}>
                موسسه اعتباری توسعه
              </MenuItem>
              <MenuItem value={"خاورمیانه"}>خاورمیانه</MenuItem>
            </Select>
          </FormControl>
        </Grid>
        <Grid>
          <TextField
            id="card"
            label="شماره کارت"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.card}
            error={formik.touched.card ? Boolean(formik.errors.card) : null}
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.card && Boolean(formik.errors.card)
                ? formik.errors.card
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="account"
            label="شماره حساب"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.account}
            error={
              formik.touched.account ? Boolean(formik.errors.account) : null
            }
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.account && Boolean(formik.errors.account)
                ? formik.errors.account
                : null
            }
          />
        </Grid>
        <Grid>
          <TextField
            id="shaba"
            label="شماره شبا"
            variant="outlined"
            sx={{ width: "100%" }}
            value={formik.values.shaba}
            error={formik.touched.shaba ? Boolean(formik.errors.shaba) : null}
            onChange={formik.handleChange}
            onBlur={formik.handleBlur}
            helperText={
              formik.touched.shaba && Boolean(formik.errors.shaba)
                ? formik.errors.shaba
                : null
            }
          />
        </Grid>
        <Grid mb={SPACING.SMALL}>
          <Button
            fullWidth
            variant="contained"
            disabled={!formik.validateForm}
            onClick={() => {
              dispatch(
                cityEditAvicultureInfo({
                  poultry_key: item.key,
                  breedingUniqueId: formik.values.breedingUniqueId
                    ? formik.values.breedingUniqueId
                    : null,
                  systemCode: formik.values.systemCode
                    ? formik.values.systemCode
                    : null,
                  epidemiologicalCode: formik.values.epidemiologicalCode
                    ? formik.values.epidemiologicalCode
                    : null,
                  totalCapacity: formik.values.totalCapacity
                    ? formik.values.totalCapacity
                    : null,
                  healthCertificateNumber: formik.values.healthCertificateNumber
                    ? formik.values.healthCertificateNumber
                    : null,
                  address: {
                    province: provinceKey ? provinceKey : null,
                    city: cityKey ? cityKey : null,
                    address: formik.values.address
                      ? formik.values.address
                      : null,
                    postal_code: formik.values.postal
                      ? formik.values.postal
                      : null,
                  },
                  user_bank_info: {
                    name_of_bank_user: formik.values.bankUser
                      ? formik.values.bankUser
                      : null,
                    bank_name: formik.values.bankName
                      ? formik.values.bankName
                      : null,
                    card: formik.values.card ? formik.values.card : null,
                    shaba: formik.values.shaba ? formik.values.shaba : null,
                    account: formik.values.account
                      ? formik.values.account
                      : null,
                  },
                  unit_name: formik.values.avicultureName
                    ? formik.values.avicultureName
                    : null,
                  hall: formik.values.hall ? formik.values.hall : null,
                })
              ).then((r) => {
                if (r.error) {
                  openNotif({
                    vertical: "top",
                    horizontal: "center",
                    msg: "مشکلی پیش آمده است.",
                    severity: "error",
                  });
                  dispatch(LOADING_END());
                } else {
                  openNotif({
                    vertical: "top",
                    horizontal: "center",
                    msg: "عملیات با موفقیت انجام شد.",
                    severity: "success",
                  });
                }
                dispatch(cityGetPoultryFarm());
                dispatch(
                  DRAWER({ right: false, bottom: false, content: null })
                );
              });
            }}
          >
            ثبت اطلاعات
          </Button>
        </Grid>
      </Grid>
    </Grid>
  );
};

CityEditAvicultureInfoForm.propTypes = {
  item: PropTypes.any,
};
