-- =========================================================
-- Cooperativa Agricola - FillType Registry (Bridge)
-- =========================================================
-- IMPORTANTE: mantemos o nome SoilFertilizerBridge por compatibilidade
-- com todos os pontos do código que chamam g_DepotManager.sfBridge.
-- Internamente, agora descobrimos TODOS os fillTypes do jogo
-- automaticamente — não dependemos mais do mod SoilFertilizer.
--
-- Categoriza fillTypes pra que a UI agrupe (grãos, leite, etc.).
-- =========================================================

---@class SoilFertilizerBridge
SoilFertilizerBridge = {}
local SoilFertilizerBridge_mt = Class(SoilFertilizerBridge)

function SoilFertilizerBridge.new()
    local self = setmetatable({}, SoilFertilizerBridge_mt)
    self._fillTypeList = nil
    self._productFillTypeList = nil
    return self
end

-- Mantido por compatibilidade — sempre retorna false agora
function SoilFertilizerBridge:isInstalled()
    return false
end

-- Heurística de categoria (igual AgroWorld)
local function classify(name)
    local n = string.upper(name or "")
    -- grãos
    if n:match("^WHEAT$") or n:match("^BARLEY$") or n:match("^OAT") or n:match("^RYE$")
       or n:match("^MAIZE") or n:match("^CORN") or n:match("^SORGHUM") or n:match("RICE")
       or n:match("^TRITICALE") or n:match("^SPELT") then return "GRAIN" end
    -- oleaginosas
    if n:match("^CANOLA") or n:match("^SUNFLOWER") or n:match("^SOYBEAN") or n:match("^OLIVE")
       or n:match("^PEANUT") or n:match("^FLAX") then return "OILSEED" end
    -- açúcar
    if n:match("SUGAR") or n:match("^MOLASSES") then return "SUGAR" end
    -- carne / animal
    if n:match("^PIG$") or n:match("^BEEF$") or n:match("^CHICKEN$") or n:match("^SHEEP$")
       or n:match("^EGG") or n:match("^MEAT$") or n:match("BUFFALO") then return "MEAT" end
    -- leite
    if n:match("MILK") or n:match("CHEESE") or n:match("BUTTER") or n:match("YOGURT") then return "MILK" end
    -- algodão / fibra
    if n:match("COTTON") or n:match("WOOL") then return "FIBER" end
    -- frutas / hortaliças
    if n:match("^POTATO") or n:match("^TOMATO") or n:match("^LETTUCE") or n:match("^STRAWBERRY")
       or n:match("^GRAPE") or n:match("^APPLE") or n:match("^PARSNIP") or n:match("^CARROT")
       or n:match("^RED_BEET") or n:match("^GREENBEAN") or n:match("^PEA$") or n:match("^SPINACH")
       or n:match("^SPINAT") then return "FRUIT" end
    -- madeira
    if n:match("WOOD") or n:match("LOG") or n:match("PLANK") or n:match("^POPLAR") then return "WOOD" end
    -- fertilizante / insumos
    if n:match("FERTILIZ") or n:match("MANURE") or n:match("SLURRY") or n:match("DIGESTATE")
       or n:match("^LIME") or n:match("HERBICIDE") or n:match("^SEEDS") then return "FERTILIZER" end
    -- processados
    if n:match("FLOUR") or n:match("BREAD") or n:match("JUICE") or n:match("WINE")
       or n:match("CAKE") or n:match("CHOCOLATE") or n:match("CEREAL") or n:match("RAISINS")
       or n:match("TOFU") or n:match("SOYMILK") or n:match("CLOTHES") or n:match("BOARDS")
       or n:match("FURNITURE") or n:match("PAPER") or n:match("PREFABWALL")
       or (n:match("OIL") and not n:match("SOIL")) then return "PROCESSED" end
    return "OTHER"
end

-- Retorna lista ordenada de fillTypes vendáveis
-- Cada item: { name, fillTypeIndex, pricePerLiter, displayName, category }
function SoilFertilizerBridge:getFillTypeList()
    if self._fillTypeList ~= nil then
        return self._fillTypeList
    end

    local list = {}

    if g_fillTypeManager == nil then
        DepotLogger.warning("g_fillTypeManager indisponível ao listar fillTypes")
        return list
    end

    local all = g_fillTypeManager:getFillTypes()
    for _, ft in pairs(all) do
        if ft ~= nil and ft.name ~= nil then
            local skip = false

            -- Ignora os internals (UNKNOWN, AIR, etc.)
            if DepotConstants.IGNORED_FILLTYPE_NAMES[ft.name] then
                skip = true
            end

            -- Preço base: aceita qualquer das fontes
            local price = ft.pricePerLiter
                       or (ft.economy and ft.economy.pricePerLiter)
                       or 0

            -- Antes de descartar por preço zero, tenta o fallback do fillTypeManager
            if price <= 0 and g_currentMission and g_currentMission.economyManager then
                local em = g_currentMission.economyManager
                if em.getPricePerLiter then
                    local ok, p = pcall(function() return em:getPricePerLiter(ft.index) end)
                    if ok and p and p > 0 then price = p end
                end
            end

            -- Aceita fillType mesmo com preço zero (cooperativa pode mover material
            -- sem valor monetário, e melhor mostrar e o operador decidir do que esconder).
            -- Só descarta se está EXPLICITAMENTE marcado como "non-price-table" E preço é zero.
            if price <= 0 and ft.showOnPriceTable == false then
                skip = true
            end

            if not skip then
                table.insert(list, {
                    name          = ft.name,
                    fillTypeIndex = ft.index,
                    pricePerLiter = math.max(price, 0.01),  -- floor mínimo
                    displayName   = ft.title or ft.name,
                    category      = classify(ft.name),
                })
            end
        end
    end

    -- Ordena: categoria, depois nome
    table.sort(list, function(a, b)
        if a.category == b.category then
            return (a.displayName or "") < (b.displayName or "")
        end
        return (a.category or "") < (b.category or "")
    end)

    self._fillTypeList = list
    DepotLogger.info("FillType registry: %d tipos descobertos", #list)
    return list
end

-- Retorna sublista que tem produto físico (bigBag/liquidTank)
-- Mantido por compatibilidade com DepotDialog (aba de ordering)
function SoilFertilizerBridge:getProductFillTypeList()
    if self._productFillTypeList ~= nil then return self._productFillTypeList end
    -- Por enquanto, retorna lista vazia (não vamos manter ordering de produtos)
    self._productFillTypeList = {}
    return self._productFillTypeList
end

-- Preço base de um fillType (consultado pelo DepotPricing)
function SoilFertilizerBridge:getBasePrice(fillTypeName)
    if g_fillTypeManager == nil then return 0 end
    local idx = g_fillTypeManager:getFillTypeIndexByName(fillTypeName)
    if idx == nil or idx <= 0 then return 0 end
    local ft = g_fillTypeManager:getFillTypeByIndex(idx)
    if ft == nil then return 0 end
    return ft.pricePerLiter or (ft.economy and ft.economy.pricePerLiter) or 0
end

function SoilFertilizerBridge:invalidateCache()
    self._fillTypeList = nil
    self._productFillTypeList = nil
end
