import type { AppLanguage, TranslationKey } from "@/lib/i18n"

export const NIMIT_SEVAK_LANGUAGE_OPTIONS: Array<{ value: AppLanguage; label: string }> = [
  { value: "gu", label: "common.gujarati" },
  { value: "en", label: "common.english" },
  { value: "hi", label: "common.hindi" },
]

export type NimitSevakSubSevaOption = {
  value: string
  label: string
  labelKey?: TranslationKey
  requiresPageLink?: boolean
}

export type NimitSevakSevaSelection = {
  sevaCode: string
  subSevaCodes: string[]
  customValue: string | null
  pageLinks: Record<string, string>
}

export type NimitSevakSevaOption = {
  value: string
  label: string
  labelKey?: TranslationKey
  requiresTextInput?: boolean
  textInputLabel?: string
  textInputLabelKey?: TranslationKey
  textInputPlaceholder?: string
  textInputPlaceholderKey?: TranslationKey
  subSevas?: NimitSevakSubSevaOption[]
}

type NimitSevakStateOption = {
  gu: string
  en: string
  hi: string
}

const NIMIT_SEVAK_SEVA_VALUE_ALIASES: Record<string, string> = {
  FOOD_CLEANING_PREP: "GROUND_CLEANING_PREPARATION",
  RASOI: "KITCHEN_DEPARTMENT",
  GUJARATI_TYPING: "UNICODE_SHREELIPI_GUJARATI_TYPING",
  CRANE_STACKING_LIVE: "VIDEOGRAPHY",
  GRAPHICS_DESIGN: "GRAPHICS_DESIGNER",
  SOUND_LIGHT: "SOUND_ENGINEER",
}

const NIMIT_SEVAK_SUB_SEVA_VALUE_ALIASES: Record<string, Record<string, string>> = {
  SOCIAL_MEDIA_INFLUENCER: {
    CAMERA: "CREATOR",
  },
  VIDEOGRAPHY: {
    CRANE_OPERATOR: "DRONE_OPERATOR",
    STACKING_CAM: "STANDEE_CAM",
  },
}

const normalizeNimitSevakSevaCode = (value: string) => {
  const normalized = String(value || "").trim().toUpperCase()
  return NIMIT_SEVAK_SEVA_VALUE_ALIASES[normalized] || normalized
}

const normalizeNimitSevakSubSevaCode = (sevaCode: string, subSevaCode: string) => {
  const normalizedSevaCode = normalizeNimitSevakSevaCode(sevaCode)
  const normalizedSubSevaCode = String(subSevaCode || "").trim().toUpperCase()
  return NIMIT_SEVAK_SUB_SEVA_VALUE_ALIASES[normalizedSevaCode]?.[normalizedSubSevaCode] || normalizedSubSevaCode
}

export const NIMIT_SEVAK_SEVA_OPTIONS: NimitSevakSevaOption[] = [
  { value: "GROUND_CLEANING_PREPARATION", label: "મહોત્સવ માટે જમીનની સાફ-સફાઇ તથા જમીન તૈયાર કરવી", labelKey: "nimitSevak.sevas.foodCleaningPrep" },
  { value: "KITCHEN_DEPARTMENT", label: "રસોડા વિભાગ", labelKey: "nimitSevak.sevas.rasoi" },
  {
    value: "SOCIAL_MEDIA_INFLUENCER",
    label: "સોશિયલ મીડિયા ઇન્ફ્લુએન્સર",
    labelKey: "nimitSevak.sevas.socialMediaInfluencer",
    subSevas: [
      { value: "CREATOR", label: "ક્રિએટર", labelKey: "nimitSevak.sevas.socialMediaInfluencer.subSevas.creator" as TranslationKey, requiresPageLink: true },
      { value: "EDITOR", label: "એડિટર", labelKey: "nimitSevak.sevas.socialMediaInfluencer.subSevas.editor", requiresPageLink: true },
      { value: "VLOGGER", label: "વ્લોગર", labelKey: "nimitSevak.sevas.socialMediaInfluencer.subSevas.vlogger", requiresPageLink: true },
    ],
  },
  { value: "SECURITY", label: "સિક્યોરીટી", labelKey: "nimitSevak.sevas.security" },
  { value: "DRIVING_SARATHI", label: "ડ્રાઇવિંગ / સારથી", labelKey: "nimitSevak.sevas.drivingSarathi" },
  { value: "UNICODE_SHREELIPI_GUJARATI_TYPING", label: "યુનિકોડ / શ્રીલીપી ગુજરાતી ટાઈપિંગ", labelKey: "nimitSevak.sevas.gujaratiTyping" },
  { value: "MS_OFFICE_WORK", label: "એમ એસ ઓફિસ વર્ક", labelKey: "nimitSevak.sevas.msOfficeWork" },
  { value: "CALLIGRAPHY_CREATOR", label: "કેલિગ્રાફી ક્રિએટર", labelKey: "nimitSevak.sevas.calligraphyCreator" as TranslationKey },
  {
    value: "STAGE_PERFORMER",
    label: "સ્ટેજ પર્ફોર્મર",
    labelKey: "nimitSevak.sevas.stagePerformer" as TranslationKey,
    subSevas: [
      { value: "DANCE", label: "ડાન્સ", labelKey: "nimitSevak.sevas.stagePerformer.subSevas.dance" as TranslationKey },
      { value: "DRAMA", label: "ડ્રામા", labelKey: "nimitSevak.sevas.stagePerformer.subSevas.drama" as TranslationKey },
      { value: "COMEDY", label: "કોમેડી", labelKey: "nimitSevak.sevas.stagePerformer.subSevas.comedy" as TranslationKey },
    ],
  },
  {
    value: "MUSIC",
    label: "સંગીત",
    labelKey: "nimitSevak.sevas.music",
    subSevas: [
      { value: "SINGER", label: "ગાયક", labelKey: "nimitSevak.sevas.music.subSevas.singer" },
      { value: "INSTRUMENT", label: "વાદ્ય", labelKey: "nimitSevak.sevas.music.subSevas.instrument" },
    ],
  },
  { value: "PHOTOGRAPHY", label: "ફોટો ગ્રાફી", labelKey: "nimitSevak.sevas.photography" as TranslationKey },
  {
    value: "VIDEOGRAPHY",
    label: "વિડિયો ગ્રાફી",
    labelKey: "nimitSevak.sevas.videography" as TranslationKey,
    subSevas: [
      { value: "DRONE_OPERATOR", label: "ડ્રોન ઓપેરેટર", labelKey: "nimitSevak.sevas.videography.subSevas.droneOperator" as TranslationKey },
      { value: "STANDEE_CAM", label: "સ્ટેનડિ કેમ", labelKey: "nimitSevak.sevas.videography.subSevas.standeeCam" as TranslationKey },
      { value: "LIVE_OPERATOR", label: "લાઈવ ઓપરેટર", labelKey: "nimitSevak.sevas.videography.subSevas.liveOperator" as TranslationKey },
    ],
  },
  { value: "GRAPHICS_DESIGNER", label: "ગ્રાફિક્સ ડિઝાઈનર", labelKey: "nimitSevak.sevas.graphicsDesigner" as TranslationKey },
  { value: "SOUND_ENGINEER", label: "સાઉન્ડ એન્જિ", labelKey: "nimitSevak.sevas.soundEngineer" as TranslationKey },
  { value: "LIPAN", label: "લીપણ", labelKey: "nimitSevak.sevas.lipan" },
  {
    value: "DECORATION",
    label: "ડેકોરેશન",
    labelKey: "nimitSevak.sevas.decoration",
    subSevas: [
      { value: "ART_WORK", label: "આર્ટ વર્ક", labelKey: "nimitSevak.sevas.decoration.subSevas.artWork" },
      { value: "PAINTING", label: "પેંટિંગ", labelKey: "nimitSevak.sevas.decoration.subSevas.painting" },
    ],
  },
  { value: "MASONRY", label: "કડિયા", labelKey: "nimitSevak.sevas.masonry" },
  { value: "MISTRI", label: "મિસ્ત્રી", labelKey: "nimitSevak.sevas.mistri" as TranslationKey },
  { value: "ELECTRICAL", label: "ઇલેક્ટ્રિકલ", labelKey: "nimitSevak.sevas.electrical" },
  { value: "TECHNICIAN", label: "ટેક્નિશિયન", labelKey: "nimitSevak.sevas.technician" },
  { value: "MEDICAL", label: "મેડિકલ", labelKey: "nimitSevak.sevas.medical" },
  { value: "STORE_KEEPER", label: "સ્ટોર કીપર", labelKey: "nimitSevak.sevas.storeKeeper" },
  { value: "CIVIL_ENGINEER", label: "સિવિલ એન્જિ.", labelKey: "nimitSevak.sevas.civilEngineer" },
  {
    value: "OTHER",
    label: "અધર",
    labelKey: "nimitSevak.sevas.other",
    requiresTextInput: true,
    textInputLabelKey: "nimitSevak.otherSevaDetails",
    textInputPlaceholderKey: "nimitSevak.otherSevaDetailsPlaceholder",
  },
]

export const NIMIT_SEVAK_SEVA_VALUES = NIMIT_SEVAK_SEVA_OPTIONS.map((option) => option.value) as string[]

export const NIMIT_SEVAK_VEHICLE_VALUES = [
  "TWO_WHEELER",
  "THREE_WHEELER",
  "FOUR_WHEELER",
  "TRACTOR",
  "JCB",
  "TRUCK_DUMPER",
] as const

export const NIMIT_SEVAK_STATE_OPTIONS: NimitSevakStateOption[] = [
  { gu: "આંધ્ર પ્રદેશ", en: "Andhra Pradesh", hi: "आंध्र प्रदेश" },
  { gu: "અરુણાચલ પ્રદેશ", en: "Arunachal Pradesh", hi: "अरुणाचल प्रदेश" },
  { gu: "આસામ", en: "Assam", hi: "असम" },
  { gu: "બિહાર", en: "Bihar", hi: "बिहार" },
  { gu: "છત્તીસગઢ", en: "Chhattisgarh", hi: "छत्तीसगढ़" },
  { gu: "ગોવા", en: "Goa", hi: "गोवा" },
  { gu: "ગુજરાત", en: "Gujarat", hi: "गुजरात" },
  { gu: "હરિયાણા", en: "Haryana", hi: "हरियाणा" },
  { gu: "હિમાચલ પ્રદેશ", en: "Himachal Pradesh", hi: "हिमाचल प्रदेश" },
  { gu: "ઝારખંડ", en: "Jharkhand", hi: "झारखंड" },
  { gu: "કર્ણાટક", en: "Karnataka", hi: "कर्नाटक" },
  { gu: "કેરળ", en: "Kerala", hi: "केरल" },
  { gu: "મધ્ય પ્રદેશ", en: "Madhya Pradesh", hi: "मध्य प्रदेश" },
  { gu: "મહારાષ્ટ્ર", en: "Maharashtra", hi: "महाराष्ट्र" },
  { gu: "મણિપુર", en: "Manipur", hi: "मणिपुर" },
  { gu: "મેઘાલય", en: "Meghalaya", hi: "मेघालय" },
  { gu: "મિઝોરમ", en: "Mizoram", hi: "मिजोरम" },
  { gu: "નાગાલેન્ડ", en: "Nagaland", hi: "नागालैंड" },
  { gu: "ઓડિશા", en: "Odisha", hi: "ओडिशा" },
  { gu: "પંજાબ", en: "Punjab", hi: "पंजाब" },
  { gu: "રાજસ્થાન", en: "Rajasthan", hi: "राजस्थान" },
  { gu: "સિક્કિમ", en: "Sikkim", hi: "सिक्किम" },
  { gu: "તમિલનાડુ", en: "Tamil Nadu", hi: "तमिलनाडु" },
  { gu: "તેલંગાણા", en: "Telangana", hi: "तेलंगाना" },
  { gu: "ત્રિપુરા", en: "Tripura", hi: "त्रिपुरा" },
  { gu: "ઉત્તર પ્રદેશ", en: "Uttar Pradesh", hi: "उत्तर प्रदेश" },
  { gu: "ઉત્તરાખંડ", en: "Uttarakhand", hi: "उत्तराखंड" },
  { gu: "પશ્ચિમ બંગાળ", en: "West Bengal", hi: "पश्चिम बंगाल" },
] as const

export const getNimitSevakStateOptions = (language: AppLanguage) => {
  return NIMIT_SEVAK_STATE_OPTIONS.map((option) => {
    const label = option[language]
    return {
      value: label,
      label,
    }
  })
}

export const getNimitSevakSevaOption = (value: string) => {
  const normalizedValue = normalizeNimitSevakSevaCode(value)
  return NIMIT_SEVAK_SEVA_OPTIONS.find((option) => option.value === normalizedValue) || null
}

export const createEmptyNimitSevakSevaSelection = (sevaCode: string): NimitSevakSevaSelection => ({
  sevaCode: normalizeNimitSevakSevaCode(sevaCode),
  subSevaCodes: [],
  customValue: null,
  pageLinks: {},
})

export const normalizeNimitSevakSevaSelections = (selections: NimitSevakSevaSelection[]) => {
  return selections.map((selection) => {
    const normalizedSevaCode = normalizeNimitSevakSevaCode(selection.sevaCode)
    const normalizedSubSevaCodes = selection.subSevaCodes.map((subValue) => normalizeNimitSevakSubSevaCode(normalizedSevaCode, subValue))
    const normalizedPageLinks = Object.fromEntries(
      Object.entries(selection.pageLinks || {}).map(([key, value]) => [normalizeNimitSevakSubSevaCode(normalizedSevaCode, key), value]),
    )

    return {
      sevaCode: normalizedSevaCode,
      subSevaCodes: [...new Set(normalizedSubSevaCodes)],
      customValue: selection.customValue,
      pageLinks: normalizedPageLinks,
    }
  })
}

export const formatNimitSevakSevaSelections = (selections: NimitSevakSevaSelection[]) => {
  return normalizeNimitSevakSevaSelections(selections).map((selection) => {
    const normalizedSevaCode = normalizeNimitSevakSevaCode(selection.sevaCode)
    const option = getNimitSevakSevaOption(normalizedSevaCode)
    const normalizedSubSevaCodes = selection.subSevaCodes.map((subValue) => normalizeNimitSevakSubSevaCode(normalizedSevaCode, subValue))
    const parts: string[] = []

    if (normalizedSubSevaCodes.length) {
      const subLabels = normalizedSubSevaCodes
        .map((subValue) => option?.subSevas?.find((sub) => sub.value === subValue)?.label || subValue)
        .join(", ")

      if (subLabels) parts.push(subLabels)
    }

    if (selection.customValue) {
      parts.push(selection.customValue)
    }

    const linkParts = normalizedSubSevaCodes
      .map((subValue) => {
        const link = String(selection.pageLinks[subValue] || selection.pageLinks[Object.keys(selection.pageLinks).find((key) => normalizeNimitSevakSubSevaCode(normalizedSevaCode, key) === subValue) || ""] || "").trim()
        if (!link) return null
        const subLabel = option?.subSevas?.find((sub) => sub.value === subValue)?.label || subValue
        return `${subLabel}: ${link}`
      })
      .filter(Boolean)

    if (linkParts.length) parts.push(linkParts.join(" | "))

    return parts.length ? `${option?.label || normalizedSevaCode} - ${parts.join(" - ")}` : option?.label || normalizedSevaCode
  })
}