-- =========================================================
-- Cooperativa Agricola - Pricing System
-- =========================================================
-- Preço de mercado vem direto do FS25 vanilla (pricePerLiter do
-- fillType — que pode estar sendo modulado por outros mods como
-- o AgroWorld, se instalado).
--
-- Spread da cooperativa é aplicado em CIMA do preço de mercado:
--   - Outro fazendeiro vendendo: recebe market × 0.90
--   - Outro fazendeiro comprando: paga market × 1.20
--   - Dono comprando do estoque: paga market puro
--   - Dono vendendo (depositando) ao próprio estoque: 0 (sem money flow)
-- =========================================================

---@class DepotPricing
DepotPricing = {}
local DepotPricing_mt = Class(DepotPricing)

function DepotPricing.new(sfBridge)
    local self = setmetatable({}, DepotPricing_mt)
    self._sfBridge = sfBridge
    return self
end

-- Mantido por compat: sempre 1.0 agora (sem sazonalidade na cooperativa)
function DepotPricing:getSeasonMultiplier()
    return 1.0
end

function DepotPricing:getSeasonKey()
    return "fd_season_summer"  -- chave neutra
end

-- Preço de MERCADO atual (sem spread). Lê direto do fillType.
function DepotPricing:getMarketPrice(fillTypeName)
    return self._sfBridge:getBasePrice(fillTypeName)
end

-- Preço EXIBIDO de compra (sem contexto de farm — usado na lista da UI).
-- Mostra "preço cheio com markup", que é o que a maioria dos jogadores
-- enxerga. O cálculo real per-farm é feito em sellFillType/buyFillType.
function DepotPricing:getBuyPrice(fillTypeName)
    local market = self:getMarketPrice(fillTypeName)
    local coop   = g_DepotManager and g_DepotManager.coopState
    if coop == nil then return market end
    return market * (1.0 + coop:getBuySpread())
end

-- Preço EXIBIDO de venda (sem contexto de farm).
function DepotPricing:getSellPrice(fillTypeName)
    local market = self:getMarketPrice(fillTypeName)
    local coop   = g_DepotManager and g_DepotManager.coopState
    if coop == nil then return market end
    return market * (1.0 - coop:getSellSpread())
end

-- ─── Cálculos contextualizados por farm ──────────────────

-- Custo TOTAL pra uma farm comprar X litros (considera owner discount)
function DepotPricing:calculateBuyCost(fillTypeName, liters, buyerFarmId)
    local market = self:getMarketPrice(fillTypeName)
    local coop   = g_DepotManager and g_DepotManager.coopState
    if coop == nil then return market * liters end
    return coop:getBuyPricePerLiter(market, buyerFarmId) * liters
end

-- Revenue TOTAL pra uma farm vender X litros
function DepotPricing:calculateSellRevenue(fillTypeName, liters, sellerFarmId)
    local market = self:getMarketPrice(fillTypeName)
    local coop   = g_DepotManager and g_DepotManager.coopState
    if coop == nil then return market * liters end
    return coop:getSellPricePerLiter(market, sellerFarmId) * liters
end
