import { Textarea, Textinput } from '@/components';
import CustomModal from '@/components/CustomModal';
import CustomSelect from '@/components/Form/Select';
import Button from '@/components/ui/Button';
import UploadImager from '@/components/UploadImager';
import { useSession } from 'next-auth/react';
import Head from 'next/head';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
import { useForm, Controller } from 'react-hook-form';
import { Form } from 'react-bootstrap';
import styled from 'styled-components';
import { Country, State, City } from 'country-state-city';
import { useCreateProfessionalAccountMutation } from '@/lib/redux/services/auth.api';

const ProfessionalAccountBox = styled.div`
  @media (min-width: 992px) and (max-width: 1600px) {
    padding-top: 1200px !important;
  }

  @media (min-width: 1600px) {
    padding-top: 1000px !important;
  }
`;

const getFormData = (data: Record<string, any>, formDataIns: FormData) => {
  Object.keys(data).forEach((key) => {
    formDataIns.append(key, data[key]);
  });
  return formDataIns;
};

const User = () => {
  const [accountRequestModal, setAccountRequestModal] = useState(false);
  const [congratulation, setCongratulation] = useState(false);
  const router = useRouter();
  const { data: session } = useSession();
  const [createProfile, { isLoading }] = useCreateProfessionalAccountMutation();

  const {
    control,
    handleSubmit,
    setValue,
    formState: { errors }
  } = useForm();

  const [selectedCountry, setSelectedCountry] = useState<any>(null);
  const [selectedState, setSelectedState] = useState<any>(null);
  const [selectedCity, setSelectedCity] = useState<any>(null);

  const [stateOptions, setStateOptions] = useState<any[]>([]);
  const [cityOptions, setCityOptions] = useState<any[]>([]);

  const [insuranceDoc, setInsuranceDoc] = useState<File | null>(null);
  const [legalDoc, setLegalDoc] = useState<File | null>(null);

  useEffect(() => {
    if (selectedCountry) {
      const states = State.getStatesOfCountry(selectedCountry.isoCode);
      setStateOptions(states);
      setSelectedState(null);
      setCityOptions([]);
    }
  }, [selectedCountry]);

  useEffect(() => {
    if (selectedState) {
      const cities = City.getCitiesOfState(selectedState.countryCode, selectedState.isoCode);
      setCityOptions(cities);
    }
  }, [selectedState]);

  const onSubmit = async (data: any) => {
    const { area_of_service, ...rest } = data
    const formDataIns = new FormData();
    const formDataPayload = getFormData(rest, formDataIns);


    if (insuranceDoc) formDataIns.append('insurance_document', insuranceDoc);
    if (legalDoc) formDataIns.append('legal_document', legalDoc);
    formDataIns.append("area_of_service", JSON.stringify(area_of_service)); 
    try {
      const token = session?.user?.token
      await createProfile({ body: formDataPayload, token }).unwrap();
      setAccountRequestModal(true);
    } catch (error) {
      console.error(error);
    }
  };

  const handleOpenModal = () => {
    setAccountRequestModal(false);
    setCongratulation(true);
  };

  return (
    <>
      <Head>
        <title>Create Professional Account</title>
      </Head>

      <ProfessionalAccountBox className="h-100 overflow-y-auto py-5 position-relative d-flex flex-column justify-content-center align-items-center">
        <h2 className="auth-page-title">Create Professional Account</h2>
        <p className="text-center">Please enter your details to Create professional account</p>
        <form onSubmit={handleSubmit(onSubmit)} className="w-100">
          <Form.Group className="mt-4">
            <Form.Label>Owner Name</Form.Label>
            <Controller
              name="owner_name"
              control={control}
              defaultValue=""
              rules={{ required: "Owner name is required" }}
              render={({ field }) => (
                <Textinput
                  {...field}
                  iconLeft={<img src="/images/icons/phone-icon.png" />}
                  type="text"
                  placeholder="+123 456 7890"
                  inputGroupBoxCss="w-100"
                />
              )}
            />
            {errors.owner_name && <p>{errors.owner_name.message}</p>}
          </Form.Group>

          <Form.Group className="mt-4">
            <Form.Label>Phone Number</Form.Label>
            <Controller
              name="phone_number"
              control={control}
              defaultValue=""
              rules={{ required: "Phone number is required" }}
              render={({ field }) => (
                <Textinput
                  {...field}
                  iconLeft={<img src="/images/icons/phone-icon.png" />}
                  type="text"
                  placeholder="+123 456 7890"
                  inputGroupBoxCss="w-100"
                />
              )}
            />
            {errors.phone_number && <p>{errors.phone_number.message}</p>}
          </Form.Group>

          <Form.Group className="mt-4">
            <Form.Label>Email Address</Form.Label>
            <Controller
              name="email"
              control={control}
              defaultValue=""
              rules={{ required: "Email is required" }}
              render={({ field }) => (
                <Textinput
                  {...field}
                  iconLeft={<img src="/images/icons/email.png" />}
                  type="text"
                  placeholder="John.Smith@example.com"
                  inputGroupBoxCss="w-100"
                />
              )}
            />
            {errors.email && <p>{errors.email.message}</p>}
          </Form.Group>
          {/* 
          <Form.Group className="mt-4">
            <Form.Label>Company Name</Form.Label>
            <Controller
              name="companyName"
              control={control}
              defaultValue=""
              rules={{ required: "Company name is required" }}
              render={({ field }) => (
                <Textinput
                  {...field}
                  iconLeft={<img src="/images/icons/company-icon.svg" />}
                  type="text"
                  placeholder="Enter company name"
                  inputGroupBoxCss="w-100"
                />
              )}
            />
            {errors.companyName && <p>{errors.companyName.message}</p>}
          </Form.Group> */}

          <Form.Group className="mt-4">
            <Form.Label>Address</Form.Label>
            <Controller
              name="address"
              control={control}
              defaultValue=""
              render={({ field }) => (
                <Textarea
                  {...field}
                  iconLeft={<img src="/images/icons/location.png" />}
                  placeholder="Enter address"
                />
              )}
            />
          </Form.Group>

          <CustomSelect
            label="Country"
            icon={<img src="/images/icons/country.png" />}
            defaultValue={selectedCountry}
            options={Country.getAllCountries().map((country) => ({
              value: country.isoCode,
              label: country.name,
              countryData: country,
            }))}
            onChange={(option: any) => {
              setSelectedCountry(option.countryData);
              setValue('country', option.countryData.name);
            }}
          />

          <CustomSelect
            label="State"
            icon={<img src="/images/icons/state.png" />}
            defaultValue={selectedState}
            options={stateOptions.map((state) => ({
              value: state.isoCode,
              label: state.name,
              stateData: state,
            }))}
            onChange={(option: any) => {
              setSelectedState(option.stateData);
              setValue('state', option.stateData.name);
            }}
            isDisabled={!selectedCountry}
          />

          <CustomSelect
            label="City"
            icon={<img src="/images/icons/building.png" />}
            defaultValue={selectedCity}
            options={cityOptions.map((city) => ({
              value: city.name,
              label: city.name,
              cityData: city,
            }))}
            onChange={(option: any) => {
              setSelectedCity(option.cityData);
              setValue('city', option.cityData.name);
            }}
            isDisabled={!selectedState}
          />

          <Form.Group className="mt-4">
            <Form.Label>Postal Code</Form.Label>
            <Controller
              name="postal_code"
              control={control}
              defaultValue=""
              render={({ field }) => (
                <Textinput
                  {...field}
                  iconLeft={<img src="/images/icons/postal-code-1.png" />}
                  type="text"
                  placeholder="Postal Code"
                  inputGroupBoxCss="w-100"
                />
              )}
            />
          </Form.Group>

          <Form.Group className="mt-4">
            <Form.Label>Business Details</Form.Label>
            <Controller
              name="business_details"
              control={control}
              defaultValue=""
              render={({ field }) => (
                <Textarea
                  {...field}
                  iconLeft={<img src="/images/icons/newspaper-icon.png" />}
                  placeholder="Enter business details"
                />
              )}
            />
          </Form.Group>

          <Form.Group className="mt-4">
            <Form.Label>Area of Service</Form.Label>
            <Controller
              name="area_of_service.name"
              control={control}
              defaultValue=""
              render={({ field }) => (
                <Textinput
                  {...field}
                  iconLeft={<img src="/images/icons/location.png" />}
                  type="text"
                  placeholder="Area of Service"
                  inputGroupBoxCss="w-100"
                />
              )}
            />
          </Form.Group>

          <div className="mt-4">
            <UploadImager title="Upload Insurance Documents" onUpload={(file) => setInsuranceDoc(file)} />
          </div>

          <div className="mt-4">
            <UploadImager title="Upload Document (LEGAL Docs/Certification/Business License)." onUpload={(file) => setLegalDoc(file)} />
          </div>

          <div className="d-flex justify-content-center align-items-center">
            <Button
              type="submit"
              size="lg"
              className="mt-5 UrbanistRegular btn btn-feature auth-btn"
              disabled={isLoading}
            >
              {isLoading ? 'Creating...' : 'Create Account'}
            </Button>
          </div>
        </form>
      </ProfessionalAccountBox>

      <CustomModal show={accountRequestModal} handleClose={() => setAccountRequestModal(false)}>
        <div className="d-flex pb-sm-4 px-sm-3 py-2 px-2 flex-column justify-content-center align-items-center">
          <h5 className="fs-sm-15 mb-3 fs-13 text-center text-capitalize fw-bold">
            Your Request to create a profile is sent to super admin. Please wait for the approval
          </h5>
          <Button onClick={handleOpenModal} size="lg" className="UrbanistRegular btn btn-feature">
            Okay
          </Button>
        </div>
      </CustomModal>

      <CustomModal show={congratulation} handleClose={() => setCongratulation(false)}>
        <div className="d-flex pb-sm-4 px-sm-3 py-2 px-2 flex-column justify-content-center align-items-center">
          <h5 className="fs-sm-15 mb-3 fs-13 text-center fw-bold">
            Congratulations! Your profile has been approved from the admin side
          </h5>
          <Button
            onClick={() => router.push('/carrier')}
            size="lg"
            className="UrbanistRegular btn btn-feature"
          >
            Go To Home
          </Button>
        </div>
      </CustomModal>
    </>
  );
};

export default User;
