// PersonalInfoForm.validation.ts
import * as yup from "yup";
import { PersonalInfoFormValues } from "../types";

export const PersonalInfoValidationSchema = yup
  .object({
    maritalStatus: yup.string().trim().required("وضعیت تاهل را انتخاب کنید"),

    militaryStatus: yup
      .mixed<PersonalInfoFormValues["militaryStatus"]>()
      .oneOf([
        "",
        "کارت پایان خدمت",
        "در حال خدمت",
        "معافیت تحصیلی",
        "معافیت دائم",
        "انجام نشده",
      ])
      .required("وضعیت نظام وظیفه را انتخاب کنید"),

    permanentExemptionReason: yup
      .string()
      .trim()
      .when("militaryStatus", {
        is: "معافیت دائم",
        then: (s) => s.required("علت معافیت دائم الزامی است"),
        otherwise: (s) => s.notRequired(),
      }),

    fatherEducation: yup.string().required("تحصیلات پدر را انتخاب کنید"),
    fatherJob: yup.string().trim().required("شغل پدر الزامی است"),
    motherEducation: yup.string().required("تحصیلات مادر را انتخاب کنید"),
    motherJob: yup.string().trim().required("شغل مادر الزامی است"),

    housingStatus: yup
      .mixed<PersonalInfoFormValues["housingStatus"]>()
      .oneOf(["", "منزل شخصی", "منزل والدین", "منزل استیجاری", "سایر"])
      .required("وضعیت مسکن را انتخاب کنید"),
    city: yup.string().trim().required("شهر الزامی است"),
    address: yup.string().trim().required("آدرس الزامی است"),

    homePhone: yup.string().trim().notRequired(),
    mobilePhone: yup.string().trim().required("تلفن همراه الزامی است"),
    emergencyPhone: yup.string().trim().notRequired(),
    email: yup.string().trim().email("ایمیل نامعتبر است").notRequired(),

    residenceDuration: yup
      .mixed<number | "">()
      .test(
        "residenceDuration",
        "مدت سکونت نامعتبر است",
        (v) => v === "" || (typeof v === "number" && v >= 0),
      )
      .notRequired(),

    isVeteran: yup.boolean().required(),

    hasCriminalRecord: yup.boolean().required(),
    criminalDescription: yup
      .string()
      .trim()
      .when("hasCriminalRecord", {
        is: true,
        then: (s) => s.required("توضیحات سوء پیشینه الزامی است"),
        otherwise: (s) => s.notRequired(),
      }),

    spouseName: yup
      .string()
      .trim()
      .when("maritalStatus", {
        is: "متاهل",
        then: (s) => s.required("نام همسر الزامی است"),
        otherwise: (s) => s.notRequired(),
      }),
    spouseEducation: yup
      .string()
      .trim()
      .when("maritalStatus", {
        is: "متاهل",
        then: (s) => s.required("تحصیلات همسر الزامی است"),
        otherwise: (s) => s.notRequired(),
      }),
    spouseJob: yup
      .string()
      .trim()
      .when("maritalStatus", {
        is: "متاهل",
        then: (s) => s.required("شغل همسر الزامی است"),
        otherwise: (s) => s.notRequired(),
      }),
    spouseWorkplace: yup
      .string()
      .trim()
      .when("maritalStatus", {
        is: "متاهل",
        then: (s) => s.required("محل کار همسر الزامی است"),
        otherwise: (s) => s.notRequired(),
      }),

    childrenCount: yup.mixed<number | "">().when("maritalStatus", {
      is: (ms: string) => ["متاهل", "متارکه", "فوت همسر"].includes(ms),
      then: (s) =>
        s.test(
          "childrenCount",
          "تعداد فرزند نامعتبر است",
          (v) => v === "" || (typeof v === "number" && v >= 0),
        ),
      otherwise: (s) => s.notRequired(),
    }),
  })
  .required();
