import type { Locale } from './localeCodes';
import { enemyTypeLabel } from './loadLocales';
import { npcByIdKeyLabel } from './npcGeneratedNames';

/** Stable keys aligned with backend migrations / model constants. */
export const WANDERING_MERCHANT_NPC_KEY = 'npc.wandering_merchant.v1';
export const WANDERING_MERCHANT_DIALOGUE_KEY = 'npc.wandering_merchant.dialogue.v1';

type Bilingual = { en: string; ru: string };

/** Matches `towns.id` in DB / migrations (000026 name_key order). */
export const TOWN_ID_TO_NAME_KEY: Record<number, string> = {
  1: 'town.willowdale.v1',
  2: 'town.thornwatch.v1',
  3: 'town.ashengard.v1',
  4: 'town.redcliff.v1',
  5: 'town.boghollow.v1',
  6: 'town.cinderkeep.v1',
  7: 'town.starfall.v1',
  8: 'town.mossharbor.v1',
  9: 'town.emberwell.v1',
  10: 'town.frostmark.v1',
  11: 'town.duskwatch.v1',
  12: 'town.silverstep.v1',
  13: 'town.copperfield.v1',
  14: 'town.ashford.v1',
  15: 'town.millbrook.v1',
  16: 'town.stonebend.v1',
  17: 'town.highspire.v1',
  18: 'town.saltmere.v1',
  19: 'town.ironpost.v1',
  20: 'town.greyfen.v1',
  21: 'town.dunewatch.v1',
  22: 'town.coldbarrow.v1',
  23: 'town.mistral.v1',
  24: 'town.hollowmere.v1',
  25: 'town.ashfen.v1',
  26: 'town.thornmere.v1',
  27: 'town.windgarde.v1',
  28: 'town.frosthollow.v1',
  29: 'town.sungrasp.v1',
  30: 'town.glimmerford.v1',
  31: 'town.starveil.v1',
  32: 'town.capital.v1',
};

/** Localized town label from numeric `towns.id` (visit_town quest target, etc.). */
export function townDisplayById(
  locale: Locale,
  townId: number | undefined | null,
  fallback: string,
): string {
  if (townId == null || !Number.isFinite(townId)) return fallback;
  const key = TOWN_ID_TO_NAME_KEY[Math.trunc(townId)];
  return key ? townLabel(locale, key, fallback) : fallback;
}

/** Russian: pragmatic transliteration of English fantasy names (see docs/i18n-display-rules.md). */
const TOWNS: Record<string, Bilingual> = {
  'town.willowdale.v1': { en: 'Willowdale', ru: 'Виллоудейл' },
  'town.thornwatch.v1': { en: 'Thornwatch', ru: 'Торнвотч' },
  'town.ashengard.v1': { en: 'Ashengard', ru: 'Ашенгард' },
  'town.redcliff.v1': { en: 'Redcliff', ru: 'Редклифф' },
  'town.boghollow.v1': { en: 'Boghollow', ru: 'Богхоллоу' },
  'town.cinderkeep.v1': { en: 'Cinderkeep', ru: 'Синдеркип' },
  'town.starfall.v1': { en: 'Starfall', ru: 'Старфолл' },
  'town.mossharbor.v1': { en: 'Mossharbor', ru: 'Моссхарбор' },
  'town.emberwell.v1': { en: 'Emberwell', ru: 'Эмбервелл' },
  'town.frostmark.v1': { en: 'Frostmark', ru: 'Фростмарк' },
  'town.duskwatch.v1': { en: 'Duskwatch', ru: 'Дасквотч' },
  'town.silverstep.v1': { en: 'Silverstep', ru: 'Сильверстеп' },
  'town.copperfield.v1': { en: 'Copperfield', ru: 'Копперфилд' },
  'town.ashford.v1': { en: 'Ashford', ru: 'Эшфорд' },
  'town.millbrook.v1': { en: 'Millbrook', ru: 'Милбрук' },
  'town.stonebend.v1': { en: 'Stonebend', ru: 'Стоунбенд' },
  'town.highspire.v1': { en: 'Highspire', ru: 'Хайспайр' },
  'town.saltmere.v1': { en: 'Saltmere', ru: 'Солтмиер' },
  'town.ironpost.v1': { en: 'Ironpost', ru: 'Айронпост' },
  'town.greyfen.v1': { en: 'Greyfen', ru: 'Грейфен' },
  'town.dunewatch.v1': { en: 'Dunewatch', ru: 'Дьюнвотч' },
  'town.coldbarrow.v1': { en: 'Coldbarrow', ru: 'Колдбарроу' },
  'town.mistral.v1': { en: 'Mistral', ru: 'Мистраль' },
  'town.hollowmere.v1': { en: 'Hollowmere', ru: 'Холлоумир' },
  'town.ashfen.v1': { en: 'Ashfen', ru: 'Эшфен' },
  'town.thornmere.v1': { en: 'Thornmere', ru: 'Торнмир' },
  'town.windgarde.v1': { en: 'Windgarde', ru: 'Виндгард' },
  'town.frosthollow.v1': { en: 'Frosthollow', ru: 'Фростхоллоу' },
  'town.sungrasp.v1': { en: 'Sungrasp', ru: 'Санграсп' },
  'town.glimmerford.v1': { en: 'Glimmerford', ru: 'Глиммерфорд' },
  'town.starveil.v1': { en: 'Starveil', ru: 'Старвейл' },
  'town.capital.v1': { en: 'Capital', ru: 'Столица' },
};

const NPCS: Record<string, Bilingual> = {
  'npc.elder_maren.v1': { en: 'Maren Thistlewood', ru: 'Марен Тистлвуд' },
  'npc.peddler_finn.v1': { en: 'Finn Marlow', ru: 'Финн Марлоу' },
  'npc.sister_asha.v1': { en: 'Asha Kentwell', ru: 'Аша Кентвелл' },
  'npc.guard_halric.v1': { en: 'Halric Morrow', ru: 'Халрик Морроу' },
  'npc.trader_wynn.v1': { en: 'Wynn Cartwright', ru: 'Винн Картрайт' },
  'npc.scholar_orin.v1': { en: 'Orin Aldgate', ru: 'Орин Олдгейт' },
  'npc.bone_merchant.v1': { en: 'Osbert Waynwood', ru: 'Осберт Вейнвуд' },
  'npc.priestess_liora.v1': { en: 'Liora Selwyn', ru: 'Лиора Селвин' },
  'npc.brandric_thacker.v1': { en: 'Brandric Thacker', ru: 'Брандрик Тэкер' },
  'npc.conrad_pitwright.v1': { en: 'Conrad Pitwright', ru: 'Конрад Питрайт' },
  'npc.nessa_bramble.v1': { en: 'Nessa Bramble', ru: 'Несса Брамбл' },
  'npc.torin_marshwick.v1': { en: 'Torin Marshwick', ru: 'Торин Маршвик' },
  'npc.renulf_broadmere.v1': { en: 'Renulf Broadmere', ru: 'Ренульф Бродмир' },
  'npc.kael_ironwright.v1': { en: 'Kael Ironwright', ru: 'Кейл Айронрайт' },
  'npc.edmund_cinderwell.v1': { en: 'Edmund Cinderwell', ru: 'Эдмунд Синдервелл' },
  'npc.aelith_northgate.v1': { en: 'Aelith Northgate', ru: 'Аэлит Нортгейт' },
  'npc.dorian_hawke.v1': { en: 'Dorian Hawke', ru: 'Дориан Хоук' },
  'npc.mariel_starling.v1': { en: 'Mariel Starling', ru: 'Мариэль Старлинг' },
  'npc.milo_ropewalk.v1': { en: 'Milo Ropewalk', ru: 'Мило Роупуок' },
  'npc.lissa_harcourt.v1': { en: 'Lissa Harcourt', ru: 'Лисса Харкорт' },
  'npc.jasper_kindling.v1': { en: 'Jasper Kindling', ru: 'Джаспер Киндлинг' },
  'npc.kess_wiley.v1': { en: 'Kess Wiley', ru: 'Кесс Уайли' },
  'npc.aldwin_relicton.v1': { en: 'Aldwin Relicton', ru: 'Олдвин Реликтон' },
  'npc.torvik_grimstad.v1': { en: 'Torvik Grimstad', ru: 'Торвик Гримстад' },
  'npc.morna_fenwick.v1': { en: 'Morna Fenwick', ru: 'Морна Фенвик' },
  'npc.morah_ellis.v1': { en: 'Morah Ellis', ru: 'Мора Эллис' },
  [WANDERING_MERCHANT_NPC_KEY]: { en: 'Gillen Porter', ru: 'Гиллен Портер' },
  'npc.clerk_sera.v1': { en: 'Sera Whitcomb', ru: 'Сера Уиткомб' },
  'npc.notary_bram.v1': { en: 'Bram Ashcombe', ru: 'Брам Эшкомб' },
  'npc.copper_nils.v1': { en: 'Nils Copperton', ru: 'Нилс Коппертон' },
  'npc.tin_mara.v1': { en: 'Mara Tinwell', ru: 'Мара Тинвелл' },
  'npc.sister_calm.v1': { en: 'Agnes Stillwater', ru: 'Агнес Стилуотер' },
  'npc.foreman_rook.v1': { en: 'Rodrick Cantrell', ru: 'Родрик Кантрелл' },
  'npc.wire_merchant.v1': { en: 'Wulfric Strand', ru: 'Вульфрик Стрэнд' },
  'npc.bolt_jada.v1': { en: 'Jada Boltwright', ru: 'Джада Болтрайт' },
  'npc.sage_mottle.v1': { en: 'Alaric Motlow', ru: 'Аларик Мотлоу' },
  'npc.warden_pike.v1': { en: 'Percival Pike', ru: 'Персиваль Пайк' },
  'npc.ash_vendor.v1': { en: 'Eadric Ashenford', ru: 'Эадрик Эшенфорд' },
  'npc.scrap_yori.v1': { en: 'Yoric Scarn', ru: 'Йорик Скарн' },
  'npc.herb_rill.v1': { en: 'Rillian Hereward', ru: 'Риллиан Херуорд' },
  'npc.miller_tove.v1': { en: 'Tove Millerson', ru: 'Тове Миллерсон' },
  'npc.grain_peddler.v1': { en: 'Gareth Grantham', ru: 'Гарет Грантам' },
  'npc.sack_ren.v1': { en: 'Renulf Sackville', ru: 'Ренульф Саквилл' },
  'npc.brother_salve.v1': { en: 'Bernard Lukin', ru: 'Бернард Лукин' },
  'npc.stone_judge.v1': { en: 'Aldwin Grimston', ru: 'Олдвим Гримстон' },
  'npc.edge_trader.v1': { en: 'Edmund Edgerton', ru: 'Эдмунд Эджертон' },
  'npc.crack_merchant.v1': { en: 'Crispin Aylesford', ru: 'Криспин Эйлсфорд' },
  'npc.sister_flint.v1': { en: 'Brunhild Flint', ru: 'Брунхильд Флинт' },
  'npc.starward_oren.v1': { en: 'Oren Starward', ru: 'Орен Старворд' },
  'npc.spire_imports.v1': { en: 'Simon Spirewell', ru: 'Саймон Спайрвелл' },
  'npc.comet_outfitter.v1': { en: 'Hugh Comstock', ru: 'Хью Комсток' },
  'npc.void_medic.v1': { en: 'Yves Portier', ru: 'Ив Портье' },
  'npc.brine_archivist.v1': { en: 'Cedric Brinewell', ru: 'Седрик Брайнвелл' },
  'npc.salt_broker.v1': { en: 'Osmund Salter', ru: 'Осмунд Солтер' },
  'npc.reed_trader.v1': { en: 'Rhys Reedman', ru: 'Рис Ридман' },
  'npc.mud_healer.v1': { en: 'Godfrey Middleton', ru: 'Годфри Миддлтон' },
  'npc.post_warden.v1': { en: 'Wystan Postlethwaite', ru: 'Вистан Постлтвейт' },
  'npc.ironmonger.v1': { en: 'Ivo Ironside', ru: 'Иво Айронсайд' },
  'npc.rivet_seller.v1': { en: 'Roland Rivett', ru: 'Роланд Риветт' },
  'npc.forge_medic.v1': { en: 'Lucan Forrest', ru: 'Люкан Форрест' },
  'npc.bog_chronicler.v1': { en: 'Alaric Boghurst', ru: 'Аларик Богхерст' },
  'npc.fen_notary.v1': { en: 'Norbert Fenwick', ru: 'Норберт Фенвик' },
  'npc.mire_merchant.v1': { en: 'Miles Myreham', ru: 'Майлз Майрэм' },
  'npc.reed_coin.v1': { en: 'Cuthbert Reed', ru: 'Кутберт Рид' },
  'npc.swamp_mender.v1': { en: 'Wendel Marsham', ru: 'Вендел Маршам' },
  'npc.dune_scout.v1': { en: 'Sigurd Dunstan', ru: 'Сигурд Дунстан' },
  'npc.silt_trader.v1': { en: 'Silas Siltwell', ru: 'Сайлас Силтвелл' },
  'npc.sand_peddler.v1': { en: 'Peter Sanderson', ru: 'Питер Сандерсон' },
  'npc.grit_healer.v1': { en: 'Griselda Holt', ru: 'Грисельда Холт' },
  'npc.barrow_keeper.v1': { en: 'Bartholomew Howe', ru: 'Бартоломью Хоу' },
  'npc.bone_outfitter.v1': { en: 'Baldwin Bonewright', ru: 'Болдуин Бонрайт' },
  'npc.cold_peddler.v1': { en: 'Cole Aldridge', ru: 'Кол Олдридж' },
  'npc.shroud_medic.v1': { en: 'Shadrach Morrow', ru: 'Шадрак Морроу' },
  'npc.mist_ranger.v1': { en: 'Rowan Mistwell', ru: 'Роуан Миствелл' },
  'npc.fog_trader.v1': { en: 'Fergus Fogarty', ru: 'Фергус Фогарти' },
  'npc.dew_merchant.v1': { en: 'Dewi Tarrant', ru: 'Дьюи Таррант' },
  'npc.vapor_healer.v1': { en: 'Vespasian Vale', ru: 'Веспасиан Вейл' },
  'npc.hollow_scribe.v1': { en: 'Hugo Holloway', ru: 'Хьюго Холлоуэй' },
  'npc.mer_imports.v1': { en: 'Meredith Stowe', ru: 'Мередит Стоу' },
  'npc.rot_trader.v1': { en: 'Roderick Rotherham', ru: 'Родрик Ротерем' },
  'npc.bog_medic.v1': { en: 'Beatrice Boghurst', ru: 'Беатрис Богхерст' },
  'npc.herald_ash.v1': { en: 'Ashford Hale', ru: 'Эшфорд Хейл' },
  'npc.cinder_seller.v1': { en: 'Cyril Cinders', ru: 'Сирил Синдерс' },
  'npc.ember_peddler.v1': { en: 'Emrys Emberly', ru: 'Эмрис Эмберли' },
  'npc.ash_healer.v1': { en: 'Alicia Ashford', ru: 'Алисия Эшфорд' },
  'npc.thorn_watcher.v1': { en: 'Thorne Hawthorn', ru: 'Торн Хоторн' },
  'npc.briar_trader.v1': { en: 'Brian Briarton', ru: 'Брайан Брайартон' },
  'npc.root_seller.v1': { en: 'Rowan Rootwell', ru: 'Роуан Рутвелл' },
  'npc.leaf_medic.v1': { en: 'Leofric Leaford', ru: 'Леофрик Лиффорд' },
  'npc.gale_factor.v1': { en: 'Galfrid Gales', ru: 'Галфрид Гейлс' },
  'npc.wind_outfitter.v1': { en: 'Wynstan Windham', ru: 'Винстан Виндхэм' },
  'npc.gust_peddler.v1': { en: 'Gustav Merseburg', ru: 'Густав Мерсебург' },
  'npc.breeze_healer.v1': { en: 'Blaise Brissot', ru: 'Блез Бриссо' },
  'npc.frost_archivist.v1': { en: 'Archibald Frostwick', ru: 'Арчибальд Фроствик' },
  'npc.rime_trader.v1': { en: 'Rhys Rimer', ru: 'Рис Ример' },
  'npc.hoarfrost_seller.v1': { en: 'Horace Hoarwell', ru: 'Хорас Хоаруэлл' },
  'npc.ice_medic.v1': { en: 'Isolde Ismay', ru: 'Изольда Измей' },
  'npc.sun_warden.v1': { en: 'Solomon Sunderland', ru: 'Соломон Сандерленд' },
  'npc.cliff_merchant.v1': { en: 'Clifford Cliffeton', ru: 'Клиффорд Клиффетон' },
  'npc.crag_peddler.v1': { en: 'Craig Cragwell', ru: 'Крейг Крагвелл' },
  'npc.dust_healer.v1': { en: 'Dustin Harwell', ru: 'Дастин Харуэлл' },
  'npc.ford_marshal.v1': { en: 'Marshall Fordham', ru: 'Маршалл Фордхэм' },
  'npc.river_trader.v1': { en: 'Rivers Trent', ru: 'Риверс Трент' },
  'npc.bridge_seller.v1': { en: 'Bridges Ballard', ru: 'Бриджес Баллард' },
  'npc.stream_medic.v1': { en: 'Sterling Brook', ru: 'Стерлинг Брук' },
  'npc.veil_seer.v1': { en: 'Sevrin Veilcourt', ru: 'Севрин Вейлкорт' },
  'npc.star_trader.v1': { en: 'Sterling Starwell', ru: 'Стерлинг Старвелл' },
  'npc.nebula_peddler.v1': { en: 'Neville Nevett', ru: 'Невилл Неветт' },
  'npc.veil_mender_starveil.v1': { en: 'Vera Veilhart', ru: 'Вера Вейлхарт' },
  'npc.capital.merchant_clerk.v1': { en: 'Hugh Pennington', ru: 'Хью Пеннингтон' },
  'npc.capital.armorer.v1': { en: "Raoul d'Aubigny", ru: 'Рауль д’Обиньи' },
  'npc.capital.smith.v1': { en: 'Gilles Ferron', ru: 'Жиль Феррон' },
  'npc.capital.jeweler.v1': { en: 'Ysabel Tremaine', ru: 'Изабель Тремейн' },
  'npc.capital.bounty_agent_a.v1': { en: 'Roderick Vaughn', ru: 'Родрик Вон' },
  'npc.capital.bounty_agent_b.v1': { en: 'Matteo Fabbri', ru: 'Маттео Фаббри' },
  'npc.capital.elder.v1': { en: 'Anselm Corwyn', ru: 'Ансельм Корвин' },
  'npc.capital.healer.v1': { en: 'Clothilde Mercier', ru: 'Клотильда Мерсье' },
  'npc.capital.second_armorer.v1': { en: 'Bertrand Hale', ru: 'Бертранд Хейл' },
  'npc.capital.second_jeweler.v1': { en: 'Eleonore Rivard', ru: 'Элеонор Ривар' },
};

const DIALOGUES: Record<string, Bilingual> = {
  [WANDERING_MERCHANT_DIALOGUE_KEY]: {
    en: 'A hooded merchant blocks your path, jingling a pouch of odd trinkets.',
    ru: 'В капюшоне торговец преграждает путь, звеня мешочком с безделушками.',
  },
};

function pick(locale: Locale, b: Bilingual): string {
  return locale === 'ru' ? b.ru : b.en;
}

export function townLabel(locale: Locale, key: string | undefined, fallback: string): string {
  if (!key) return fallback;
  const b = TOWNS[key];
  return b ? pick(locale, b) : fallback;
}

export function npcLabel(locale: Locale, key: string | undefined, fallback: string): string {
  if (!key) return fallback;
  const byId = npcByIdKeyLabel(locale, key);
  if (byId) return byId;
  const b = NPCS[key];
  return b ? pick(locale, b) : fallback;
}

export function dialogueText(locale: Locale, key: string | undefined, fallback: string): string {
  if (!key) return fallback;
  const b = DIALOGUES[key];
  return b ? pick(locale, b) : fallback;
}

/**
 * Display name for an enemy template: optional i18n by `enemies.type`, else DB name, else slug.
 * @param enemyTypeSlug - value of `enemies.type` / API `enemy.type`
 * @param dbName - `enemies.name` from API (English); used when no entry in locale `enemy_types`
 */
export function enemyFamilyLabel(locale: Locale, enemyTypeSlug: string, dbName: string): string {
  const slug = enemyTypeSlug?.trim() ?? '';
  const fromLocale = slug ? enemyTypeLabel(locale, slug) : '';
  if (fromLocale) return fromLocale;
  const name = dbName?.trim();
  if (name) return name;
  return slug || dbName;
}
