import { array, mixed, number, object, string } from 'yup'

import { nationalCodeRule } from '@/constants/rules/nationalCodeRule'

const requiredString = (min = 0) => {
  const base = string().required()
  return min > 0 ? base.min(min) : base
}

export const personalInformationSchema = object().shape({
  avatar: mixed().notRequired(),
  avatarId: mixed().notRequired(),
  name: requiredString(3),
  birthday: string().required(),
  nationalCode: nationalCodeRule,
  maritalStatus: string().required(),
  gender: string().required(),
  // The verified phone is read-only here and may be returned in international
  // format (for example +98912...). Do not re-validate it as a local 09 number.
  phone: string().required(),
  provinceId: mixed().required(),
  cityId: mixed().required(),
  address: requiredString(10),
  postalCode: string()
    .required()
    .matches(/^\d{10}$/, 'کد پستی باید ۱۰ رقم باشد'),
  virtualPhoneNumber: string()
    .required()
    .matches(/^\d{10,15}$/, 'شماره تلفن مجازی باید فقط شامل ۱۰ تا ۱۵ رقم باشد'),
  seminaryCode: requiredString(),
  seminaryServiceCenterCode: requiredString(),
  childrenCount: number()
    .typeError('تعداد فرزند باید به‌صورت عدد وارد شود')
    .required()
    .integer('تعداد فرزند باید عدد صحیح باشد')
    .min(0, 'تعداد فرزند نمی‌تواند کمتر از صفر باشد')
    .max(20, 'تعداد فرزند نمی‌تواند بیشتر از ۲۰ باشد'),
})

export const educationalInformationSchema = object().shape({
  educationStatus: string().required(),
  seminaryLevel: string().required(),
  universityLevel: string().required(),
  universityName: requiredString(5),
  fieldOfStudy: requiredString(5),
  activitySummary: requiredString(10),
})

export const professionalInformationSchema = object().shape({
  propagationExperienceYears: number()
    .typeError('سابقه فعالیت تبلیغی باید به‌صورت عدد وارد شود')
    .required()
    .integer('سابقه فعالیت تبلیغی باید عدد صحیح باشد')
    .min(0, 'سابقه فعالیت تبلیغی نمی‌تواند کمتر از صفر باشد')
    .max(70, 'سابقه فعالیت تبلیغی نمی‌تواند بیشتر از ۷۰ سال باشد'),
  propagationMethodDescription: requiredString(10),
  specializedTopics: requiredString(10),
  propagationPlatforms: array()
    .of(string())
    .min(1, 'حداقل یک بستر فعالیت را انتخاب کنید')
    .max(6, 'حداکثر ۶ بستر فعالیت قابل انتخاب است')
    .required()
    .test(
      'no-both-none-and-others',
      'نمی‌توانید همزمان "فعالیتی نداشته‌ام" و سایر گزینه‌ها را انتخاب کنید',
      (value) => {
        if (!value) return false
        const hasNone = value.includes('none')
        const hasOthers = value.some((v) => v !== 'none')
        return !(hasNone && hasOthers)
      }
    ),
  onlinePlatformDetails: string().when('propagationPlatforms', {
    is: (val) => Array.isArray(val) && val.includes('online'),
    then: (s) => s.required().min(10),
    otherwise: (s) => s.notRequired().nullable(),
  }),
  otherPlatformDetails: string().when('propagationPlatforms', {
    is: (val) => Array.isArray(val) && val.includes('other'),
    then: (s) => s.required().min(10),
    otherwise: (s) => s.notRequired().nullable(),
  }),
})

const skillSelectWithOtherSchema = (selectField, descField) =>
  object().shape({
    [selectField]: string().required(),
    [descField]: string().when(selectField, {
      is: 'other',
      then: (s) => s.required().min(10),
      otherwise: (s) => s.notRequired().nullable(),
    }),
  })

export const skillAssessmentPart1Schema = skillSelectWithOtherSchema(
  'responseToLowSatisfaction',
  'responseToLowSatisfactionDescription'
)

export const skillAssessmentPart2Schema = skillSelectWithOtherSchema(
  'responseToSessionCancellation',
  'responseToSessionCancellationDescription'
)

export const skillAssessmentPart3Schema = skillSelectWithOtherSchema(
  'responseToAudienceConflict',
  'responseToAudienceConflictDescription'
)

export const skillAssessmentPart4Schema = skillSelectWithOtherSchema(
  'responseToCompetingPropagator',
  'responseToCompetingPropagatorDescription'
)

export const skillAssessmentPart5Schema = object().shape({
  responseToUnqualifiedAdvisors: requiredString(10),
  relevantCertificates: requiredString(10),
  hijabApproach: requiredString(10),
})

export const skillAssessmentPart6Schema = object().shape({
  faithProductionAudio: mixed().nullable().notRequired(),
  faithProductionId: mixed().notRequired(),
})

export const skillAssessmentPart7Schema = object().shape({
  leaderMessageVideo: mixed().nullable().notRequired(),
  leaderMessageId: mixed().notRequired(),
})
