/* ============================================================
   Төрмен — справочник адресов Казахстана
   ============================================================ */

const KZ_CITIES = [
  { id: 'almaty', label: { ru: 'Алматы', kz: 'Алматы' }, medusaCity: 'Almaty' },
  { id: 'astana', label: { ru: 'Астана', kz: 'Астана' }, medusaCity: 'Astana' },
  { id: 'shymkent', label: { ru: 'Шымкент', kz: 'Шымкент' }, medusaCity: 'Shymkent' },
  { id: 'karaganda', label: { ru: 'Караганда', kz: 'Қарағанды' }, medusaCity: 'Karaganda' },
  { id: 'aktobe', label: { ru: 'Актобе', kz: 'Ақтөбе' }, medusaCity: 'Aktobe' },
  { id: 'taraz', label: { ru: 'Тараз', kz: 'Тараз' }, medusaCity: 'Taraz' },
  { id: 'pavlodar', label: { ru: 'Павлодар', kz: 'Павлодар' }, medusaCity: 'Pavlodar' },
  { id: 'oskemen', label: { ru: 'Усть-Каменогорск', kz: 'Өскемен' }, medusaCity: 'Oskemen' },
  { id: 'semey', label: { ru: 'Семей', kz: 'Семей' }, medusaCity: 'Semey' },
  { id: 'atyrau', label: { ru: 'Атырау', kz: 'Атырау' }, medusaCity: 'Atyrau' },
  { id: 'kostanay', label: { ru: 'Костанай', kz: 'Қостанай' }, medusaCity: 'Kostanay' },
  { id: 'kyzylorda', label: { ru: 'Кызылорда', kz: 'Қызылорда' }, medusaCity: 'Kyzylorda' },
  { id: 'oral', label: { ru: 'Уральск', kz: 'Орал' }, medusaCity: 'Uralsk' },
  { id: 'petropavl', label: { ru: 'Петропавловск', kz: 'Петропавл' }, medusaCity: 'Petropavl' },
  { id: 'aktau', label: { ru: 'Актау', kz: 'Ақтау' }, medusaCity: 'Aktau' },
  { id: 'temirtau', label: { ru: 'Темиртау', kz: 'Теміртау' }, medusaCity: 'Temirtau' },
  { id: 'turkestan', label: { ru: 'Туркестан', kz: 'Түркістан' }, medusaCity: 'Turkestan' },
  { id: 'kokshetau', label: { ru: 'Кокшетау', kz: 'Көкшетау' }, medusaCity: 'Kokshetau' },
  { id: 'taldykorgan', label: { ru: 'Талдыкорган', kz: 'Талдықорған' }, medusaCity: 'Taldykorgan' },
  { id: 'ekibastuz', label: { ru: 'Экибастуз', kz: 'Екібастұз' }, medusaCity: 'Ekibastuz' },
  { id: 'rudny', label: { ru: 'Рудный', kz: 'Рудный' }, medusaCity: 'Rudny' },
  { id: 'zhanaozen', label: { ru: 'Жанаозен', kz: 'Жаңаөзен' }, medusaCity: 'Zhanaozen' },
  { id: 'balkhash', label: { ru: 'Балхаш', kz: 'Балқаш' }, medusaCity: 'Balkhash' },
  { id: 'kentau', label: { ru: 'Кентау', kz: 'Кентау' }, medusaCity: 'Kentau' },
  { id: 'satpayev', label: { ru: 'Сатпаев', kz: 'Сәтпаев' }, medusaCity: 'Satpayev' },
  { id: 'kaskelen', label: { ru: 'Каскелен', kz: 'Қаскелең' }, medusaCity: 'Kaskelen' },
  { id: 'ridder', label: { ru: 'Риддер', kz: 'Риддер' }, medusaCity: 'Ridder' },
  { id: 'stepnogorsk', label: { ru: 'Степногорск', kz: 'Степногорск' }, medusaCity: 'Stepnogorsk' },
  { id: 'zhezkazgan', label: { ru: 'Жезказган', kz: 'Жезқазған' }, medusaCity: 'Zhezkazgan' },
  { id: 'konaev', label: { ru: 'Конаев', kz: 'Қонаев' }, medusaCity: 'Konaev' },
  { id: 'talgar', label: { ru: 'Талгар', kz: 'Талғар' }, medusaCity: 'Talgar' },
  { id: 'esik', label: { ru: 'Есик', kz: 'Есік' }, medusaCity: 'Esik' },
  { id: 'zharkent', label: { ru: 'Жаркент', kz: 'Жаркент' }, medusaCity: 'Zharkent' },
  { id: 'ayagoz', label: { ru: 'Аягоз', kz: 'Аягөз' }, medusaCity: 'Ayagoz' },
  { id: 'aksu', label: { ru: 'Аксу', kz: 'Ақсу' }, medusaCity: 'Aksu' },
  { id: 'aksai', label: { ru: 'Аксай', kz: 'Ақсай' }, medusaCity: 'Aksai' },
  { id: 'arkalyk', label: { ru: 'Аркалык', kz: 'Арқалық' }, medusaCity: 'Arkalyk' },
  { id: 'aral', label: { ru: 'Аральск', kz: 'Арал' }, medusaCity: 'Aral' },
  { id: 'atbasar', label: { ru: 'Атбасар', kz: 'Атбасар' }, medusaCity: 'Atbasar' },
  { id: 'baikonur', label: { ru: 'Байконыр', kz: 'Байқоңыр' }, medusaCity: 'Baikonur' },
  { id: 'zhitikara', label: { ru: 'Житикара', kz: 'Жітіқара' }, medusaCity: 'Zhitikara' },
  { id: 'zaysan', label: { ru: 'Зайсан', kz: 'Зайсан' }, medusaCity: 'Zaysan' },
  { id: 'kandyagash', label: { ru: 'Кандыагаш', kz: 'Қандыағаш' }, medusaCity: 'Kandyagash' },
  { id: 'karatau', label: { ru: 'Каратау', kz: 'Қаратау' }, medusaCity: 'Karatau' },
  { id: 'kulsary', label: { ru: 'Кульсары', kz: 'Құлсары' }, medusaCity: 'Kulsary' },
  { id: 'lisakovsk', label: { ru: 'Лисаковск', kz: 'Лисаковск' }, medusaCity: 'Lisakovsk' },
  { id: 'makinsk', label: { ru: 'Макинск', kz: 'Макинск' }, medusaCity: 'Makinsk' },
  { id: 'saran', label: { ru: 'Сарань', kz: 'Саран' }, medusaCity: 'Saran' },
  { id: 'shakhtinsk', label: { ru: 'Шахтинск', kz: 'Шахтинск' }, medusaCity: 'Shakhtinsk' },
  { id: 'shu', label: { ru: 'Шу', kz: 'Шу' }, medusaCity: 'Shu' },
  { id: 'shchuchinsk', label: { ru: 'Щучинск', kz: 'Щучинск' }, medusaCity: 'Shchuchinsk' },
  { id: 'khromtau', label: { ru: 'Хромтау', kz: 'Хромтау' }, medusaCity: 'Khromtau' },
  { id: 'emba', label: { ru: 'Эмба', kz: 'Ембі' }, medusaCity: 'Emba' },
  { id: 'priozersk', label: { ru: 'Приозерск', kz: 'Приозерск' }, medusaCity: 'Priozersk' },
  { id: 'abay_city', label: { ru: 'Абай', kz: 'Абай' }, medusaCity: 'Abay' },
  { id: 'zhanatas', label: { ru: 'Жанатас', kz: 'Жаңатас' }, medusaCity: 'Zhanatas' },
  { id: 'zhetysay', label: { ru: 'Жетысай', kz: 'Жетісай' }, medusaCity: 'Zhetysay' },
  { id: 'kapshagai', label: { ru: 'Капшагай', kz: 'Қапшағай' }, medusaCity: 'Kapshagai' },
  { id: 'serebryansk', label: { ru: 'Серебрянск', kz: 'Серебрянск' }, medusaCity: 'Serebryansk' },
  { id: 'kazalinsk', label: { ru: 'Казалинск', kz: 'Қазалы' }, medusaCity: 'Kazalinsk' },
  { id: 'fort_shevchenko', label: { ru: 'Форт-Шевченко', kz: 'Форт-Шевченко' }, medusaCity: 'Fort-Shevchenko' },
  { id: 'zhanaarka', label: { ru: 'Жанаарка', kz: 'Жаңаарқа' }, medusaCity: 'Zhanaarka' },
  { id: 'usharal', label: { ru: 'Ушарал', kz: 'Үшарал' }, medusaCity: 'Usharal' },
  { id: 'tekeli', label: { ru: 'Текели', kz: 'Текелі' }, medusaCity: 'Tekeli' },
  { id: 'saryagash', label: { ru: 'Сарыагаш', kz: 'Сарыағаш' }, medusaCity: 'Saryagash' },
  { id: 'shardara', label: { ru: 'Шардара', kz: 'Шардара' }, medusaCity: 'Shardara' },
  { id: 'aiteke_bi', label: { ru: 'Айтеке би', kz: 'Айтеке би' }, medusaCity: 'Aiteke Bi' },
  { id: 'zhosaly', label: { ru: 'Жосалы', kz: 'Жосалы' }, medusaCity: 'Zhosaly' },
  { id: 'derzhavinsk', label: { ru: 'Державинск', kz: 'Державинск' }, medusaCity: 'Derzhavinsk' },
  { id: 'ereymentau', label: { ru: 'Ерейментау', kz: 'Ерейментау' }, medusaCity: 'Ereymentau' },
  { id: 'esil_city', label: { ru: 'Есиль', kz: 'Есіл' }, medusaCity: 'Esil' },
  { id: 'kachiry', label: { ru: 'Качиры', kz: 'Кәшір' }, medusaCity: 'Kachiry' },
  { id: 'sergeevka', label: { ru: 'Сергеевка', kz: 'Сергеевка' }, medusaCity: 'Sergeevka' },
  { id: 'taiynsha', label: { ru: 'Тайынша', kz: 'Тайынша' }, medusaCity: 'Taiynsha' },
  { id: 'timiryazevo', label: { ru: 'Тимирязево', kz: 'Тимирязево' }, medusaCity: 'Timiryazevo' },
];

const KZ_PINNED_CITIES = ['almaty', 'astana', 'shymkent'];

const KZ_DISTRICTS = {
  almaty: [
    { id: 'almaly', label: { ru: 'Алмалинский район', kz: 'Алмалы ауданы' } },
    { id: 'auezov', label: { ru: 'Ауэзовский район', kz: 'Әуезов ауданы' } },
    { id: 'bostandyk', label: { ru: 'Бостандыкский район', kz: 'Бостандық ауданы' } },
    { id: 'zhetysu', label: { ru: 'Жетысуский район', kz: 'Жетісу ауданы' } },
    { id: 'medeu', label: { ru: 'Медеуский район', kz: 'Медеу ауданы' } },
    { id: 'nauryzbay', label: { ru: 'Наурызбайский район', kz: 'Наурызбай ауданы' } },
    { id: 'turksib', label: { ru: 'Турксибский район', kz: 'Түрксіб ауданы' } },
    { id: 'alatau', label: { ru: 'Алатауский район', kz: 'Алатау ауданы' } },
    { id: 'samal1', label: { ru: 'мкр. Самал-1', kz: 'мкр. Самал-1' } },
    { id: 'samal2', label: { ru: 'мкр. Самал-2', kz: 'мкр. Самал-2' } },
    { id: 'koktem', label: { ru: 'мкр. Коктем', kz: 'мкр. Көктем' } },
    { id: 'orbita', label: { ru: 'мкр. Орбита', kz: 'мкр. Орбита' } },
    { id: 'aksay', label: { ru: 'мкр. Аксай', kz: 'мкр. Ақсай' } },
    { id: 'nurlytau', label: { ru: 'мкр. Нурлытау', kz: 'мкр. Нұрлытау' } },
    { id: 'dostyk', label: { ru: 'мкр. Достык', kz: 'мкр. Достық' } },
    { id: 'zhuldyz', label: { ru: 'мкр. Жулдыз', kz: 'мкр. Жұлдыз' } },
    { id: 'kazakhfilm', label: { ru: 'мкр. Казахфильм', kz: 'мкр. Қазақфильм' } },
    { id: 'taugul', label: { ru: 'мкр. Таугуль', kz: 'мкр. Таугүл' } },
    { id: 'ainabulak', label: { ru: 'мкр. Айнабулак', kz: 'мкр. Айнабұлақ' } },
    { id: 'kalkaman', label: { ru: 'мкр. Калкаман', kz: 'мкр. Қалқаман' } },
    { id: 'zarya_vostoka', label: { ru: 'мкр. Заря Востока', kz: 'мкр. Шығыс зарясы' } },
  ],
  astana: [
    { id: 'almaty_dist', label: { ru: 'Алматинский район', kz: 'Алматы ауданы' } },
    { id: 'saryarka', label: { ru: 'Сарыарка', kz: 'Сарыарқа' } },
    { id: 'esil', label: { ru: 'Есильский район', kz: 'Есіл ауданы' } },
    { id: 'baikonur', label: { ru: 'Байконур', kz: 'Байқоңыр' } },
    { id: 'nura', label: { ru: 'Нура', kz: 'Нұра' } },
    { id: 'keruen', label: { ru: 'мкр. Керуен', kz: 'мкр. Керуен' } },
    { id: 'zhuldyz_ast', label: { ru: 'мкр. Жулдыз', kz: 'мкр. Жұлдыз' } },
    { id: 'left_bank', label: { ru: 'Левый берег', kz: 'Сол жаға' } },
    { id: 'right_bank', label: { ru: 'Правый берег', kz: 'Оң жаға' } },
  ],
  shymkent: [
    { id: 'abay', label: { ru: 'Абайский район', kz: 'Абай ауданы' } },
    { id: 'al_farabi', label: { ru: 'Аль-Фарабийский район', kz: 'Әл-Фараби ауданы' } },
    { id: 'enbekshi', label: { ru: 'Енбекшинский район', kz: 'Еңбекші ауданы' } },
    { id: 'karatau', label: { ru: 'Каратауский район', kz: 'Қаратау ауданы' } },
    { id: 'turan', label: { ru: 'мкр. Туран', kz: 'мкр. Тұран' } },
    { id: 'nursat', label: { ru: 'мкр. Нурсат', kz: 'мкр. Нұрсат' } },
  ],
  karaganda: [
    { id: 'kazybek', label: { ru: 'им. Казыбек би', kz: 'Қазыбек би атындағы' } },
    { id: 'oktyabr', label: { ru: 'Октябрьский район', kz: 'Октябрь ауданы' } },
    { id: 'maikuduk', label: { ru: 'мкр. Майкудук', kz: 'мкр. Майкүдік' } },
    { id: 'mikhailovka', label: { ru: 'мкр. Михайловка', kz: 'мкр. Михайловка' } },
  ],
};

function kzNorm(s){
  return String(s || '')
    .toLowerCase()
    .replace(/ё/g, 'е')
    .replace(/ә/g, 'а')
    .replace(/ғ/g, 'г')
    .replace(/қ/g, 'к')
    .replace(/ң/g, 'н')
    .replace(/ө/g, 'о')
    .replace(/ұ/g, 'у')
    .replace(/ү/g, 'у')
    .replace(/һ/g, 'х')
    .replace(/і/g, 'и')
    .replace(/[^a-z0-9\u0400-\u04ff]+/g, ' ')
    .trim();
}

function kzCityById(id){
  return KZ_CITIES.find(c => c.id === id) || KZ_CITIES[0];
}

function kzCityLabel(c, lang){
  return c?.label?.[lang === 'kz' ? 'kz' : 'ru'] || c?.label?.ru || '';
}

function kzDistrictLabel(d, lang){
  return d?.label?.[lang === 'kz' ? 'kz' : 'ru'] || d?.label?.ru || '';
}

function kzHasDistrictList(cityId){
  return (KZ_DISTRICTS[cityId] || []).length > 0;
}

function getKzCityOptions(lang){
  const L = lang === 'kz' ? 'kz' : 'ru';
  const pinned = KZ_PINNED_CITIES.map(id => KZ_CITIES.find(c => c.id === id)).filter(Boolean);
  const rest = KZ_CITIES
    .filter(c => !KZ_PINNED_CITIES.includes(c.id))
    .sort((a, b) => a.label[L].localeCompare(b.label[L], L === 'kz' ? 'kk' : 'ru'));
  return [...pinned, ...rest].map(c => ({
    id: c.id,
    label: c.label[L],
    search: `${c.label.ru} ${c.label.kz} ${c.medusaCity}`,
  }));
}

function kzMatchDistrict(cityId, input, lang){
  const raw = String(input || '').trim();
  if(!raw) return null;
  const norm = kzNorm(raw);
  const list = KZ_DISTRICTS[cityId] || [];
  for(const d of list){
    const ru = kzNorm(d.label.ru);
    const kz = kzNorm(d.label.kz);
    if(norm === ru || norm === kz) return d;
  }
  for(const d of list){
    const ru = kzNorm(d.label.ru);
    const kz = kzNorm(d.label.kz);
    if(ru.startsWith(norm) || kz.startsWith(norm) || norm.startsWith(ru) || norm.startsWith(kz)) return d;
  }
  return null;
}

function kzValidDistrictFree(s){
  const t = String(s || '').trim();
  return t.length >= 3 && /[a-zA-Z\u0400-\u04FF]/.test(t);
}

function kzValidStreet(s){
  const t = String(s || '').trim();
  return t.length >= 4 && /[a-zA-Z\u0400-\u04FF]/.test(t);
}

function validateKzAddress({ city, district, street }, lang){
  const cityRec = kzCityById(city);
  const hasList = kzHasDistrictList(cityRec.id);
  const districtRec = hasList ? kzMatchDistrict(cityRec.id, district, lang) : null;
  const districtFree = !hasList ? String(district || '').trim() : '';
  const districtOk = hasList ? !!districtRec : kzValidDistrictFree(district);
  const streetOk = kzValidStreet(street);
  const errors = {};
  if(!districtOk) errors.district = true;
  if(!streetOk) errors.street = true;
  const districtOut = districtRec || (districtOk ? { id: 'free', label: { ru: districtFree, kz: districtFree } } : null);
  return {
    valid: districtOk && streetOk,
    city: cityRec,
    district: districtOut,
    errors,
    formatted: districtOk && streetOk
      ? formatKzAddress({ city: cityRec, district: districtOut, street, comment: '' }, lang)
      : '',
  };
}

function formatKzAddress({ city, district, street, comment }, lang){
  const cityLabel = typeof city === 'string' ? kzCityLabel(kzCityById(city), lang) : kzCityLabel(city, lang);
  const districtLabel = typeof district === 'string'
    ? district
    : kzDistrictLabel(district, lang);
  const parts = [cityLabel, districtLabel, String(street || '').trim()];
  if(comment && String(comment).trim()) parts.push(String(comment).trim());
  return parts.filter(Boolean).join(', ');
}

function getKzDistrictOptions(cityId, lang){
  return (KZ_DISTRICTS[cityId] || []).map(d => ({
    id: d.id,
    label: kzDistrictLabel(d, lang),
    search: `${d.label.ru} ${d.label.kz}`,
  }));
}

Object.assign(window, {
  KZ_CITIES,
  KZ_PINNED_CITIES,
  getKzCityOptions,
  getKzDistrictOptions,
  validateKzAddress,
  formatKzAddress,
  kzMatchDistrict,
  kzCityById,
  kzHasDistrictList,
});