-- entities/armurier_caisse/cl_init.lua
-- Rendu client de la caisse d'armurier.
-- • ENT:Draw()           — rendu du modèle standard
-- • HUDPaint hook        — tooltip 2D contextuel (throttlé 20 Hz)
-- • DrawTranslucent      — HUD 3D2D billboard au-dessus (si activé dans config)

include("shared.lua")

-- RENDERGROUP_BOTH (champ de CLASSE, lu par le moteur — il n'existe pas de
-- méthode SetRenderGroup). Sans ça l'entité est opaque et DrawTranslucent
-- (le billboard 3D2D affichant le nom de la boutique) n'est jamais appelé.
ENT.RenderGroup = RENDERGROUP_BOTH

-- ============================================================================
-- Draw — rendu standard du modèle
-- ============================================================================

function ENT:Initialize()
    self:SetNextClientThink(CurTime())
end

function ENT:Draw()
    self:DrawModel()
end

-- ============================================================================
-- Think client — minimal, juste pour maintenir le rendu actif
-- ============================================================================

function ENT:Think()
    self:SetNextClientThink(CurTime() + 0.1)
    return true
end

-- ============================================================================
-- OnRemove — cleanup
-- ============================================================================

function ENT:OnRemove()
    -- Rien à nettoyer côté client pour cette entité
end

-- ============================================================================
-- DrawTranslucent — HUD 3D2D au-dessus de la caisse
-- N'affiche rien si le joueur est trop loin.
-- ============================================================================

function ENT:DrawTranslucent()
    -- Le modèle est déjà rendu par Draw() (passe opaque) ; ici on ne dessine
    -- que le billboard 3D2D (passe translucide).
    if not Armurier or not Armurier.Config then return end
    if not Armurier.Config.HUD3D2D then return end

    local ply = LocalPlayer()
    if not IsValid(ply) then return end

    -- LOD distance
    local maxD = Armurier.Config.HUD3D2D_MaxDistance or 800
    if ply:GetPos():DistToSqr(self:GetPos()) > maxD * maxD then return end

    -- Propriétaire de la caisse
    local owner = self:GetNW2Entity("armurier_owner")

    local offsetZ = Armurier.Config.HUD3D2D_OffsetZ or 60
    local pos     = self:GetPos() + Vector(0, 0, offsetZ)

    -- Couleurs via DBALib (lazy)
    local colBg   = (DBALib and DBALib.Theme and DBALib.Theme.palette and DBALib.Theme.palette.bg
                    and DBALib.Theme.palette.bg.surface) or Color(20, 20, 30, 220)
    local colGold = (DBALib and DBALib.Theme and DBALib.Theme.palette and DBALib.Theme.palette.gold
                    and DBALib.Theme.palette.gold.base) or Color(212, 175, 55)
    local colText = (DBALib and DBALib.Theme and DBALib.Theme.palette and DBALib.Theme.palette.text
                    and DBALib.Theme.palette.text.primary) or Color(230, 230, 230)

    local fontTitle = (DBALib and DBALib.Fonts and DBALib.Fonts.Body_lg) or "DermaDefaultBold"
    local fontSub   = (DBALib and DBALib.Fonts and DBALib.Fonts.Body_sm) or "DermaDefault"

    -- Angle billboard : face au joueur
    -- Nom de boutique : NW2String, défaut depuis Config
    local rawName   = self:GetNW2String("armurier_name", "")
    local shopName  = (rawName ~= "") and rawName
                      or (Armurier.Config and Armurier.Config.DefaultShopName)
                      or "Armurerie"

    cam.Start3D2D(pos, Angle(0, ply:EyeAngles().y - 90, 90), 0.1)

        -- Fond
        draw.RoundedBox(6, -150, -40, 300, 80, colBg)

        -- Nom de la boutique (titre principal, en or)
        draw.SimpleTextOutlined(
            shopName,
            fontTitle,
            0, -20,
            colGold,
            TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER,
            1, Color(0, 0, 0, 180)
        )

        -- Propriétaire (sous-titre)
        local ownerText = IsValid(owner) and ("Armurier : " .. owner:Nick()) or "Disponible"
        draw.SimpleText(
            ownerText,
            fontSub,
            0, 14,
            colText,
            TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER
        )

    cam.End3D2D()
end

-- ============================================================================
-- Tooltip 2D (HUDPaint) — quand le joueur regarde la caisse
-- Throttlé à 20 Hz
-- ============================================================================

local _nextTooltipCheck = 0
local _cachedTooltip    = nil

hook.Add("HUDPaint", "Armurier.Caisse.Tooltip", function()
    -- Refresh du cache (20 Hz)
    if CurTime() >= _nextTooltipCheck then
        _nextTooltipCheck = CurTime() + 0.05
        _cachedTooltip    = nil

        local ply = LocalPlayer()
        if IsValid(ply) then
            local tr = ply:GetEyeTrace()
            if IsValid(tr.Entity) and tr.Entity:GetClass() == "armurier_caisse" then
                local caisse  = tr.Entity
                local maxDist = (Armurier and Armurier.Config and Armurier.Config.MaxDistance) or 200
                if ply:GetPos():DistToSqr(caisse:GetPos()) <= (maxDist * maxDist) then
                    local gold = (DBALib and DBALib.Theme and DBALib.Theme.palette
                                  and DBALib.Theme.palette.gold and DBALib.Theme.palette.gold.base)
                                 or Color(212, 175, 55)

                    -- Vérifier si le joueur est Armurier
                    local isArmurier = TEAM_ARMURIER and ply:Team() == TEAM_ARMURIER
                    local text, color

                    if isArmurier then
                        text  = "[E] Ouvrir la boutique d'armurier"
                        color = gold
                    else
                        text  = "Boutique d'armurier (réservée aux Armuriers)"
                        color = Color(180, 180, 180)
                    end

                    _cachedTooltip = { text = text, color = color }
                end
            end
        end
    end

    -- Draw chaque frame depuis le cache
    if not _cachedTooltip then return end

    local font = (DBALib and DBALib.Fonts and DBALib.Fonts.Body_lg) or "DermaDefaultBold"

    draw.SimpleTextOutlined(
        _cachedTooltip.text,
        font,
        ScrW() / 2,
        ScrH() / 2 + 40,
        _cachedTooltip.color,
        TEXT_ALIGN_CENTER,
        TEXT_ALIGN_CENTER,
        1,
        Color(0, 0, 0, 220)
    )
end)
