-- dictionary.lua
local _, ns = ...
local Dictionary = {}
ns.Dictionary = Dictionary

-- Подключаем Words.lua
local commonData = ns.Common.data
local wordsData = ns.Words.data
local slangWordsData = ns.Slang.data

local phrasesData = ns.Phrases.data
local raidPhrasesData = ns.RaidPhrases.data
local dungeonPhrasesData = ns.DungeonPhrases.data

local index = {
  wordMap = {},   -- lower -> translation
  phraseList = {},-- {pattern, replaceFn/string}
  src = nil, dst = nil,
}

function Dictionary:BuildIndex(src, dst)
  wipe(index.wordMap)
  wipe(index.phraseList)
  index.src, index.dst = src, dst

  -- Слова
  local words = wordsData[src] or {}
  local commons = commonData[src] or {}
  local slangs = slangWordsData[src] or {}

  for _, dict in ipairs({ slangs, commons, words }) do
    for srcWord, map in pairs(dict) do

      local out = map[dst]
      if out then index.wordMap[srcWord:lower()] = out end
    end
  end

  table.sort(index.wordMap, function(a, b)
      return #a > #b   -- сначала более длинные строки
  end)

  -- Фразы (обычные строки или функции)
  local phrases = phrasesData[src] or {}
  local raid_phrases = raidPhrasesData[src] or {}
  local dungeon_phrases = dungeonPhrasesData[src] or {}

  for _, dict in ipairs({ phrases, raid_phrases, dungeon_phrases }) do
    for _, entry in ipairs(dict) do
      if entry.dst == dst then
        local pat = entry.pattern
        local repl = entry.replace
        local isFn = type(repl) == "function"
        table.insert(index.phraseList, { pattern = pat, replace = repl, isFn = isFn })
      end
    end
  end

  table.sort(index.phraseList, function(a, b)
      return #a.pattern > #b.pattern   -- сначала более длинные строки
  end)
end

function Dictionary:GetIndex()
  return index
end

-- Публичное API для расширения словаря в рантайме
function Dictionary:AddWord(src, dst, a, b)
  -- a: исходное слово, b: перевод
  index.wordMap[(a or ""):lower()] = b
end

function Dictionary:AddPhrase(pattern, replace, dst)
  table.insert(index.phraseList, { pattern = pattern, replace = replace, isFn = type(replace) == "function" })
end


SLASH_OTADD1 = "/otadd"
SlashCmdList["OTADD"] = function(msg)
  local src, dst = msg:match("^(%S+)%s*=%s*(.+)$")
  if src and dst then
    ns.Dictionary:AddWord(MagicTranslatorDB.src, MagicTranslatorDB.dst, src, dst)
    print("Добавлено слово:", src, "→", dst)
  else
    print("Использование: /otadd слово=перевод")
  end
end

-- SLASH_RUSFIX1 = "/rusfix"
-- SlashCmdList["RUSFIX"] = function(msg)
--   print(msg)
--   local res = ns.RusFixer:Fix(msg, ns.RusFixer.Gender.Male)
--   DEFAULT_CHAT_FRAME:AddMessage(res)
-- end