local _, ns = ...
local L = ns.L

local targetBankType = Enum and Enum.BankType and Enum.BankType.Account or 2 -- Warband/Account por defecto
local extendedVersion = false

local autoDepositCheck = CreateFrame("CheckButton", "AutoDepositCheckButton", BankFrame, "ChatConfigCheckButtonTemplate")
autoDepositCheck:SetPoint("BOTTOMLEFT", BankFrame, "BOTTOMLEFT", 28, 4)
autoDepositCheck.Text:SetText(L["Auto Deposit Gold"])
autoDepositCheck:SetChecked(false)
autoDepositCheck:SetScript("OnClick", function(self)
    AutoScrap_CharSettings.warbandGoldCheckBox = self:GetChecked()
    ns.actualizarCheckOpts()
end)
-- autoDepositCheck.Text:SetWidth(autoDepositCheck.Text:GetStringWidth() + 30) --no es el texto que es más pequeño que la zona clickable, según chat gpt es la siguietne linea:
autoDepositCheck:SetHitRectInsets(0, -autoDepositCheck.Text:GetWidth(), 0, 0)

local icon = autoDepositCheck:CreateTexture(nil, "ARTWORK")
icon:SetSize(24, 24)  -- tamaño 32x32
icon:SetPoint("RIGHT", autoDepositCheck.Text, "LEFT", -23, -1)  -- a la izquierda del texto, con un pequeño margen
icon:SetTexture("Interface\\AddOns\\AutoScrap\\images\\AutoScrap_transparent.blp")

--engranaje opciones
local optionsBtn = CreateFrame("Button", "AutoDepositOptionsButton", BankFrame)
optionsBtn:SetSize(20, 20)
optionsBtn:SetPoint("LEFT", autoDepositCheck.Text, "RIGHT", 6, 0)
-- Texturas simples de botón con “look” de opciones
optionsBtn:SetNormalTexture("Interface\\Buttons\\UI-OptionsButton")
optionsBtn:SetPushedTexture("Interface\\Buttons\\UI-OptionsButton")
optionsBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD")
optionsBtn:SetMotionScriptsWhileDisabled(true)
optionsBtn:EnableMouse(true)

local heightNormal = 160
local heightExtended = 190
-- === Ventana de opciones ===
local opts = CreateFrame("Frame", "AutoDepositOptionsFrame", UIParent, "SettingsFrameTemplate")
opts:SetSize(340, heightNormal)
opts:SetPoint("CENTER")
opts:SetFrameStrata("DIALOG")
opts:SetMovable(true)
opts:EnableMouse(true)
opts:RegisterForDrag("LeftButton")
opts:SetScript("OnDragStart", opts.StartMoving)
opts:SetScript("OnDragStop", opts.StopMovingOrSizing)
opts:SetClampedToScreen(true)
opts:Hide()

-- Título
--esto esa para la versión del template original de BasicFrameTemplateWithInset
--si algún día falla, volver a BasicFrameTemplateWithInset y descomentar esta línea y listo.
-- opts.title = opts:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
-- opts.title:SetPoint("CENTER", opts.TitleBg, "CENTER", 0, 0)
-- opts.title:SetText(L["Auto Deposit Options"])
opts.NineSlice.Text:SetText(L["Auto Deposit Options"])

-- Texto etiqueta
local labelNormalHeight = -40
local labelExtendedHeight = -75
local label = opts:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetPoint("TOPLEFT", 16, labelNormalHeight)
label:SetText(L["Deposit all except"] )

autoCheckDepOps = CreateFrame("CheckButton", nil, opts, "ChatConfigCheckButtonTemplate")
autoCheckDepOps:SetPoint("TOPLEFT", 16, -40)
autoCheckDepOps.Text:SetText(L["Auto Deposit Gold in the Warband Bank."])
autoCheckDepOps:SetChecked(AutoScrap_CharSettings.warbandGoldCheckBox or false)
function ns.actualizarCheckOpts()
    autoCheckDepOps:SetChecked(AutoScrap_CharSettings.warbandGoldCheckBox or false)
end

-- MoneyInputFrame (oficial)
local moneyInput = CreateFrame("Frame", nil, opts, "MoneyInputFrameTemplate")
moneyInput:SetPoint("TOPLEFT", label, "BOTTOMLEFT", 30, - 8)
-- Valor por defecto al abrir
if MoneyInputFrame_SetCopper then
    MoneyInputFrame_SetCopper(moneyInput, AutoScrap_CharSettings.warbandGoldMinGold or 0)
end

-- Checkbox para mantener oro mínimo en inventario
local refillCheck = CreateFrame("CheckButton", nil, opts, "ChatConfigCheckButtonTemplate")
refillCheck:SetPoint("TOPLEFT", moneyInput, "BOTTOMLEFT", -30, -10)
refillCheck.Text:SetText(L["Maintain minimum gold on inventory"])
refillCheck:SetChecked(AutoScrap_CharSettings.warbandRefillMinGold or false)

-- no se cambia al ahcer click en el check, si no al guardar las opciones del panel
-- refillCheck:SetScript("OnClick", function(self)
--     AutoScrap_CharSettings.warbandRefillMinGold = self:GetChecked()
-- end)

local function actualizarCheckBoxGoldWarband()
    autoDepositCheck:SetChecked(AutoScrap_CharSettings.warbandGoldCheckBox)
    autoCheckDepOps:SetChecked(AutoScrap_CharSettings.warbandGoldCheckBox)
    refillCheck:SetChecked(AutoScrap_CharSettings.warbandRefillMinGold)
end
ns.actualizarCheckBoxGoldWarband = actualizarCheckBoxGoldWarband

-- Botón Guardar
local saveBtn = CreateFrame("Button", nil, opts, "UIPanelButtonTemplate")
saveBtn:SetSize(90, 22)
saveBtn:SetPoint("BOTTOMRIGHT", - 12, 12)
saveBtn:SetText(L["Save"])
saveBtn:SetScript("OnClick", function()
    if MoneyInputFrame_GetCopper then
        local val = MoneyInputFrame_GetCopper(moneyInput) or 0
        if val < 0 then val = 0 end
        AutoScrap_CharSettings.warbandGoldMinGold = val
    end
    AutoScrap_CharSettings.warbandRefillMinGold = refillCheck:GetChecked()
    if extendedVersion then
        AutoScrap_CharSettings.warbandGoldCheckBox = autoCheckDepOps:GetChecked()
    end
    actualizarCheckBoxGoldWarband()
    opts:Hide()
end)

-- Botón Cerrar (por si no lo añade el template de tu cliente)
if not opts.CloseButton then
    local close = CreateFrame("Button", nil, opts, "UIPanelCloseButton")
    close:SetPoint("TOPRIGHT")
end

-- funciones de ventna mínima o extendida
local function extendedOptions(extended) 
    if extended then
        extendedVersion = true
        label:SetPoint("TOPLEFT", 16, labelExtendedHeight)
        opts:SetSize(340, heightExtended)
        autoCheckDepOps:Show()
    else
        extendedVersion = false
        label:SetPoint("TOPLEFT", 16, labelNormalHeight)
        autoCheckDepOps:Hide()
        opts:SetSize(340, heightNormal)
    end
end

local function mostrarVentanaOpcionesBandaGuerrera(extended)
    MoneyInputFrame_SetCopper(moneyInput, AutoScrap_CharSettings.warbandGoldMinGold or 0)
    refillCheck:SetChecked(AutoScrap_CharSettings.warbandRefillMinGold)
    autoCheckDepOps:SetChecked(AutoScrap_CharSettings.warbandGoldCheckBox or false)
    extendedOptions(extended)
    if opts:IsShown() then
        opts:Hide()
    else
        opts:Show()
    end
end
ns.mostrarVentanaOpcionesBandaGuerrera = mostrarVentanaOpcionesBandaGuerrera

-- Abrir ventana al pulsar la rueda
optionsBtn:SetScript("OnClick", function()
    mostrarVentanaOpcionesBandaGuerrera(false)
end)


local function depositOrWithdraw()
    local keep = AutoScrap_CharSettings.warbandGoldMinGold or 0
    if keep < 0 then keep = 0 end
    
    local playerMoney = GetMoney() or 0
    local toDeposit = playerMoney - keep
    local toWithdraw = keep - playerMoney
    if toDeposit > 0 and AutoScrap_CharSettings.warbandGoldCheckBox and C_Bank.CanDepositMoney(Enum.BankType.Account) then
        if C_Bank and C_Bank.DepositMoney then
            C_Bank.DepositMoney(Enum.BankType.Account, toDeposit) --Enum.BankType.Account es 2 ahora mismo
        end
    elseif toWithdraw > 0 and AutoScrap_CharSettings.warbandRefillMinGold and C_Bank.CanWithdrawMoney(Enum.BankType.Account) then
        if C_Bank and C_Bank.DepositMoney then
            C_Bank.WithdrawMoney(Enum.BankType.Account, toWithdraw)
        end
    end
end

-- === Hook al BankFrame: deposita todo menos lo configurado ===
--cambiado por registrando el evento BANKFRAME_OPENED que funciona quizás mejor con las bolsas de otros addons
--BankFrame:HookScript("OnShow", depositOrWithdraw)
local f = CreateFrame("Frame")
f:RegisterEvent("BANKFRAME_OPENED")
f:SetScript("OnEvent", function(self, event)
  if event == "BANKFRAME_OPENED" then
    depositOrWithdraw()
  end
end)

-- esta función es solo para que aparezca en su pestaña y no en todas.
-- Función para refrescar visibilidad basado en pestaña activa
local function RefreshControlsVisibility()
    local activeType = BankFrameMixin and BankFrameMixin.GetActiveBankType and BankFrame:GetActiveBankType()
    if activeType == Enum.BankType.Account then
        autoDepositCheck:Show()
        optionsBtn:Show()
    else
        autoDepositCheck:Hide()
        optionsBtn:Hide()
    end
end

--hook al cambiar pestaña
hooksecurefunc(BankFrame.TabSystem, "SetTab", RefreshControlsVisibility)

--hook al abrirse, por si se abre en la pestaña que es otra diferente de la banda guerrera
BankFrame:HookScript("OnShow", function()
    RefreshControlsVisibility()
end)
