-- chat_filter.lua
local _, ns = ...
local ChatFilter = {}
ns.ChatFilter = ChatFilter

local EVENTS = {
  "CHAT_MSG_SAY",
  "CHAT_MSG_YELL",
  "CHAT_MSG_CHANNEL",
  "CHAT_MSG_WHISPER",
  "CHAT_MSG_PARTY",
  "CHAT_MSG_PARTY_LEADER",
  "CHAT_MSG_RAID",
  "CHAT_MSG_RAID_LEADER",
  "CHAT_MSG_INSTANCE_CHAT",
  "CHAT_MSG_INSTANCE_CHAT_LEADER",
  "CHAT_MSG_GUILD",
  "CHAT_MSG_OFFICER",
  --"CHAT_MSG_BN_WHISPER",
  "CHAT_MSG_COMMUNITIES_CHANNEL"
}

local function colorize(text, color)
  local r, g, b = color.r or 1, color.g or 1, color.b or 1
  local hex = string.format("|cff%02x%02x%02x ", math.floor(r*255), math.floor(g*255), math.floor(b*255))
  return hex .. text .. "|r"
end

-- Проверка: все слова состоят только из кириллицы
local function all_cyrillic_words(text)
    -- Убираем всё, кроме букв и пробелов
    local clean = text:gsub("[^%z\1-\127\194-\244%s]", "")

    for word in clean:gmatch("%S+") do
        -- Проверяем, что слово состоит только из кириллических символов
        if not word:match("^[\208-\209][\128-\191]+$") then
            return false
        end
    end
    return true
end

local function has_cyrillic(s)
    return s:find("[\208\128-\209\143]") ~= nil
end

-- local function has_cyrillic(s)
--     return s:match("[\208\129-\209\143\208\144-\208\191\209\128-\209\143\208\129]") ~= nil
-- end

local function filterFunc(self, event, msg, author, languageName,
                               channelName, playerName2, specialFlags,
                               zoneChannelID, channelIndex, channelBaseName,
                               languageID, lineID, guid, bnSenderId)

  --print(channelName .. " 1")
  --print(channelNumber .. " 2")
  --print(channelName2 .. " 3")
  if channelIndex == 2 then
    --print("|cffff0000Сообщение заблокировано|r")
   return false
  end

  if channelIndex == 3 then
    --print("|cffff0000Сообщение заблокировано|r")
   return false
  end

  if channelIndex == 5 then
    --print("|cffff0000Сообщение заблокировано|r")
    return false
  end

  if not MagicTranslatorDB.enabled then return false end
  local mode = MagicTranslatorDB.mode

  local is_cyrillic = has_cyrillic(msg);

  local translated = msg;

  -- не переводить если кириллица
  if(is_cyrillic == false) then

    translated = ns.Matcher:Translate(msg, mode)
    
    if translated == msg then
      -- Ничего не изменилось: либо нет совпадений, либо transparent
      if mode == "transparent" then
        -- Подсветим потенциальные ключевые слова для внимания
        local idx = ns.Dictionary:GetIndex()
        for k, _ in pairs(idx.wordMap) do
          local pattern = "%f[%a]" .. k .. "%f[%A]"
          translated = translated:gsub(pattern, function(match)
            return colorize(match, MagicTranslatorDB.highlightColor)
          end)
        end
      else
        return false
      end
    end
  else

    if MagicTranslatorDB.showCyrlicInfo == true then
      return false, msg .. " |cff00cc9d (Кирилица)|r", author, languageName,
                                channelName, playerName2, specialFlags,
                                zoneChannelID, channelIndex, channelBaseName,
                                languageID, lineID, guid
    else
          return false, msg, author, languageName,
                                channelName, playerName2, specialFlags,
                                zoneChannelID, channelIndex, channelBaseName,
                                languageID, lineID, guid
    end
  end

  local channel = channelBaseName;
  local newMsg = translated;
  local sender = "";

  if event == "CHAT_MSG_BN_WHISPER" then

    print(' - ' .. bnSenderId)
    local info = C_BattleNet.GetFriendAccountInfo(bnSenderId)

    if info then
      sender = info.accountName
    end
  else
    -- guid даёт нам класс
    local _, class = GetPlayerInfoByGUID(guid)
    local color = RAID_CLASS_COLORS[class]

    sender = Ambiguate(author, "short");

    if color then
      local coloredName = "|c" .. color.colorStr .. sender .. "|r"

      if channelBaseName == "" then
        channel = ""
      else
        channel = " ["..channelBaseName.."]"
      end

      newMsg = channel .. " ["..coloredName.."]: "..translated
    else
      newMsg = " ["..channelBaseName.."] ["..sender.."]: "..translated
    end
  end

  -- Формируем префикс в зависимости от события
  local prefix

  if event == "CHAT_MSG_SAY" then
    prefix = "[Say]"
  elseif event == "CHAT_MSG_YELL" then
    prefix = "[Yell]"
  elseif event == "CHAT_MSG_CHANNEL" then
    prefix = "[" .. (channelBaseName or "?") .. "]"
  --elseif event == "CHAT_MSG_WHISPER" then
    --return false
  else
    prefix = "[" .. event .. "]"
  end

  -- if channelIndex == 5 then
  --   return false
  -- end

  -- Выводим перевод отдельной строкой только в основной чат
  --if self == DEFAULT_CHAT_FRAME then

    ns.Logger:Debug("Translated", { event = event, author = sender, src = msg, dst = translated })

    --local channel = "[" .. channelIndex .. "]"

    --self:AddMessage(string.format("|cff00cc9d[ПЕРЕВОД] %s %s|r", prefix, newMsg))
  --end

  local tst = ns.VerbTense:DetectVerbTense(msg)

  local time = ns.RusFixer.Tense.Present

  if tst.time == "Past" then
      time = ns.RusFixer.Tense.Past
    else if tst.time == "Present" then
      time = ns.RusFixer.Tense.Present
    else
      time = ns.RusFixer.Tense.Future
    end
  end

  if MagicTranslatorDB.useMorphologicalAnalysis then
    translated = ns.RusFixer:Fix(translated, ns.RusFixer.Gender.Male, time)
  end

  newMsg = string.format("|cff00cc9d [ПЕРЕВОД][%s] (%s) |r", tst.time, translated)

  return false, msg .. newMsg, author, languageName,
                               channelName, playerName2, specialFlags,
                               zoneChannelID, channelIndex, channelBaseName,
                               languageID, lineID, guid
end

function ChatFilter:Register()
  for _, ev in ipairs(EVENTS) do
    ChatFrame_AddMessageEventFilter(ev, filterFunc)
  end
end