local _, Addon = ...

local Commands = {}
Addon.Commands = Commands

function Commands:PrintHelp()
    Addon:Print("comandos disponibles:")
    Addon:Print("/mzm — muestra u oculta el mapa.")
    Addon:Print("/mzm config — abre la interfaz de configuración.")
    Addon:Print("/mzm size 180 — cambia el tamaño (120–650 circular; 220–650 cuadrado).")
    Addon:Print("/mzm forma circular — cambia entre circular y cuadrado.")
    Addon:Print("/mzm marco 5 — cambia el grosor del marco (0–16).")
    Addon:Print("/mzm botones — muestra u oculta los botones de otros addons.")
    Addon:Print("/mzm iconos 28 — cambia el tamaño de esos botones (18–48).")
    Addon:Print("/mzm distancia 5 — separa los iconos dentro del contenedor (0–30).")
    Addon:Print("/mzm columnas 4 — cambia las columnas del contenedor (1–8).")
    Addon:Print("/mzm moverboton reset — devuelve los botones junto al mapa.")
    Addon:Print("/mzm perfil compacto — aplica normal, compacto o mini.")
    Addon:Print("/mzm flecha 18 — cambia el tamaño de tu flecha (8–40).")
    Addon:Print("/mzm alpha 0.9 — cambia la transparencia (0.35–1).")
    Addon:Print("/mzm lock — bloquea o desbloquea la ventana.")
    Addon:Print("/mzm replace — activa o desactiva el reemplazo del minimapa.")
    Addon:Print("/mzm button — muestra u oculta el botón del minimapa.")
    Addon:Print("/mzm debug — muestra las fuentes de posición disponibles.")
    Addon:Print("/mzm reset — restablece la configuración.")
end

function Commands:Handle(message)
    local trimmed = strtrim(message or "")
    local command, argument = strsplit(" ", trimmed, 2)
    command = string.lower(command or "")

    if command == "" or command == "toggle" then
        Addon.UI:ToggleMap()
    elseif command == "help" or command == "ayuda" then
        self:PrintHelp()
    elseif command == "config" or command == "opciones" or command == "options" then
        Addon.Options:Toggle()
    elseif command == "reset" then
        Addon.UI:ResetSettings()
    elseif command == "lock" or command == "bloquear" then
        Addon.db.locked = not Addon.db.locked
        Addon:Print(Addon.db.locked and "ventana bloqueada." or "ventana desbloqueada.")
    elseif command == "replace" or command == "reemplazar" then
        Addon.UI:SetReplacementMode(not Addon.db.replaceMinimap, true)
    elseif command == "forma" or command == "shape" then
        local shape = argument and string.lower(strtrim(argument))
        if shape == "circular" or shape == "circulo" or shape == "círculo" or shape == "circle" then
            Addon.UI:SetShape("circle")
            Addon:Print("forma circular. Usa Shift + arrastrar para moverla.")
        elseif shape == "cuadrada" or shape == "cuadrado" or shape == "square" then
            Addon.UI:SetShape("square")
            Addon:Print("forma cuadrada.")
        else
            Addon:Print("uso: /mzm forma circular  o  /mzm forma cuadrada")
        end
    elseif command == "circular" or command == "circulo" or command == "círculo" then
        Addon.UI:SetShape("circle")
        Addon:Print("forma circular. Usa Shift + arrastrar para moverla.")
    elseif command == "cuadrado" or command == "cuadrada" then
        Addon.UI:SetShape("square")
        Addon:Print("forma cuadrada.")
    elseif command == "marco" or command == "border" then
        local value = tonumber(argument)
        if not value then
            Addon:Print("uso: /mzm marco 5 (entre 0 y 16)")
            return
        end
        value = Addon:Clamp(math.floor(value + 0.5), Addon.MIN_BORDER_SIZE, Addon.MAX_BORDER_SIZE)
        Addon.UI:SetBorderSize(value)
        Addon:Print("grosor del marco: " .. value .. ".")
    elseif command == "botones" or command == "addonbuttons" then
        local option = argument and string.lower(strtrim(argument))
        local shown
        if option == "on" or option == "si" or option == "sí" or option == "mostrar" then
            shown = true
        elseif option == "off" or option == "no" or option == "ocultar" then
            shown = false
        else
            shown = not Addon.db.showAddonButtons
        end
        Addon.UI:SetAddonButtonsShown(shown)
        Addon:Print(shown and "botones de addons visibles." or "botones de addons ocultos.")
    elseif command == "iconos" or command == "addonsize" then
        local value = tonumber(argument)
        if not value then
            Addon:Print("uso: /mzm iconos 28 (entre 18 y 48)")
            return
        end
        Addon.db.addonButtonSize = Addon:Clamp(
            math.floor(value + 0.5),
            Addon.MIN_ADDON_BUTTON_SIZE,
            Addon.MAX_ADDON_BUTTON_SIZE
        )
        Addon.AddonButtons:Layout()
        Addon:Print("tamaño de botones: " .. Addon.db.addonButtonSize .. ".")
    elseif command == "distancia" or command == "buttondistance" then
        local value = tonumber(argument)
        if not value then
            Addon:Print("uso: /mzm distancia 5 (entre 0 y 30)")
            return
        end
        Addon.db.addonButtonDistance = Addon:Clamp(
            math.floor(value + 0.5),
            Addon.MIN_BUTTON_DISTANCE,
            Addon.MAX_BUTTON_DISTANCE
        )
        Addon.AddonButtons:Layout()
        Addon:Print("separación de iconos: " .. Addon.db.addonButtonDistance .. ".")
    elseif command == "columnas" or command == "columns" then
        local value = tonumber(argument)
        if not value then
            Addon:Print("uso: /mzm columnas 4 (entre 1 y 8)")
            return
        end
        Addon.db.addonHubColumns = Addon:Clamp(
            math.floor(value + 0.5),
            Addon.MIN_HUB_COLUMNS,
            Addon.MAX_HUB_COLUMNS
        )
        Addon.AddonButtons:Layout()
        Addon:Print("columnas del contenedor: " .. Addon.db.addonHubColumns .. ".")
    elseif command == "moverboton" or command == "hubreset" then
        Addon.AddonButtons:ResetAnchor()
    elseif command == "perfil" or command == "profile" then
        local profile = argument and string.lower(strtrim(argument))
        if not Addon.UI:ApplyProfile(profile) then
            Addon:Print("uso: /mzm perfil normal, compacto o mini")
            return
        end
        Addon:Print("perfil " .. profile .. " aplicado.")
    elseif command == "button" or command == "boton" or command == "botón" then
        Addon.db.showButton = not Addon.db.showButton
        Addon.UI:SetMinimapButtonShown(Addon.db.showButton)
        Addon:Print(
            Addon.db.showButton
                and "botón del minimapa visible."
                or "botón del minimapa oculto; usa /mzm para abrir."
        )
    elseif command == "debug" then
        local mapID = Addon.state.mapID or C_Map.GetBestMapForUnit("player")
        for _, line in ipairs(Addon.Coordinates:GetDiagnostics(mapID, "player")) do
            Addon:Print(line)
        end
        Addon:Print(
            "UnitPositionFrame="
                .. (Addon.Markers:IsNativePlayerFrameAvailable() and "disponible" or "no disponible")
        )
        Addon:Print(
            "forma=" .. Addon.db.shape
                .. ", botones de addons=" .. Addon.AddonButtons:GetVisibleCount()
        )
        Addon:Print(
            "centrado=" .. (Addon.state.protectedCenterMode or "sin inicializar")
        )
    elseif command == "flecha" or command == "arrowsize" then
        local value = tonumber(argument)
        if not value then
            Addon:Print("uso: /mzm flecha 18 (entre 8 y 40)")
            return
        end
        Addon.db.playerArrowSize = Addon:Clamp(
            math.floor(value + 0.5),
            Addon.MIN_ARROW_SIZE,
            Addon.MAX_ARROW_SIZE
        )
        Addon.Markers:SetPlayerArrowSize(Addon.db.playerArrowSize)
        Addon:Print("tamaño de la flecha: " .. Addon.db.playerArrowSize .. ".")
    elseif command == "size" or command == "tamano" or command == "tamaño" then
        local value = tonumber(argument)
        if not value then
            Addon:Print("uso: /mzm size 320")
            return
        end
        local minimumSize = Addon.db.shape == "circle" and Addon.MIN_SIZE or Addon.MIN_SQUARE_SIZE
        Addon.db.size = Addon:Clamp(math.floor(value + 0.5), minimumSize, Addon.MAX_SIZE)
        Addon.UI:SetSize(Addon.db.size)
        Addon:Print("tamaño: " .. Addon.db.size .. ".")
    elseif command == "alpha" or command == "opacidad" then
        local normalized = argument and string.gsub(argument, ",", ".")
        local value = tonumber(normalized)
        if not value then
            Addon:Print("uso: /mzm alpha 0.9")
            return
        end
        Addon.db.alpha = Addon:Clamp(value, Addon.MIN_ALPHA, Addon.MAX_ALPHA)
        Addon.UI:SetAlpha(Addon.db.alpha)
        Addon:Print(string.format("opacidad: %.2f.", Addon.db.alpha))
    else
        Addon:Print("comando desconocido. Escribe /mzm help.")
    end
end

function Commands:Register()
    SLASH_MAPAENMINIATURA1 = "/mzm"
    SLASH_MAPAENMINIATURA2 = "/minimapa"
    SlashCmdList.MAPAENMINIATURA = function(message)
        self:Handle(message)
    end
end
