-- =========================================================
-- Cooperativa Agrícola — Notificação de Transação (Server -> Owner)
-- =========================================================
-- Quando uma transação acontece no servidor, avisa o DONO (que pode estar
-- num cliente) com uma notificação lateral discreta. Também carrega os
-- dados pra alimentar o histórico/dashboard no lado do cliente-dono.

---@class CoopTransactionEvent
CoopTransactionEvent = {}
CoopTransactionEvent_mt = Class(CoopTransactionEvent, Event)

InitEventClass(CoopTransactionEvent, "CoopTransactionEvent")

function CoopTransactionEvent.emptyNew()
    return Event.new(CoopTransactionEvent_mt)
end

function CoopTransactionEvent.new(kind, farmId, fillTypeName, liters, value, ownerFarmId)
    local self = CoopTransactionEvent.emptyNew()
    self.kind         = kind or "sell"
    self.farmId       = farmId or 0
    self.fillTypeName = fillTypeName or "?"
    self.liters       = liters or 0
    self.value        = value or 0
    self.ownerFarmId  = ownerFarmId or 0
    return self
end

function CoopTransactionEvent:writeStream(streamId, connection)
    streamWriteString(streamId, self.kind)
    streamWriteUInt8(streamId,  self.farmId)
    streamWriteString(streamId, self.fillTypeName)
    streamWriteFloat32(streamId, self.liters)
    streamWriteFloat32(streamId, self.value)
    streamWriteUInt8(streamId,  self.ownerFarmId)
end

function CoopTransactionEvent:readStream(streamId, connection)
    self.kind         = streamReadString(streamId)
    self.farmId       = streamReadUInt8(streamId)
    self.fillTypeName = streamReadString(streamId)
    self.liters       = streamReadFloat32(streamId)
    self.value        = streamReadFloat32(streamId)
    self.ownerFarmId  = streamReadUInt8(streamId)
    self:run(connection)
end

function CoopTransactionEvent:run(connection)
    -- Roda no cliente. Só notifica se EU sou o dono e não fui eu que operei.
    if g_DepotManager == nil then return end

    -- Alimenta o log local do cliente (pra histórico/dashboard offline do server)
    if g_DepotManager.transactionLog then
        g_DepotManager.transactionLog:record(
            self.kind, self.farmId, self.fillTypeName, self.liters, self.value)
    end

    -- Notificação: só pro dono, e não quando o próprio dono operou
    local myFarmId = g_DepotManager.getLocalFarmId and g_DepotManager:getLocalFarmId() or 0
    if myFarmId ~= self.ownerFarmId then return end   -- não sou o dono
    if self.farmId == self.ownerFarmId then return end  -- fui eu que operei

    if g_DepotManager.showTransactionNotification then
        g_DepotManager:showTransactionNotification(
            self.kind, self.farmId, self.fillTypeName, self.liters, self.value)
    end
end

-- Servidor dispara pra todos os clientes (cada um decide se notifica)
function CoopTransactionEvent.broadcast(kind, farmId, fillTypeName, liters, value, ownerFarmId)
    if not g_server then return end
    local evt = CoopTransactionEvent.new(kind, farmId, fillTypeName, liters, value, ownerFarmId)
    g_server:broadcastEvent(evt)
end
