import HookFormSelect from '@/core/components/elements/Select/HookFormSelect';
import useAuth from '@/core/hooks/useAuth';
import { useRouter } from 'next/router';
import { Controller, useForm } from 'react-hook-form';
import * as Yup from 'yup';
import cityApi from '../api/cityApi';
import districtApi from '../api/districtApi';
import subDistrictApi from '../api/subDistrictApi';
import { useEffect, useState } from 'react';
import createAddressApi from '../api/createAddressApi';
import { toast } from 'react-hot-toast';
import { yupResolver } from '@hookform/resolvers/yup';
import Menu from '@/lib/auth/components/Menu';
import useAddresses from '../hooks/useAddresses';
import stateApi from '../api/stateApi';

const CreateAddress = () => {
  const auth = useAuth();
  const router = useRouter();
  const {
    register,
    formState: { errors },
    handleSubmit,
    watch,
    setValue,
    control,
  } = useForm({
    resolver: yupResolver(validationSchema),
    defaultValues,
  });
  const { addresses = [] } = useAddresses(); // Ensure addresses is an array
  const [states, setState] = useState([]);
  const [cities, setCities] = useState([]);
  const [districts, setDistricts] = useState([]);
  const [subDistricts, setSubDistricts] = useState([]);
  const [filteredTypes, setFilteredTypes] = useState(types); // State to manage filtered types

  useEffect(() => {
    const loadState = async () => {
      let dataState = await stateApi();
      dataState = dataState.map((state) => ({
        value: state.id,
        label: state.name,
      }));
      setState(dataState);
    };
    loadState();
  }, []);

  const watchState = watch('state');
  useEffect(() => {
    setValue('city', '');
    if (watchState) {
      const loadCities = async () => {
        let dataCities = await cityApi({stateId: watchState});
        dataCities = dataCities.map((city) => ({
          value: city.id,
          label: city.name,
        }));
        setCities(dataCities);
      };
      loadCities();
    }
  }, [watchState, setValue]);

  useEffect(() => {
    if (addresses) {
      let hasContactAddress = false;

      for (let i = 0; i < addresses?.data?.length; i++) {
        if (addresses.data[i].type === 'contact') {
          hasContactAddress = true;
          break;
        }
      }
      if (hasContactAddress) {
        setFilteredTypes(types.filter((type) => type.value !== 'contact'));
      } else {
        setFilteredTypes(types);
      }
    }
  }, [auth]);

  const watchCity = watch('city');
  useEffect(() => {
    setValue('district', '');
    if (watchCity) {
      const loadDistricts = async () => {
        let dataDistricts = await districtApi({ cityId: watchCity });
        dataDistricts = dataDistricts.map((district) => ({
          value: district.id,
          label: district.name,
        }));
        setDistricts(dataDistricts);
      };
      loadDistricts();
    }
  }, [watchCity, setValue]);

  const watchDistrict = watch('district');
  useEffect(() => {
    setValue('subDistrict', '');
    if (watchDistrict) {
      const loadSubDistricts = async () => {
        let dataSubDistricts = await subDistrictApi({
          districtId: watchDistrict,
        });
        dataSubDistricts = dataSubDistricts.map((district) => ({
          value: district.id,
          label: district.name,
        }));
        setSubDistricts(dataSubDistricts);
      };
      loadSubDistricts();
    }
  }, [watchDistrict, setValue]);

  const onSubmitHandler = async (values) => {
    const data = {
      ...values,
      state_id: values.state,
      city_id: values.city,
      district_id: values.district,
      sub_district_id: values.subDistrict,
      parent_id: auth.partnerId,
    };

    const address = await createAddressApi({ data });
    if (address?.id) {
      toast.success('Berhasil menambahkan alamat');
      router.back();
    }
  };

  return (
    <div className='max-w-none md:container mx-auto flex p-0 md:py-10'>
      <div className='hidden md:block w-3/12 pr-4'>
        <Menu />
      </div>
      <div className='w-full md:w-9/12 p-4 bg-white border border-gray_r-6 rounded'>
        <form onSubmit={handleSubmit(onSubmitHandler)}>
          <div className='grid grid-cols-1 md:grid-cols-2 gap-4'>
            <div>
              <label className='form-label mb-2'>Label Alamat</label>
              <Controller
                name='type'
                control={control}
                render={(props) => (
                  <HookFormSelect
                    {...props}
                    isSearchable={false}
                    options={filteredTypes}
                  />
                )}
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.type?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Nama</label>
              <input
                {...register('name')}
                placeholder='John Doe'
                type='text'
                className='form-input'
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.name?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Email</label>
              <input
                {...register('email')}
                placeholder='contoh@email.com'
                type='email'
                className='form-input'
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.email?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Mobile</label>
              <input
                {...register('mobile')}
                placeholder='08xxxxxxxx'
                type='tel'
                className='form-input'
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.mobile?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Alamat</label>
              <input
                {...register('street')}
                placeholder='Jl. Bandengan Utara 85A'
                type='text'
                className='form-input'
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.street?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Kode Pos</label>
              <input
                {...register('zip')}
                placeholder='10100'
                type='number'
                className='form-input'
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.zip?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Provinsi</label>
              <Controller
                name='state'
                control={control}
                render={(props) => (
                  <HookFormSelect {...props} options={states} />
                )}
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.state?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Kota</label>
              <Controller
                name='city'
                control={control}
                render={(props) => (
                  <HookFormSelect {...props} options={cities}  disabled={!watchState}/>
                )}
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.city?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Kecamatan</label>
              <Controller
                name='district'
                control={control}
                render={(props) => (
                  <HookFormSelect
                    {...props}
                    options={districts}
                    disabled={!watchCity}
                  />
                )}
              />
              <div className='text-caption-2 text-danger-500 mt-1'>
                {errors.district?.message}
              </div>
            </div>

            <div>
              <label className='form-label mb-2'>Kelurahan</label>
              <Controller
                name='subDistrict'
                control={control}
                render={(props) => (
                  <HookFormSelect
                    {...props}
                    options={subDistricts}
                    disabled={!watchDistrict}
                  />
                )}
              />
            </div>
          </div>

          <button
            type='submit'
            className='btn-yellow w-full md:w-fit mt-6 ml-0 md:ml-auto'
          >
            Simpan
          </button>
        </form>
      </div>
    </div>
  );
};

const validationSchema = Yup.object().shape({
  type: Yup.string().required('Harus di-pilih'),
  name: Yup.string().min(3, 'Minimal 3 karakter').required('Harus di-isi'),
  mobile: Yup.string().required('Harus di-isi'),
  street: Yup.string().required('Harus di-isi'),
  zip: Yup.string().required('Harus di-isi'),
  state: Yup.string().required('Harus di-pilih'),
  city: Yup.string().required('Harus di-pilih'),
  district: Yup.string().required('Harus di-pilih'),
});

const defaultValues = {
  type: '',
  name: '',
  email: '',
  mobile: '',
  street: '',
  state: '',
  city: '',
  district: '',
  subDistrict: '',
  zip: '',
};

const types = [
  { value: 'contact', label: 'Contact Address' },
  { value: 'invoice', label: 'Invoice Address' },
  { value: 'delivery', label: 'Delivery Address' },
  { value: 'other', label: 'Other Address' },
];

export default CreateAddress;
