-- Display onscreen text for placement controls

local function get_placement_binds()
    return {
        ["key_interact"] = ui_mcm.dispaly_key(bind_to_dik(key_bindings.kUSE)),
        ["key_collision"] = ui_mcm.dispaly_key(ui_mcm.get("aol_hf/controls/bind_collision")),
        ["key_align"] = ui_mcm.dispaly_key(ui_mcm.get("aol_hf/controls/bind_alignment")),
        ["key_mode"] = ui_mcm.dispaly_key(ui_mcm.get("aol_hf/controls/bind_place_mode")),
    }
end

local function generate_msg(string_id)
    local msg = game.translate_string(string_id)
    return utils_data.parse_string_keys(msg, get_placement_binds())
end

local function generate_holding_msg()
    return generate_msg("st_hf_holding_msg")
end

local function generate_advanced_msg()
    return generate_msg("st_hf_advanced_msg")
end

local function generate_preview_msg()
    return generate_msg("st_hf_preview_msg")
end

local state_to_msg_func = {
    [placeable_furniture.states.HOLDING] = generate_holding_msg,
    [placeable_furniture.states.ADV_CTRL] = generate_advanced_msg,
    [placeable_furniture.states.PREVIEW] = generate_preview_msg
}

---@type hf_placement_hud.UIHFPlacementHUD|nil
HUD = nil

class "UIHFPlacementHUD" (CUIScriptWnd)

function UIHFPlacementHUD:__init() super()
    self:Initialise()
end

function UIHFPlacementHUD:__finalize()
end

function UIHFPlacementHUD:Initialise()
    self:SetWndRect(Frect():set(0,0,1024,768))
    self:SetAutoDelete(true)

    local xml = CScriptXmlInit()
    xml:ParseFile("ui_hf_placement_hud.xml")

    self.bg = xml:InitFrame("background", self)
    self.text = xml:InitTextWnd("background:text", self.bg)
end

function UIHFPlacementHUD:Refresh(state)
    local msg_func = state_to_msg_func[state]
    if not msg_func then self:Clear() end

    self.text:SetText(msg_func())
    self.text:AdjustHeightToText()

    self.bg:SetHeight(self.text:GetHeight() + 24)
end

function UIHFPlacementHUD:Update()
    CUIScriptWnd.Update(self)
end

function UIHFPlacementHUD:Clear()
    self.text:SetText("")
end

-------------

function update_hud(state)
    if HUD == nil then
        HUD = UIHFPlacementHUD()
        get_hud():AddDialogToRender(HUD)
    end

    HUD:Refresh(state)
end

function remove_hud()
    if HUD ~= nil then
        get_hud():RemoveDialogToRender(HUD)
        HUD = nil
    end
end

local hf_set_state = placeable_furniture.set_state
function placeable_furniture.set_state(new_state)
    hf_set_state(new_state)
    if placeable_furniture.in_placing_state() then
        update_hud(new_state)
    else
        remove_hud()
    end
end