<?php
// includes/admin/admin-settings.php

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Acesso direto bloqueado
}

// [1.6.47] Helpers de Bloqueios Globais — auto-loaded aqui porque o admin-settings
// já é incluído pelo plugin loader principal.
require_once __DIR__ . '/rmbz-global-blocks.php';

/**
 * Regista as configurações do plugin usando a API de Configurações do WordPress.
 */
function rmbz_register_settings() {
    // Registo das configurações de pagamento
    register_setting( 
        'rmbz_settings_group', 
        'rmbz_payment_settings',
        ['sanitize_callback' => 'rmbz_sanitize_payment_settings']
    );

    // Registo do Email de Notificação
    register_setting('rmbz_settings_group', 'rmbz_admin_notification_email');

    // [1.5.129] LEGACY: rmbz_sub_price e rmbz_sub_days mantêm-se registados
    // para retrocompatibilidade (compras VIP via planos novos não usam isto,
    // mas alguns fluxos legacy ainda lêem). Não aparecem mais no UI — admin
    // gere preços através do gestor de Pacotes VIP.
    register_setting('rmbz_settings_group', 'rmbz_sub_price');
    register_setting('rmbz_settings_group', 'rmbz_sub_days');

    // [1.5.129] NOVAS settings: inscrição inicial + contactos de suporte.
    register_setting('rmbz_settings_group', 'rmbz_first_deposit_min', [
        'sanitize_callback' => 'rmbz_sanitize_float_setting',
        'default'           => 500,
    ]);
    register_setting('rmbz_settings_group', 'rmbz_support_whatsapp', [
        'sanitize_callback' => 'sanitize_text_field',
        'default'           => '',
    ]);
    register_setting('rmbz_settings_group', 'rmbz_support_email', [
        'sanitize_callback' => 'sanitize_email',
        'default'           => '',
    ]);

    // Registo da Taxa de Comissão (Afiliados)
    register_setting(
        'rmbz_settings_group',
        'rmbz_referral_rate',
        ['sanitize_callback' => 'rmbz_sanitize_float_setting']
    );

    // [1.5.131] Tipo de recompensa do referral: 'mt' (% do depósito) ou 'days' (dias VIP)
    register_setting('rmbz_settings_group', 'rmbz_referral_type', [
        'sanitize_callback' => function($v) {
            $v = sanitize_text_field($v);
            return in_array($v, ['mt', 'days'], true) ? $v : 'mt';
        },
        'default' => 'mt',
    ]);

    // [1.5.131] Quantos dias VIP creditar quando tipo=days
    register_setting('rmbz_settings_group', 'rmbz_referral_days', [
        'sanitize_callback' => 'absint',
        'default'           => 5,
    ]);

    // Registo da Lista Negra de Convites
    register_setting(
        'rmbz_settings_group',
        'rmbz_referral_blacklist',
        ['sanitize_callback' => 'rmbz_sanitize_referral_blacklist']
    );

    // --- NOVO: Registo da Taxa de Câmbio (USD -> MT) ---
    register_setting(
        'rmbz_settings_group',
        'rmbz_exchange_rate',
        ['sanitize_callback' => 'rmbz_sanitize_float_setting']
    );

    // --- [1.5.281] Assistente IA (Claude) ---
    if ( ! function_exists( 'rmbz_ai_sanitize_key' ) ) {
        require_once dirname( __DIR__ ) . '/api/ai/ai-client.php';
    }
    register_setting( 'rmbz_settings_group', 'rmbz_ai_enabled', [
        'sanitize_callback' => 'absint',
        'default'           => 0,
    ] );
    register_setting( 'rmbz_settings_group', 'rmbz_ai_model', [
        'sanitize_callback' => 'sanitize_text_field',
        'default'           => '',
    ] );
    register_setting( 'rmbz_settings_group', 'rmbz_ai_chat_model', [
        'sanitize_callback' => 'sanitize_text_field',
        'default'           => '',
    ] );
    register_setting( 'rmbz_settings_group', 'rmbz_ai_api_key', [
        'sanitize_callback' => 'rmbz_ai_sanitize_key',
        'default'           => '',
    ] );
    register_setting( 'rmbz_settings_group', 'rmbz_ai_recommendations_enabled', [
        'sanitize_callback' => 'absint',
        'default'           => 0,
    ] );

    // [1.6.332] Multa por atraso (videoclipe em curso sem subscrição paga)
    register_setting( 'rmbz_settings_group', 'rmbz_project_fine_value', [
        'sanitize_callback' => function ( $v ) { return max( 0, (float) $v ); },
        'default'           => 0,
    ] );
    register_setting( 'rmbz_settings_group', 'rmbz_project_fine_unit', [
        'sanitize_callback' => function ( $v ) { return $v === 'hour' ? 'hour' : 'day'; },
        'default'           => 'day',
    ] );

    // -----------------------------------------------------------
    // [1.5.129] Secção: Inscrição Inicial + Contactos
    // ANTES: "Configurações de Acesso Artista (Subscrição)" com Preço Mensal
    // + Duração — não fazia sentido depois da introdução dos Pacotes VIP
    // (cada pacote tem o seu preço/dias). Substituída pela inscrição inicial
    // (valor mínimo do primeiro depósito ao registar) e contactos de suporte
    // que aparecem no First Deposit Gate.
    // -----------------------------------------------------------
    add_settings_section(
        'rmbz_signup_section',
        'Inscrição Inicial e Contactos de Suporte',
        'rmbz_signup_section_callback',
        'rmbz-settings'
    );

    add_settings_field(
        'rmbz_first_deposit_min_field',
        'Valor mínimo do 1º depósito (MT)',
        'rmbz_first_deposit_min_callback',
        'rmbz-settings',
        'rmbz_signup_section'
    );

    add_settings_field(
        'rmbz_support_whatsapp_field',
        'WhatsApp do Suporte',
        'rmbz_support_whatsapp_callback',
        'rmbz-settings',
        'rmbz_signup_section'
    );

    add_settings_field(
        'rmbz_support_email_field',
        'Email do Suporte',
        'rmbz_support_email_callback',
        'rmbz-settings',
        'rmbz_signup_section'
    );

    // -----------------------------------------------------------
    // Secção de Pagamento e Financeiro
    // -----------------------------------------------------------
    add_settings_section(
        'rmbz_payment_section',
        'Dados de Recebimento & Financeiro',
        'rmbz_payment_section_callback',
        'rmbz-settings'
    );
    add_settings_field('rmbz_mpesa_number', 'Número M-Pesa', 'rmbz_mpesa_number_callback', 'rmbz-settings', 'rmbz_payment_section');
    add_settings_field('rmbz_mpesa_name', 'Nome da Conta M-Pesa', 'rmbz_mpesa_name_callback', 'rmbz-settings', 'rmbz_payment_section');
    add_settings_field('rmbz_emola_number', 'Número E-Mola', 'rmbz_emola_number_callback', 'rmbz-settings', 'rmbz_payment_section');
    add_settings_field('rmbz_emola_name', 'Nome da Conta E-Mola', 'rmbz_emola_name_callback', 'rmbz-settings', 'rmbz_payment_section');
    
    // Campo Novo: Taxa de Câmbio
    add_settings_field(
        'rmbz_exchange_rate_field',
        'Taxa de Câmbio (1 USD = ? MT)',
        'rmbz_exchange_rate_callback',
        'rmbz-settings',
        'rmbz_payment_section'
    );

    // -----------------------------------------------------------
    // [1.5.281] Assistente IA — narrativa dos insights via Claude
    // -----------------------------------------------------------
    add_settings_section(
        'rmbz_ai_section',
        '🤖 Assistente IA (Claude)',
        'rmbz_ai_section_callback',
        'rmbz-settings'
    );
    add_settings_field(
        'rmbz_ai_enabled_field',
        'Ativar Assistente IA',
        'rmbz_ai_enabled_callback',
        'rmbz-settings',
        'rmbz_ai_section'
    );
    add_settings_field(
        'rmbz_ai_api_key_field',
        'Chave da API (Anthropic)',
        'rmbz_ai_api_key_callback',
        'rmbz-settings',
        'rmbz_ai_section'
    );
    add_settings_field(
        'rmbz_ai_model_field',
        'Modelo (insights/coach)',
        'rmbz_ai_model_callback',
        'rmbz-settings',
        'rmbz_ai_section'
    );
    add_settings_field(
        'rmbz_ai_chat_model_field',
        'Modelo de conversa (chats)',
        'rmbz_ai_chat_model_callback',
        'rmbz-settings',
        'rmbz_ai_section'
    );
    add_settings_field(
        'rmbz_ai_recommendations_field',
        'Recomendações com IA na app',
        'rmbz_ai_recommendations_callback',
        'rmbz-settings',
        'rmbz_ai_section'
    );

    // -----------------------------------------------------------
    // [1.6.332] Secção: Multa por atraso (Ganhar Vídeo)
    // -----------------------------------------------------------
    add_settings_section(
        'rmbz_project_fine_section',
        '🎬 Multa por atraso (videoclipe em curso)',
        'rmbz_project_fine_section_callback',
        'rmbz-settings'
    );
    add_settings_field(
        'rmbz_project_fine_value_field',
        'Valor da multa (MT)',
        'rmbz_project_fine_value_callback',
        'rmbz-settings',
        'rmbz_project_fine_section'
    );
    add_settings_field(
        'rmbz_project_fine_unit_field',
        'Por',
        'rmbz_project_fine_unit_callback',
        'rmbz-settings',
        'rmbz_project_fine_section'
    );

    // -----------------------------------------------------------
    // Secção de Notificações
    // -----------------------------------------------------------
    add_settings_section(
        'rmbz_status_section',
        'Notificações',
        'rmbz_status_section_callback',
        'rmbz-settings'
    );
    
    add_settings_field(
        'rmbz_admin_email_field',
        'Email para Alertas',
        'rmbz_admin_email_field_callback',
        'rmbz-settings',
        'rmbz_status_section'
    );

    // -----------------------------------------------------------
    // Secção de Convites (Afiliados)
    // -----------------------------------------------------------
    add_settings_section(
        'rmbz_referral_section',
        'Configurações de Convites',
        'rmbz_referral_section_callback',
        'rmbz-settings'
    );

    // [1.5.131] Tipo de recompensa: mt (% do valor pago) ou dias VIP grátis.
    add_settings_field(
        'rmbz_referral_type_field',
        'Tipo de Recompensa',
        'rmbz_referral_type_callback',
        'rmbz-settings',
        'rmbz_referral_section'
    );

    add_settings_field(
        'rmbz_referral_rate_field',
        'Comissão em MT (%)',
        'rmbz_referral_rate_callback',
        'rmbz-settings',
        'rmbz_referral_section'
    );

    // [1.5.131] Quantos dias VIP grátis dar ao convidador (se tipo=days).
    add_settings_field(
        'rmbz_referral_days_field',
        'Dias VIP de Recompensa',
        'rmbz_referral_days_callback',
        'rmbz-settings',
        'rmbz_referral_section'
    );

    add_settings_field(
        'rmbz_referral_blacklist_field',
        'Lista Negra (Sem Comissão)',
        'rmbz_referral_blacklist_field_callback',
        'rmbz-settings',
        'rmbz_referral_section'
    );

    // -----------------------------------------------------------
    // [1.6.47] Bloqueios Globais — afectam TODOS os artistas
    // -----------------------------------------------------------
    foreach ( rmbz_global_blocks_keys() as $type => $option_key ) {
        register_setting( 'rmbz_settings_group', $option_key, [
            'sanitize_callback' => 'absint',
            'default'           => 0,
        ]);
    }

    add_settings_section(
        'rmbz_global_blocks_section',
        '🚫 Bloqueios Globais (Toda a Plataforma)',
        'rmbz_global_blocks_section_callback',
        'rmbz-settings'
    );

    add_settings_field(
        'rmbz_global_block_withdrawals_field',
        'Bloquear Levantamentos',
        function() { rmbz_global_block_toggle_field( 'withdrawals', 'Suspende todos os pedidos de levantamento da plataforma. Útil durante manutenção bancária ou auditoria.' ); },
        'rmbz-settings',
        'rmbz_global_blocks_section'
    );

    add_settings_field(
        'rmbz_global_block_deposits_field',
        'Bloquear Depósitos',
        function() { rmbz_global_block_toggle_field( 'deposits', 'Suspende todos os novos depósitos (subscrição, licenciamento, etc). Útil quando se troca de PSP.' ); },
        'rmbz-settings',
        'rmbz_global_blocks_section'
    );

    add_settings_field(
        'rmbz_global_block_distribution_field',
        'Bloquear Distribuição',
        function() { rmbz_global_block_toggle_field( 'distribution', 'Impede a criação e envio de novas releases para as lojas digitais.' ); },
        'rmbz-settings',
        'rmbz_global_blocks_section'
    );

    add_settings_field(
        'rmbz_global_block_site_field',
        'Bloquear Gestão de Músicas (Site)',
        function() { rmbz_global_block_toggle_field( 'site', 'Impede a publicação de novas músicas no site (envios audio_site). O artista vê o card "Enviar para o Site" desactivado no formulário.' ); },
        'rmbz-settings',
        'rmbz_global_blocks_section'
    );

    add_settings_field(
        'rmbz_global_block_social_field',
        'Bloquear Promover Vídeos (Redes Sociais)',
        function() { rmbz_global_block_toggle_field( 'social', 'Impede o envio de vídeos para promoção nas redes sociais (envios video_social). O artista vê o card "Redes Sociais" desactivado.' ); },
        'rmbz-settings',
        'rmbz_global_blocks_section'
    );

    add_settings_field(
        'rmbz_global_block_video_field',
        'Bloquear Candidaturas a Videoclipe',
        function() { rmbz_global_block_toggle_field( 'video', 'Impede novas candidaturas a videoclipe (projectos).' ); },
        'rmbz-settings',
        'rmbz_global_blocks_section'
    );

    add_settings_field(
        'rmbz_global_block_logins_field',
        '⚠️ Bloquear Logins (Manutenção Total)',
        function() { rmbz_global_block_toggle_field( 'logins', 'CUIDADO: impede TODOS os logins novos no app e no site. Sessões já abertas continuam mas todas as chamadas API são rejeitadas. Use APENAS durante manutenção crítica/restore.', true ); },
        'rmbz-settings',
        'rmbz_global_blocks_section'
    );
}
add_action( 'admin_init', 'rmbz_register_settings' );

/**
 * Funções de sanitização.
 */
function rmbz_sanitize_payment_settings( $input ) {
    $sanitized_input = [];
    if ( isset( $input['rmbz_mpesa_number'] ) ) $sanitized_input['rmbz_mpesa_number'] = sanitize_text_field( $input['rmbz_mpesa_number'] );
    if ( isset( $input['rmbz_mpesa_name'] ) ) $sanitized_input['rmbz_mpesa_name'] = sanitize_text_field( $input['rmbz_mpesa_name'] );
    if ( isset( $input['rmbz_emola_number'] ) ) $sanitized_input['rmbz_emola_number'] = sanitize_text_field( $input['rmbz_emola_number'] );
    if ( isset( $input['rmbz_emola_name'] ) ) $sanitized_input['rmbz_emola_name'] = sanitize_text_field( $input['rmbz_emola_name'] );
    return $sanitized_input;
}

function rmbz_sanitize_float_setting( $input ) {
    $value = sanitize_text_field( $input );
    $value = str_replace(',', '.', (string) ($value ?? '')); 
    if ( is_numeric($value) && $value >= 0 ) {
        return (float) $value;
    }
    return 0.0; // Default seguro
}

/**
 * [BUGFIX 1.5.10] Helper central para ler a taxa de câmbio USD→MT.
 *
 * Problema antigo: get_option('rmbz_exchange_rate', 63.50) devolvia o default
 * APENAS se a opção não existisse na BD. Mas se o admin por engano guardasse
 * o campo vazio/inválido, rmbz_sanitize_float_setting convertia para 0.0 e
 * guardava 0.0 na BD. Aí get_option devolvia 0.0 e o default de 63.50 nunca
 * se aplicava — saldos em MT apareciam como "0,00 MT" no dashboard e na
 * página Minha Conta.
 *
 * O distribution-financial.php já tinha um guard `if ($rate <= 0) $rate =
 * 63.50;` mas my-account-page.php e distribution-main.php estavam em falta.
 * Esta função unifica a lógica: lê a opção, valida > 0, senão aplica o
 * default de 63.50. Todos os callers devem usar esta função em vez de
 * chamar get_option directamente.
 *
 * @return float Taxa de câmbio (USD → MT). Nunca ≤ 0.
 */
if ( ! function_exists('rmbz_get_exchange_rate') ) {
    function rmbz_get_exchange_rate() {
        $rate = (float) get_option('rmbz_exchange_rate', 63.50);
        if ( $rate <= 0 ) {
            $rate = 63.50;
        }
        return $rate;
    }
}

function rmbz_sanitize_referral_blacklist( $input ) {
    // [1.6.340] Pode chegar como ARRAY (update_option programático, ex.: castigos
    // no perfil do artista) OU como STRING (textarea do admin, separada por
    // vírgulas). Antes só tratava string → `explode()` rebentava com o array.
    if ( is_array( $input ) ) {
        $phones = $input;
    } elseif ( $input !== '' && $input !== null ) {
        $phones = explode( ',', (string) $input );
    } else {
        $phones = [];
    }

    $sanitized_array = [];
    foreach ( $phones as $phone ) {
        $clean_phone = sanitize_text_field( trim( (string) $phone ) );
        if ( $clean_phone !== '' ) {
            $sanitized_array[] = $clean_phone;
        }
    }
    return array_values( array_unique( $sanitized_array ) );
}

/**
 * Callbacks de Secção e Campos.
 */

// [1.5.129] Secção "Inscrição Inicial e Contactos de Suporte"
function rmbz_signup_section_callback() {
    echo '<p>Quando um artista cria conta nova, deve fazer um primeiro depósito '
       . 'para validar a conta. Define aqui o valor mínimo desse depósito e os '
       . 'contactos de suporte que vão aparecer ao artista enquanto aguarda '
       . 'confirmação do pagamento (até 24h, conforme o First Deposit Gate). '
       . 'Os preços/durações dos planos VIP são geridos no separador <strong>Pacotes VIP</strong>.</p>';
}

function rmbz_first_deposit_min_callback() {
    $val = get_option('rmbz_first_deposit_min', 500);
    echo '<input type="number" min="0" step="1" name="rmbz_first_deposit_min" value="'
       . esc_attr($val) . '" class="regular-text"> MT';
    echo '<p class="description">Valor mínimo que o utilizador tem de depositar para activar a conta. '
       . 'Quando o admin aprovar o depósito, o valor fica creditado na carteira do artista — ele depois '
       . 'usa-o para comprar um Pacote VIP à escolha. Sugestão: alinhar com o pacote VIP mais barato.</p>';
}

function rmbz_support_whatsapp_callback() {
    $val = get_option('rmbz_support_whatsapp', '');
    echo '<input type="text" name="rmbz_support_whatsapp" value="' . esc_attr($val)
       . '" placeholder="+258 84 0000000" class="regular-text">';
    echo '<p class="description">Número de WhatsApp que aparece no botão "💬 WhatsApp" do First Deposit Gate. '
       . 'Formato livre — podes incluir espaços. Se vazio, o botão WhatsApp não é mostrado.</p>';
}

function rmbz_support_email_callback() {
    $val = get_option('rmbz_support_email', '');
    $admin_fallback = get_option('admin_email');
    echo '<input type="email" name="rmbz_support_email" value="' . esc_attr($val)
       . '" placeholder="' . esc_attr($admin_fallback) . '" class="regular-text">';
    echo '<p class="description">Email de suporte mostrado no First Deposit Gate. '
       . 'Se vazio, é usado o "Email do administrador WordPress" (' . esc_html($admin_fallback) . ').</p>';
}

// [1.5.129] Mantidos por retrocompatibilidade (deixaram de aparecer no UI
// porque a secção legacy foi removida). Os planos VIP gerem os preços por
// pacote agora.
function rmbz_subscription_section_callback() {
    echo '<p>(Legacy — gere os preços através dos Pacotes VIP.)</p>';
}

function rmbz_sub_price_callback() {
    $price = get_option('rmbz_sub_price', '1500');
    echo '<input type="text" name="rmbz_sub_price" value="' . esc_attr($price) . '" class="regular-text"> MT';
}

function rmbz_sub_days_callback() {
    $days = get_option('rmbz_sub_days', '30');
    echo '<input type="number" name="rmbz_sub_days" value="' . esc_attr($days) . '" class="regular-text"> Dias';
}

function rmbz_status_section_callback() {
    echo '<p>Configurações de notificação.</p>';
}

function rmbz_admin_email_field_callback() {
    $email = get_option('rmbz_admin_notification_email', get_option('admin_email'));
    printf( '<input type="email" class="regular-text" name="rmbz_admin_notification_email" value="%s" placeholder="%s" />', esc_attr($email), esc_attr(get_option('admin_email')) );
    echo '<p class="description">Este endereço receberá alertas de novas submissões de música.</p>';
}

function rmbz_payment_section_callback() {
    echo '<p>Contas bancárias/móveis onde os artistas devem depositar os valores.</p>';
}

function rmbz_get_setting($option_name) {
    $options = get_option('rmbz_payment_settings');
    if ( is_array($options) && isset($options[$option_name]) ) {
        return esc_attr($options[$option_name]);
    }
    return '';
}

function rmbz_mpesa_number_callback() {
    printf( '<input type="text" class="regular-text" name="rmbz_payment_settings[rmbz_mpesa_number]" value="%s" placeholder="Ex: 841234567" />', rmbz_get_setting('rmbz_mpesa_number') );
}
function rmbz_mpesa_name_callback() {
    printf( '<input type="text" class="regular-text" name="rmbz_payment_settings[rmbz_mpesa_name]" value="%s" placeholder="Ex: 1MZ Records" />', rmbz_get_setting('rmbz_mpesa_name') );
}
function rmbz_emola_number_callback() {
    printf( '<input type="text" class="regular-text" name="rmbz_payment_settings[rmbz_emola_number]" value="%s" placeholder="Ex: 861234567" />', rmbz_get_setting('rmbz_emola_number') );
}
function rmbz_emola_name_callback() {
    printf( '<input type="text" class="regular-text" name="rmbz_payment_settings[rmbz_emola_name]" value="%s" placeholder="Ex: 1MZ Records" />', rmbz_get_setting('rmbz_emola_name') );
}

function rmbz_exchange_rate_callback() {
    $rate = get_option('rmbz_exchange_rate', 63.50); // Valor padrão
    echo '<input type="number" step="0.01" name="rmbz_exchange_rate" value="' . esc_attr($rate) . '" class="regular-text"> MT';
    echo '<p class="description">Usado para converter os Royalties (USD) em Saldo de Carteira (MT) quando o artista faz uma retirada.</p>';
}

/* ----------------------------------------------------------------------- */
/* [1.5.281] Assistente IA (Claude)                                        */
/* ----------------------------------------------------------------------- */

function rmbz_ai_section_callback() {
    if ( ! function_exists( 'rmbz_ai_available' ) ) {
        require_once dirname( __DIR__ ) . '/api/ai/ai-client.php';
    }
    echo '<p>O <strong>Assistente do Artista</strong> mostra insights aos artistas na app. '
       . 'Com a IA ligada, o Claude redige a análise em linguagem natural a partir dos '
       . '<em>números reais</em> de cada artista (os números nunca são inventados). '
       . 'Sem chave, a app continua a funcionar com a narrativa automática.</p>';

    if ( function_exists( 'rmbz_ai_available' ) ) {
        if ( rmbz_ai_available() ) {
            echo '<p style="color:#1a7f37;font-weight:600;">✅ IA ativa — a usar o modelo ' . esc_html( rmbz_ai_model() ) . '.</p>';
        } elseif ( (int) get_option( 'rmbz_ai_enabled', 0 ) === 1 ) {
            echo '<p style="color:#b35900;font-weight:600;">⚠️ Ativada mas sem chave válida — a app usa a narrativa automática até colares a chave.</p>';
        }
    }
    if ( defined( 'RMBZ_ANTHROPIC_API_KEY' ) && RMBZ_ANTHROPIC_API_KEY ) {
        echo '<p class="description">A chave está definida no <code>wp-config.php</code> (RMBZ_ANTHROPIC_API_KEY) e tem prioridade sobre o campo abaixo.</p>';
    }
}

function rmbz_ai_enabled_callback() {
    $on = (int) get_option( 'rmbz_ai_enabled', 0 ) === 1;
    echo '<label><input type="checkbox" name="rmbz_ai_enabled" value="1" ' . checked( $on, true, false ) . '> '
       . 'Usar o Claude para redigir os insights</label>';
    echo '<p class="description">Se desligado, a app usa a narrativa automática (gratuita) — os números são exactamente os mesmos.</p>';
}

function rmbz_ai_api_key_callback() {
    if ( ! function_exists( 'rmbz_ai_masked_key' ) ) {
        require_once dirname( __DIR__ ) . '/api/ai/ai-client.php';
    }
    $masked = rmbz_ai_masked_key();
    $placeholder = $masked !== '' ? esc_attr( $masked ) : 'sk-ant-...';
    echo '<input type="password" autocomplete="new-password" class="regular-text" '
       . 'name="rmbz_ai_api_key" value="" placeholder="' . $placeholder . '" />';
    if ( $masked !== '' ) {
        echo '<p class="description">Já existe uma chave guardada (' . esc_html( $masked ) . '). '
           . 'Deixa em branco para a manter; escreve uma nova para a substituir.</p>';
    } else {
        echo '<p class="description">Cola a tua chave da Anthropic (começa por <code>sk-ant-</code>). '
           . 'É guardada encriptada e nunca é enviada à app.</p>';
    }
}

function rmbz_project_fine_section_callback() {
    echo '<p>Quando um artista tem um <strong>videoclipe em produção</strong> e a subscrição '
       . '<strong>expira</strong>, o sistema conta automaticamente o tempo em atraso e gera uma '
       . '<strong>multa acumulada</strong> (valor &times; dias/horas). A multa é mostrada ao artista '
       . '(app + site) e aqui no admin — <strong>não é debitada automaticamente</strong> da carteira; '
       . 'a equipa decide quando/se cobra. Define <strong>0</strong> para desligar (mostra só o aviso para renovar).</p>';
}

function rmbz_project_fine_value_callback() {
    $v = (float) get_option( 'rmbz_project_fine_value', 0 );
    echo '<input type="number" step="0.01" min="0" class="small-text" name="rmbz_project_fine_value" value="' . esc_attr( $v ) . '" /> MT';
    echo '<p class="description">Valor por dia/hora de atraso. 0 = multa desligada.</p>';
}

function rmbz_project_fine_unit_callback() {
    $u = get_option( 'rmbz_project_fine_unit', 'day' );
    echo '<select name="rmbz_project_fine_unit">';
    echo '<option value="day" ' . selected( $u, 'day', false ) . '>Dia</option>';
    echo '<option value="hour" ' . selected( $u, 'hour', false ) . '>Hora</option>';
    echo '</select>';
    echo '<p class="description">Conta a multa por dia ou por hora de atraso.</p>';
}

function rmbz_ai_recommendations_callback() {
    $on = (int) get_option( 'rmbz_ai_recommendations_enabled', 0 ) === 1;
    echo '<label><input type="checkbox" name="rmbz_ai_recommendations_enabled" value="1" ' . checked( $on, true, false ) . '> '
       . 'Deixar o Claude redigir as recomendações das listas (submissões: Site e Redes)</label>';
    echo '<p class="description">Quando ligado, as dicas das listas (“Partilha e cresce”, “Em processamento”, “Corrige para avançar”…) '
       . 'são escritas pela IA — em bom português e variadas — e <strong>guardadas em cache por estado</strong>, '
       . 'por isso <strong>não gastam tokens a cada abertura</strong>. Se desligado, a app usa textos pré-definidos (gratuitos). '
       . 'Precisa do Assistente IA ativado e da chave acima.</p>';
}

function rmbz_ai_model_callback() {
    if ( ! function_exists( 'rmbz_ai_model' ) ) {
        require_once dirname( __DIR__ ) . '/api/ai/ai-client.php';
    }
    $current = rmbz_ai_model();
    $options = [
        'claude-haiku-4-5-20251001'  => 'Haiku 4.5 — rápido e económico (recomendado)',
        'claude-sonnet-4-6'          => 'Sonnet 4.6 — mais detalhe, custo maior',
        'claude-opus-4-8'            => 'Opus 4.8 — o mais inteligente, custo mais alto',
    ];
    echo '<select name="rmbz_ai_model">';
    foreach ( $options as $val => $label ) {
        echo '<option value="' . esc_attr( $val ) . '" ' . selected( $current, $val, false ) . '>'
           . esc_html( $label ) . '</option>';
    }
    // Se houver um modelo personalizado guardado que não está na lista, preserva-o.
    if ( ! isset( $options[ $current ] ) ) {
        echo '<option value="' . esc_attr( $current ) . '" selected>' . esc_html( $current ) . ' (personalizado)</option>';
    }
    echo '</select>';
    echo '<p class="description">Para insights curtos, o Haiku chega e é muito barato.</p>';
}

function rmbz_ai_chat_model_callback() {
    if ( ! function_exists( 'rmbz_ai_chat_model' ) ) {
        require_once dirname( __DIR__ ) . '/api/ai/ai-client.php';
    }
    $current = rmbz_ai_chat_model();
    $options = [
        'claude-opus-4-8'           => 'Opus 4.8 — o mais inteligente (recomendado para conversa)',
        'claude-sonnet-4-6'         => 'Sonnet 4.6 — bom raciocínio, mais barato',
        'claude-haiku-4-5-20251001' => 'Haiku 4.5 — mais barato, raciocínio simples',
    ];
    echo '<select name="rmbz_ai_chat_model">';
    foreach ( $options as $val => $label ) {
        echo '<option value="' . esc_attr( $val ) . '" ' . selected( $current, $val, false ) . '>'
           . esc_html( $label ) . '</option>';
    }
    if ( ! isset( $options[ $current ] ) ) {
        echo '<option value="' . esc_attr( $current ) . '" selected>' . esc_html( $current ) . ' (personalizado)</option>';
    }
    echo '</select>';
    echo '<p class="description">Usado só nos <strong>chats</strong> ("Perguntar ao assistente" e "Detalhes com IA"), '
       . 'onde o raciocínio importa. O Sonnet pensa melhor e adapta-se à conversa (custa mais por mensagem, '
       . 'mas os chats são poucos e com cache). Os insights/coach continuam no modelo acima (barato).</p>';
}

function rmbz_referral_section_callback() {
    echo '<p>Sistema de convites — quando um artista convida outro pelo telemóvel, '
       . 'recebe uma recompensa quando o convidado: <strong>(1)</strong> tem o 1º depósito '
       . 'aprovado, <strong>E (2)</strong> compra um plano VIP. Os dois passos têm de ser '
       . 'cumpridos para a comissão ser paga (anti-fraude).</p>';
}

// [1.5.131] Tipo de recompensa
function rmbz_referral_type_callback() {
    $type = get_option('rmbz_referral_type', 'mt');
    ?>
    <label style="display:block;margin-bottom:6px;">
        <input type="radio" name="rmbz_referral_type" value="mt" <?php checked($type, 'mt'); ?>>
        <strong>MT na carteira</strong> — percentagem sobre o depósito do amigo (configurável abaixo)
    </label>
    <label style="display:block;">
        <input type="radio" name="rmbz_referral_type" value="days" <?php checked($type, 'days'); ?>>
        <strong>Dias VIP grátis</strong> — número fixo de dias adicionados à subscrição (configurável abaixo)
    </label>
    <?php
}

function rmbz_referral_rate_callback() {
    $rate = get_option('rmbz_referral_rate', 3.0);
    printf( '<input type="text" class="regular-text" name="rmbz_referral_rate" value="%s" placeholder="Ex: 3.0" /> %%', esc_attr(number_format_i18n($rate, 2)) );
    echo '<p class="description">Só usado quando "Tipo de Recompensa" = MT. Percentagem do valor depositado pelo convidado que é creditada ao convidador.</p>';
}

// [1.5.131] Dias VIP de recompensa
function rmbz_referral_days_callback() {
    $days = (int) get_option('rmbz_referral_days', 5);
    printf( '<input type="number" min="0" step="1" class="regular-text" name="rmbz_referral_days" value="%d" /> dias', $days );
    echo '<p class="description">Só usado quando "Tipo de Recompensa" = Dias VIP. Quantos dias adicionar à subscrição activa do convidador (ou criar uma nova subscrição se não tiver).</p>';
}

function rmbz_referral_blacklist_field_callback() {
    $blacklist_array = get_option('rmbz_referral_blacklist', []);
    $blacklist_string = implode( ", ", $blacklist_array );
    ?>
    <textarea name="rmbz_referral_blacklist" id="rmbz_referral_blacklist" rows="3" class="large-text"><?php echo esc_textarea( $blacklist_string ); ?></textarea>
    <p class="description">Números de telemóvel que não podem receber comissões (separados por vírgula).</p>
    <?php
}

/* =========================================================================
 * [1.6.47] Bloqueios Globais — callbacks
 * =========================================================================
 */
function rmbz_global_blocks_section_callback() {
    ?>
    <p style="background: #fef3e1; padding: 10px 14px; border-left: 4px solid #d63638; margin: 10px 0;">
        <strong>⚠️ Atenção:</strong> Estes flags afectam <strong>TODA</strong> a plataforma
        — todos os artistas serão impedidos de realizar a acção bloqueada.
        Use apenas durante manutenção, mudança de PSP, auditoria ou emergência.
        Os artistas verão mensagem clara de "serviço suspenso temporariamente"
        no app e no site.
    </p>
    <?php
    // Banner extra dentro da própria página de settings, listando o que está activo
    $active = rmbz_global_blocks_active();
    if ( ! empty( $active ) ) {
        $labels = array_map( 'rmbz_global_block_label', $active );
        echo '<p style="background: #ffe9e9; padding: 8px 12px; border-left: 4px solid #d63638; font-size: 13px;">';
        echo '<strong>Actualmente activos:</strong> ' . esc_html( implode( ', ', $labels ) );
        echo '</p>';
    }
}

/**
 * Renderiza um toggle (checkbox) para um bloqueio global específico.
 *
 * @param string $type        Tipo: withdrawals, deposits, etc.
 * @param string $description Texto explicativo por baixo
 * @param bool   $dangerous   Se true, mostra com aviso vermelho extra
 */
function rmbz_global_block_toggle_field( $type, $description, $dangerous = false ) {
    $keys = rmbz_global_blocks_keys();
    $option_key = $keys[ $type ] ?? null;
    if ( ! $option_key ) return;

    $current = (int) get_option( $option_key, 0 );
    ?>
    <label style="display: flex; align-items: center; gap: 8px;">
        <input type="checkbox" name="<?php echo esc_attr( $option_key ); ?>" value="1" <?php checked( $current, 1 ); ?>>
        <span style="font-weight: <?php echo $current ? 'bold' : 'normal'; ?>; color: <?php echo $current ? '#d63638' : 'inherit'; ?>;">
            <?php echo $current ? '🚫 BLOQUEADO' : 'Permitido'; ?>
        </span>
    </label>
    <p class="description" style="<?php echo $dangerous ? 'color: #d63638; font-weight: 500;' : ''; ?>">
        <?php echo esc_html( $description ); ?>
    </p>
    <?php
}

/**
 * [1.6.334] Estilos Material 3 da página de Configurações. Mantém-se simples e
 * scoped a `.rmbz-settings-modern` para não afetar o resto do wp-admin.
 */
function rmbz_settings_modern_styles() {
    ?>
    <style>
    .rmbz-settings-modern{
        --m3-primary:#5B4CE0; --m3-primary-press:#4A3ECF;
        --m3-surface:#ffffff; --m3-surface-2:#f5f4fb; --m3-outline:#e3e1ee;
        --m3-text:#1c1b2a; --m3-muted:#6b6880; --m3-accent:#D4AF37;
        max-width:none; margin-right:20px;
    }
    .rmbz-settings-modern h1{ font-weight:700; letter-spacing:-.02em; color:var(--m3-text); }
    /* Sub-abas (pílulas) */
    .rmbz-subtabs{
        display:flex; flex-wrap:wrap; gap:8px; margin:0 0 20px; padding:6px;
        background:var(--m3-surface-2); border:1px solid var(--m3-outline);
        border-radius:16px;
    }
    .rmbz-subtab{
        appearance:none; border:0; cursor:pointer; font-size:13px; font-weight:600;
        color:var(--m3-muted); background:transparent; padding:9px 16px; border-radius:11px;
        transition:all .15s ease; line-height:1.2; white-space:nowrap;
    }
    .rmbz-subtab:hover{ color:var(--m3-text); background:rgba(91,76,224,.08); }
    .rmbz-subtab.is-active{
        color:#fff; background:var(--m3-primary);
        box-shadow:0 2px 8px rgba(91,76,224,.35);
    }
    /* Painel de cada secção = card M3 */
    .rmbz-settings-modern .rmbz-panel{
        background:var(--m3-surface); border:1px solid var(--m3-outline);
        border-radius:20px; padding:8px 26px 22px; margin:0;
        box-shadow:0 1px 2px rgba(28,27,42,.04), 0 6px 20px rgba(28,27,42,.05);
    }
    .rmbz-settings-modern .rmbz-panel > h2{
        font-size:18px; font-weight:700; color:var(--m3-text); letter-spacing:-.01em;
        padding:18px 0 6px; margin:0 0 6px; border-bottom:1px solid var(--m3-outline);
        display:flex; align-items:center; gap:8px;
    }
    .rmbz-settings-modern .rmbz-panel > p{ color:var(--m3-muted); font-size:13.5px; }
    .rmbz-settings-modern .form-table th{
        color:var(--m3-text); font-weight:600; font-size:13.5px; padding-top:18px;
    }
    .rmbz-settings-modern .form-table td{ padding-top:14px; }
    .rmbz-settings-modern .description{ color:var(--m3-muted); font-size:12.5px; }
    /* Inputs M3 */
    .rmbz-settings-modern input[type=text],
    .rmbz-settings-modern input[type=number],
    .rmbz-settings-modern input[type=email],
    .rmbz-settings-modern input[type=password],
    .rmbz-settings-modern input[type=url],
    .rmbz-settings-modern select,
    .rmbz-settings-modern textarea{
        border:1.5px solid var(--m3-outline); border-radius:11px; padding:8px 12px;
        background:var(--m3-surface); color:var(--m3-text); min-height:38px;
        box-shadow:none; transition:border-color .15s ease, box-shadow .15s ease;
    }
    .rmbz-settings-modern input:focus,
    .rmbz-settings-modern select:focus,
    .rmbz-settings-modern textarea:focus{
        border-color:var(--m3-primary);
        box-shadow:0 0 0 3px rgba(91,76,224,.18); outline:none;
    }
    .rmbz-settings-modern input[type=checkbox]:checked{
        background:var(--m3-primary); border-color:var(--m3-primary);
    }
    .rmbz-settings-modern input[type=checkbox]:checked::before{ filter:brightness(4); }
    /* Barra de guardar — botão M3 */
    .rmbz-settings-modern .rmbz-save-bar{
        position:sticky; bottom:0; z-index:5; margin-top:18px; padding:14px 0;
        background:linear-gradient(to top, var(--m3-surface-2) 60%, rgba(245,244,251,0));
    }
    .rmbz-settings-modern .rmbz-save-bar .button-primary{
        background:var(--m3-primary); border-color:var(--m3-primary-press);
        border-radius:12px; padding:6px 26px; height:auto; min-height:40px;
        font-weight:600; box-shadow:0 2px 10px rgba(91,76,224,.35); text-shadow:none;
    }
    .rmbz-settings-modern .rmbz-save-bar .button-primary:hover{ background:var(--m3-primary-press); }
    /* Card de manutenção */
    .rmbz-settings-modern .card{
        border-radius:20px !important; border:1px solid var(--m3-outline) !important;
        box-shadow:0 1px 2px rgba(28,27,42,.04), 0 6px 20px rgba(28,27,42,.05);
    }
    @media (max-width:782px){
        .rmbz-settings-modern .rmbz-panel{ padding:6px 16px 18px; }
    }
    </style>
    <?php
}

/**
 * [1.6.334] Script que separa as secções (cada `<h2>` + a sua tabela) em
 * sub-abas. Tudo continua DENTRO do mesmo formulário, por isso guardar grava
 * TODOS os campos — independentemente da aba ativa. Sem dependências.
 */
function rmbz_settings_modern_script() {
    ?>
    <script>
    (function(){
        var container = document.getElementById('rmbz-settings-sections');
        if(!container) return;
        var nodes = Array.prototype.slice.call(container.children);
        var groups = [], current = null;
        nodes.forEach(function(node){
            if(node.tagName === 'H2'){
                current = { title: node.textContent.trim(), nodes: [node] };
                groups.push(current);
            } else if(current){
                current.nodes.push(node);
            } else {
                current = { title: 'Geral', nodes: [node] };
                groups.push(current);
            }
        });
        if(groups.length < 2) return;

        var tabbar = document.createElement('div');
        tabbar.className = 'rmbz-subtabs';
        var panels = [];
        groups.forEach(function(g, i){
            var panel = document.createElement('div');
            panel.className = 'rmbz-panel';
            g.nodes.forEach(function(n){ panel.appendChild(n); });
            container.appendChild(panel);
            panels.push(panel);

            var btn = document.createElement('button');
            btn.type = 'button';
            btn.className = 'rmbz-subtab';
            btn.textContent = g.title;
            btn.addEventListener('click', function(){ activate(i); });
            tabbar.appendChild(btn);
        });
        container.insertBefore(tabbar, container.firstChild);

        function activate(i){
            panels.forEach(function(p, idx){ p.style.display = idx === i ? 'block' : 'none'; });
            var btns = tabbar.querySelectorAll('.rmbz-subtab');
            for(var k=0;k<btns.length;k++){ btns[k].classList.toggle('is-active', k === i); }
            try { localStorage.setItem('rmbzSettingsTab', i); } catch(e){}
        }

        var saved = 0;
        try {
            var s = parseInt(localStorage.getItem('rmbzSettingsTab'), 10);
            if(!isNaN(s) && s >= 0 && s < groups.length) saved = s;
        } catch(e){}
        activate(saved);
    })();
    </script>
    <?php
}

/**
 * Exibe o formulário da página de configurações.
 */
function rmbz_display_settings_page() {
    // [1.6.118.110] Abas na página de Configurações
    $active_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'geral';
    $base_url   = admin_url( 'admin.php?page=rmbz-settings' );
    ?>
    <div class="wrap rmbz-settings-modern">
        <?php rmbz_settings_modern_styles(); ?>
        <h1>Configurações 1MZ For Artists</h1>

        <h2 class="nav-tab-wrapper" style="margin-bottom:20px;">
            <a href="<?php echo esc_url( $base_url . '&tab=geral' ); ?>"
               class="nav-tab <?php echo $active_tab === 'geral' ? 'nav-tab-active' : ''; ?>">Geral</a>
            <a href="<?php echo esc_url( $base_url . '&tab=artists' ); ?>"
               class="nav-tab <?php echo $active_tab === 'artists' ? 'nav-tab-active' : ''; ?>">Música no site</a>
            <a href="<?php echo esc_url( $base_url . '&tab=pwa' ); ?>"
               class="nav-tab <?php echo $active_tab === 'pwa' ? 'nav-tab-active' : ''; ?>">🔔 Notificações PWA</a>
            <a href="<?php echo esc_url( $base_url . '&tab=push-diag' ); ?>"
               class="nav-tab <?php echo $active_tab === 'push-diag' ? 'nav-tab-active' : ''; ?>">🩺 Diagnóstico Push</a>
            <a href="<?php echo esc_url( $base_url . '&tab=cleanup' ); ?>"
               class="nav-tab <?php echo $active_tab === 'cleanup' ? 'nav-tab-active' : ''; ?>">🧹 Cleanup</a>
            <a href="<?php echo esc_url( $base_url . '&tab=emails' ); ?>"
               class="nav-tab <?php echo $active_tab === 'emails' ? 'nav-tab-active' : ''; ?>">📧 E-mails</a>
            <a href="<?php echo esc_url( $base_url . '&tab=s3' ); ?>"
               class="nav-tab <?php echo $active_tab === 's3' ? 'nav-tab-active' : ''; ?>">☁️ S3</a>
            <a href="<?php echo esc_url( $base_url . '&tab=predeploy' ); ?>"
               class="nav-tab <?php echo $active_tab === 'predeploy' ? 'nav-tab-active' : ''; ?>">🛡 Pré-Deploy</a>
        </h2>

        <?php
        if ( $active_tab === 'artists' ) {
            if ( function_exists( 'rmbz_render_artists_settings_tab' ) ) {
                rmbz_render_artists_settings_tab();
            } else {
                echo '<p>O módulo de música no site não está ativo.</p>';
            }
            echo '</div>';
            return;
        }

        // [1.6.118.110] Aba "Notificações PWA" — delegada ao módulo PWA
        if ( $active_tab === 'pwa' ) {
            if ( function_exists( 'rmbz_pwa_render_settings_tab' ) ) {
                rmbz_pwa_render_settings_tab();
            } else {
                echo '<p>Módulo PWA não está activo.</p>';
            }
            echo '</div>'; // fecha .wrap
            return;
        }

        // [1.6.345] Aba "Diagnóstico Push" — delegada ao módulo FCM.
        if ( $active_tab === 'push-diag' ) {
            if ( function_exists( 'rmbz_fcm_diag_render_body' ) ) {
                rmbz_fcm_diag_render_body();
            } else {
                echo '<p>Módulo de push (FCM) não está activo.</p>';
            }
            echo '</div>'; // fecha .wrap
            return;
        }

        // [1.6.347] Aba "Cleanup" — delegada ao módulo de limpeza de releases.
        if ( $active_tab === 'cleanup' ) {
            if ( function_exists( 'rmbz_release_cleanup_render_body' ) ) {
                rmbz_release_cleanup_render_body();
            } else {
                echo '<p>Módulo de cleanup não está activo.</p>';
            }
            echo '</div>'; // fecha .wrap
            return;
        }

        // [1.6.348] Aba "E-mails" — delegada ao gestor de e-mails.
        if ( $active_tab === 'emails' ) {
            if ( function_exists( 'rmbz_render_email_settings_body' ) ) {
                rmbz_render_email_settings_body();
            } else {
                echo '<p>Módulo de e-mails não está activo.</p>';
            }
            echo '</div>'; // fecha .wrap
            return;
        }

        // [1.5.406] Aba "S3" — armazenamento de ficheiros no bucket.
        if ( $active_tab === 's3' ) {
            if ( function_exists( 'rmbz_s3_render_settings_body' ) ) {
                rmbz_s3_render_settings_body();
            } else {
                echo '<p>Módulo S3 não está activo.</p>';
            }
            echo '</div>'; // fecha .wrap
            return;
        }

        // [1.6.348] Aba "Pré-Deploy" — delegada ao módulo de hardening.
        if ( $active_tab === 'predeploy' ) {
            if ( function_exists( 'rmbz_predeploy_render_body' ) ) {
                rmbz_predeploy_render_body();
            } else {
                echo '<p>Módulo de pré-deploy não está activo.</p>';
            }
            echo '</div>'; // fecha .wrap
            return;
        }
        ?>

        <?php if (isset($_GET['cleanup_done'])): ?>
            <div class="notice notice-success is-dismissible"><p>Limpeza concluída! <?php echo intval($_GET['cleanup_done']); ?> submissões rejeitadas foram apagadas.</p></div>
        <?php endif; ?>

        <form action="options.php" method="post">
            <?php
            settings_fields( 'rmbz_settings_group' );
            echo '<div id="rmbz-settings-sections">';
            do_settings_sections( 'rmbz-settings' );
            echo '</div>';
            echo '<div class="rmbz-save-bar">';
            submit_button( 'Guardar Alterações', 'primary', 'submit', false );
            echo '</div>';
            ?>
        </form>
        <?php rmbz_settings_modern_script(); ?>

        <hr style="margin: 40px 0;">

        <h2>Ferramentas de Manutenção</h2>
        <div class="card" style="padding: 20px; max-width: 600px;">
            <h3>Limpar Base de Dados</h3>
            <p>Se tiver muitas músicas "Rejeitadas" a ocupar espaço, pode apagá-las permanentemente aqui.</p>
            
            <?php
            global $wpdb;
            $table_subs = $wpdb->prefix . 'rmbz_artist_submissions';
            // Verifica se tabela existe antes de consultar
            if ( $wpdb->get_var("SHOW TABLES LIKE '$table_subs'") === $table_subs ) {
                $rejected_count = $wpdb->get_var("SELECT COUNT(id) FROM {$table_subs} WHERE review_status = 'rejeitado'");
            } else {
                $rejected_count = 0;
            }
            
            echo '<p><em>' . sprintf( 'Encontradas: %s submissões rejeitadas.', '<strong>' . (int)$rejected_count . '</strong>' ) . '</em></p>';
            ?>

            <form action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post" onsubmit="return confirm('Tem a certeza? Esta ação é irreversível.');">
                <input type="hidden" name="action" value="onemz_processar_limpeza_submissoes">
                <?php wp_nonce_field( 'onemz_cleanup_nonce', '_onemz_cleanup_nonce' ); ?>
                
                <?php submit_button( 'Eliminar Músicas Rejeitadas', 'delete', 'submit_cleanup', true, ( (int)$rejected_count > 0 ? '' : 'disabled' ) ); ?>
            </form>
        </div>
    </div>
    <?php
}


/**
 * Handler: Processar Limpeza de Submissões Rejeitadas.
 * (Incluído aqui para garantir funcionamento autônomo da página de settings)
 */
function onemz_processar_limpeza_submissoes() {
    if ( ! isset( $_POST['_onemz_cleanup_nonce'] ) || ! wp_verify_nonce( $_POST['_onemz_cleanup_nonce'], 'onemz_cleanup_nonce' ) ) {
        wp_die('Falha de segurança!');
    }
    if ( ! current_user_can('manage_options') ) {
        wp_die('Não tem permissão!');
    }

    global $wpdb;
    $table_subs = $wpdb->prefix . 'rmbz_artist_submissions';
    
    // Apagar onde status = rejeitado
    $deleted = $wpdb->delete( $table_subs, ['review_status' => 'rejeitado'], ['%s'] );
    
    // Redirecionar de volta
    wp_redirect( admin_url('admin.php?page=rmbz-settings&cleanup_done=' . (int)$deleted) );
    exit;
}
add_action('admin_post_onemz_processar_limpeza_submissoes', 'onemz_processar_limpeza_submissoes');