import {withFormik} from "formik";
import {AppRouterInstance} from "next/dist/shared/lib/app-router-context.shared-runtime";
import {toast} from "react-toastify";
import privateApi from "@/service/http/privateCall.axios";
import {handleAxiosError} from "@/lib/utils";
import * as yup from "yup";
import InnerCreatePatientForm from "./InnerCreatePatientForm";
const CreatePatientValidationSchema = yup
  .object({
    firstName: yup
      .string()
      
      .required("نام بیمار الزامیست")
      .test(
        "not-empty",
        "نام بیمار نمی تواند خالی باشد",
        (v) => !!v && v.trim().length > 0
      ),

    lastName: yup
      .string()
      .required("نام خانوادگی بیمار الزامیست")
      .test(
        "not-empty",
        "نام خانوادگی بیمار نمی تواند خالی باشد",
        (v) => !!v && v.trim().length > 0
      ),

    nationality: yup
      .string()
      .required("ملیت بیمار وارد نشده است")
      .test(
        "not-empty",
        "ملیت بیمار نمیتواند خالی باشد",
        (v) => !!v && v.trim().length > 0
      ),
    phone: yup
      .string()
      .nullable()
      .max(20, "شماره تماس بیشتر از حد مجاز است")
      .optional(),

    email: yup
      .string()
      .nullable()
      .email("ایمیل نامعتبر است")
      .max(255, "ایمیل نباید بیشتر از 255 کاراکتر باشد")
      .optional(),
    sex: yup
      .mixed<"male" | "female" | "other">()
      .oneOf(["male", "female", "other"], "جنسیت بیمار نامعتبر است")
      .required("جنسیت بیمار وارد نشده است"),

    address: yup.string().optional(),

  

    preferredLanguage: yup
      .string()
      .optional()
      .typeError("زبان ترجیحی معتبر نیست"),

    birthDate: yup
      .string()
      .optional()
      .test(
        "is-iso-date",
        "تاریخ تولد باید به فرمت ISO معتبر باشد",
        (value) => {
          if (!value) return true;

          // قبول فقط ISO قابل parse
          const date = new Date(value);
          return !isNaN(date.getTime());
        }
      ),

    age: yup
      .number()
      .integer("سن باید عدد صحیح باشد")
      .min(0, "سن نمی‌تواند کمتر از ۰ باشد")
      .max(150, "سن نمی‌تواند بیشتر از 150 باشد")
      .optional()
      .typeError("سن باید عدد باشد"),
  })
  .test(
    "phone-or-email-required",
    "وارد کردن تلفن یا ایمیل الزامی است",
    (value) => {
      if (!value) return false;

      const hasPhone =
        typeof value.phone === "string" && value.phone.trim().length > 0;

      const hasEmail =
        typeof value.email === "string" && value.email.trim().length > 0;

      return hasPhone || hasEmail;
    }
  )
  .test(
    "passport-nationality-code-required",
    "وارد کردن کدملی یا کد پاسپورت الزامیست",
    (value) => {
      if (!value) return false;

      const hasNCode =
        typeof value.phone === "string" && value.phone.trim().length > 0;

      const hasPCode =
        typeof value.email === "string" && value.email.trim().length > 0;

      return hasNCode || hasPCode;
    }
  );
export interface CreatePatientFormValues {
  firstName: string;
  lastName: string;
  nationality: string | null;
  nationalityCode: string;
  passportCode: string;
  age: number | null;
  sex?: "male" | "female" | "other";
  birthDate?: string;
  address?: string;
  phone?: string;
  email?: string;
  preferredLanguage?: string;
  postalCode?: string;
}
export interface CreatePatientFormProps {
  router: AppRouterInstance;
  countries?: {
    name: string;
    callCode: string;
    id: number;
    coverId: number | null;
    createdAt: Date;
  }[];
  fetchCountriesLoading: boolean;
}

const CreatePatientForm = withFormik<
  CreatePatientFormProps,
  CreatePatientFormValues
>({
  mapPropsToValues: () => ({
    firstName: "",
    lastName: "",
    age: null,
    nationality: null,
    nationalityCode: "",
    passportCode: "",
    postalCode: "",
    sex: "male",
    address: "",
    birthDate: "",
    email: "",
    phone: "",
    preferredLanguage: "en",
  }),
  validationSchema: CreatePatientValidationSchema,
  handleSubmit: async (values, {props}) => {
    try {
      const {message} = await privateApi
        .post("/patient/create", values)
        .then((res) => res.data);
      toast.success(message);
    } catch (error) {
      toast?.error(handleAxiosError(error));
    }
  },
})(InnerCreatePatientForm);

export default CreatePatientForm;
