import {EmploymentStatus, EMPLOYMENT_STATUS, Gender, User} from "@/interfaces/user";
import {FormEvent, useEffect, useState} from "react";
import countryCodes from "country-codes-list";
import {RadioGroup} from "@headlessui/react";
import Input from "./Low/Input";
import clsx from "clsx";
import Button from "./Low/Button";
import {BsArrowRepeat} from "react-icons/bs";
import axios from "axios";
import {toast} from "react-toastify";
import {KeyedMutator} from "swr";
import CountrySelect from "./Low/CountrySelect";
import GenderInput from "@/components/High/GenderInput";
import EmploymentStatusInput from "@/components/High/EmploymentStatusInput";
import TimezoneSelect from "./Low/TImezoneSelect";
import moment from "moment";

interface Props {
	user: User;
	mutateUser: KeyedMutator<User>;
}

export default function DemographicInformationInput({user, mutateUser}: Props) {
	const [country, setCountry] = useState<string>();
	const [phone, setPhone] = useState<string>();
	const [passport_id, setPassportID] = useState<string | undefined>(user.type === "student" ? user.demographicInformation?.passport_id : undefined);
	const [gender, setGender] = useState<Gender>();
	const [employment, setEmployment] = useState<EmploymentStatus>();
	const [position, setPosition] = useState<string>();
	const [timezone, setTimezone] = useState<string>(moment.tz.guess());
	const [isLoading, setIsLoading] = useState(false);

	const [companyName, setCompanyName] = useState<string>();
	const [commercialRegistration, setCommercialRegistration] = useState<string>();

	const save = (e?: FormEvent) => {
		if (e) e.preventDefault();
		setIsLoading(true);

		axios
			.patch("/api/users/update", {
				demographicInformation: {
					country,
					phone: `+${countryCodes.findOne("countryCode" as any, country!).countryCallingCode}${phone}`,
					gender,
					employment: user.type === "corporate" ? undefined : employment,
					position: user.type === "corporate" ? position : undefined,
					passport_id,
					timezone,
				},
				agentInformation: user.type === "agent" ? {companyName, commercialRegistration} : undefined,
			})
			.then((response) => mutateUser((response.data as {user: User}).user))
			.catch(() => {
				toast.error("Something went wrong, please try again later!", {toastId: "user-update-error"});
			})
			.finally(() => setIsLoading(false));
	};

	return (
		<div className="flex flex-col items-center justify-center gap-12 w-full">
			<h2 className="font-semibold text-center text-xl max-w-[800px]">
				Welcome to EnCoach, the ultimate platform dedicated to helping you master the IELTS ! We are thrilled that you have chosen us as your
				learning companion on this journey towards achieving your desired IELTS score.
				<br />
				<br />
				To make the most of your learning experience, we kindly request you to complete your profile. By providing some essential information
				about yourself.
			</h2>
			<form className="flex flex-col items-center justify-items-center gap-6 w-full h-full -md:px-4 lg:w-1/2 mb-32" onSubmit={save}>
				{user.type === "agent" && (
					<div className="w-full flex gap-8">
						<Input type="text" onChange={setCompanyName} name="companyName" label="Corporate Name" required />
						<Input
							type="text"
							onChange={setCommercialRegistration}
							name="commercialRegistration"
							label="Commercial Registration"
							required
						/>
					</div>
				)}
				<div className="w-full grid grid-cols-2 gap-6">
					<div className="relative flex flex-col gap-3 w-full">
						<label className="font-normal text-base text-mti-gray-dim">Country *</label>
						<CountrySelect value={country} onChange={setCountry} />
					</div>
					<Input type="tel" name="phone" label="Phone number" onChange={(e) => setPhone(e)} placeholder="Enter phone number" required />
				</div>
				{user.type === "student" && (
					<Input
						type="text"
						name="passport_id"
						label="Passport/National ID"
						onChange={(e) => setPassportID(e)}
						value={passport_id}
						placeholder="Enter National ID or Passport number"
						required
					/>
				)}

				<div className="flex flex-col gap-3 w-full">
					<label className="font-normal text-base text-mti-gray-dim">Timezone</label>
					<TimezoneSelect value={timezone} onChange={setTimezone} />
				</div>

				<GenderInput value={gender} onChange={setGender} />
				{user.type === "corporate" && (
					<Input name="position" onChange={setPosition} type="text" label="Department" placeholder="CEO, Head of Marketing..." required />
				)}
				{user.type !== "corporate" && <EmploymentStatusInput value={employment} onChange={setEmployment} />}
			</form>

			<div className="self-end flex justify-end w-full gap-8 absolute bottom-8 left-0 px-8">
				<Button
					className="lg:mt-8 max-w-[400px] w-full self-end"
					color="purple"
					onClick={save}
					disabled={
						isLoading ||
						!country ||
						!phone ||
						!gender ||
						(user.type === "corporate" ? !position : !employment) ||
						(user.type === "agent" ? !companyName || !commercialRegistration : false)
					}>
					{!isLoading && "Save information"}
					{isLoading && (
						<div className="flex items-center justify-center">
							<BsArrowRepeat className="text-white animate-spin" size={25} />
						</div>
					)}
				</Button>
			</div>
		</div>
	);
}
