<?php
// includes/admin/admin-user-profile.php

if ( ! defined( 'ABSPATH' ) ) { 
    exit; // Acesso direto bloqueado por segurança
}

/**
 * [1.5.143] Identifica transações no Extrato relacionadas com 1 pedido
 * (depósito ou levantamento) e reverte o seu impacto no saldo, depois
 * apaga as transações.
 *
 * Como não há marker estável (tipo `[withdrawal:ID]`) nas transações
 * antigas, usamos heurística por (tipo + valor + janela temporal):
 *
 * - DEPÓSITO aprovado:
 *     procura 1× transaction_type='deposit' com amount = +req.amount
 *     na janela ±48h em torno de request_date.
 *
 * - LEVANTAMENTO (qualquer status):
 *     procura 1× transaction_type='withdrawal_request' com amount = -req.amount
 *     E (se rejeitado) 1× transaction_type='withdrawal_rejected' com amount = +req.amount
 *     ambas na janela ±48h.
 *
 * Reverte o efeito SOMANDO -amount ao saldo (ou seja, desfaz o crédito
 * ou desfaz o débito, consoante o sinal das transações encontradas).
 *
 * @param string $tel    Telemóvel do utilizador
 * @param string $kind   'deposit' ou 'withdrawal'
 * @param float  $amount Valor do pedido (sempre positivo)
 * @param string $req_dt request_date do pedido (mysql datetime)
 * @return array {removed_count, delta, new_balance}
 */
function rmbz_admin_revert_request_impact( $tel, $kind, $amount, $req_dt ) {
    global $wpdb;
    $table_wallets = $wpdb->prefix . 'rmbz_wallets';
    $table_tx      = $wpdb->prefix . 'rmbz_wallet_transactions';

    // Janela temporal de tolerância: 48h antes a 48h depois do request_date
    $window_start = date( 'Y-m-d H:i:s', strtotime($req_dt) - 48 * 3600 );
    $window_end   = date( 'Y-m-d H:i:s', strtotime($req_dt) + 48 * 3600 );

    // Definir o que procurar consoante o tipo
    $candidates = [];
    if ( $kind === 'deposit' ) {
        $candidates[] = [ 'type' => 'deposit', 'expected_amount' => +$amount ];
    } elseif ( $kind === 'withdrawal' ) {
        $candidates[] = [ 'type' => 'withdrawal_request',  'expected_amount' => -$amount ];
        $candidates[] = [ 'type' => 'withdrawal_rejected', 'expected_amount' => +$amount ];
    }

    $delta = 0.0;
    $removed_count = 0;

    foreach ( $candidates as $c ) {
        // Procura UMA transação que bata exactamente. Ordem por proximidade
        // ao request_date (não há campo timestamp_diff em mysql 5.7 antigo,
        // usamos ABS(TIMEDIFF) — mas mais simples: ordem por data mais próxima).
        $tx = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM $table_tx
             WHERE user_telemovel = %s
               AND transaction_type = %s
               AND amount = %f
               AND transaction_date BETWEEN %s AND %s
             ORDER BY transaction_date ASC
             LIMIT 1",
            $tel, $c['type'], $c['expected_amount'], $window_start, $window_end
        ) );
        if ( ! $tx ) continue;

        // Reverter: o saldo do utilizador tem nele o valor desta transação
        // somado. Para reverter, subtraímos o mesmo valor.
        $delta += -((float) $tx->amount);
        $wpdb->delete( $table_tx, [ 'transaction_id' => $tx->transaction_id ], [ '%d' ] );
        $removed_count++;
    }

    // Aplicar delta no saldo
    if ( abs($delta) > 0.001 ) {
        $current = (float) $wpdb->get_var( $wpdb->prepare(
            "SELECT balance FROM $table_wallets WHERE user_telemovel = %s",
            $tel
        ) );
        $new_balance = $current + $delta;
        $wpdb->update(
            $table_wallets,
            [ 'balance' => $new_balance ],
            [ 'user_telemovel' => $tel ],
            [ '%f' ], [ '%s' ]
        );
    } else {
        $new_balance = (float) $wpdb->get_var( $wpdb->prepare(
            "SELECT balance FROM $table_wallets WHERE user_telemovel = %s",
            $tel
        ) );
    }

    return [
        'removed_count' => $removed_count,
        'delta'         => $delta,
        'new_balance'   => $new_balance,
    ];
}

/**
 * ==========================================================================
 * 1. PROCESSADOR DE AÇÕES, PUNIÇÕES E AJUSTES DE CONTA DO ARTISTA
 * ==========================================================================
 */
function rmbz_admin_update_user_controls() {
    if ( ! current_user_can('manage_options') ) wp_die('Sem permissão.');
    if ( ! isset($_POST['_wpnonce']) || ! wp_verify_nonce($_POST['_wpnonce'], 'rmbz_user_controls_nonce') ) wp_die('Falha de segurança.');

    global $wpdb;
    $telemovel = sanitize_text_field($_POST['user_telemovel']);
    $action_type = sanitize_text_field($_POST['control_action']);
    $table_wallets = $wpdb->prefix . 'rmbz_wallets';

    $msg = '';

    // ---------------------------------------------------------
    // AÇÃO A: APLICAR PUNIÇÕES E BLOQUEIOS
    // ---------------------------------------------------------
    if ( $action_type === 'punishments' ) {
        $wallet = $wpdb->get_row($wpdb->prepare("SELECT is_banned, extra_data FROM {$table_wallets} WHERE user_telemovel = %s", $telemovel));
        $extra = (!empty($wallet) && !empty($wallet->extra_data)) ? json_decode($wallet->extra_data, true) : [];
        if ( ! is_array($extra) ) $extra = [];

        // [1.6.337] Cada limitação tem motivo INTERNO (obrigatório — sem ele NÃO
        // aplica) e motivo PARA O UTILIZADOR (mostrado na app/site). Tudo +
        // data de desbloqueio fica em extra['blocks_meta']; auditoria em
        // extra['blocks_log']. Migra do formato antigo (1.5.335).
        $meta  = function_exists('rmbz_blocks_meta') ? rmbz_blocks_meta($extra) : ( $extra['blocks_meta'] ?? [] );
        unset($extra['blocks_until'], $extra['ban_until'], $extra['ban_referral_until']);

        $admin_login = wp_get_current_user()->user_login ?: 'admin';
        $now_ts      = time(); // [1.6.340] Unix real — condiz com wp_date()/until.
        $blacklist   = (array) get_option('rmbz_referral_blacklist', []);
        $is_banned   = 0;
        $skipped     = [];
        $notices     = []; // [1.6.338] notificações a enviar DEPOIS de gravar

        // Estado anterior (para só notificar mudanças reais).
        $prev_banned    = (int) ( $wallet->is_banned ?? 0 );
        $prev_extra     = $extra;
        $prev_blacklist = $blacklist;

        $post_field = function( $f ) {
            return isset($_POST[$f]) ? trim( sanitize_textarea_field( wp_unslash($_POST[$f]) ) ) : '';
        };

        $all_keys = function_exists('rmbz_block_labels') ? array_keys( rmbz_block_labels() )
            : ['is_banned','block_withdrawals','block_deposits','block_distribution','block_video_applications','block_promotions','ban_referral'];

        foreach ( $all_keys as $k ) {
            $was_active = ( $k === 'is_banned' ) ? ( $prev_banned === 1 )
                : ( ( $k === 'ban_referral' ) ? in_array($telemovel, $prev_blacklist, true)
                : ! empty($prev_extra[$k]) );

            $want_on  = isset($_POST[$k]);
            $internal = $post_field($k . '_reason_internal');
            // Motivo interno em falta → usa o já existente (não obriga a reescrever).
            if ( $internal === '' && isset($meta[$k]['internal']) ) {
                $internal = (string) $meta[$k]['internal'];
            }

            if ( $want_on && $internal === '' ) {
                // [1.6.337] Sem motivo interno NÃO se aplica.
                $skipped[] = function_exists('rmbz_block_label') ? rmbz_block_label($k) : $k;
                $want_on = false;
            }

            if ( $want_on ) {
                $user_reason = $post_field($k . '_reason_user');
                $until = function_exists('rmbz_block_parse_until')
                    ? rmbz_block_parse_until( $_POST[$k.'_until'] ?? '' ) : 0;

                // Enforcement
                if ( $k === 'is_banned' ) {
                    $is_banned = 1;
                } elseif ( $k === 'ban_referral' ) {
                    if ( ! in_array($telemovel, $blacklist, true) ) $blacklist[] = $telemovel;
                } else {
                    $extra[$k] = 1;
                }

                $meta[$k] = [ 'until' => $until, 'internal' => $internal, 'user' => $user_reason, 'by' => $admin_login, 'at' => $now_ts ];
                if ( function_exists('rmbz_block_log_append') ) {
                    rmbz_block_log_append($extra, [ 'action' => 'apply', 'key' => $k, 'internal' => $internal, 'user' => $user_reason, 'until' => $until, 'by' => $admin_login ]);
                }
                // [1.6.338] Só notifica quando é uma limitação NOVA.
                if ( ! $was_active ) {
                    $notices[] = [ 'key' => $k, 'action' => 'apply', 'user' => $user_reason, 'until' => $until ];
                }
            } else {
                // Desligar enforcement
                if ( $k === 'is_banned' ) {
                    // $is_banned já é 0
                } elseif ( $k === 'ban_referral' ) {
                    $blacklist = array_values( array_filter($blacklist, function($v) use ($telemovel) { return $v !== $telemovel; }) );
                } else {
                    $extra[$k] = 0;
                }
                if ( isset($meta[$k]) ) {
                    if ( function_exists('rmbz_block_log_append') ) {
                        rmbz_block_log_append($extra, [ 'action' => 'lift', 'key' => $k, 'by' => $admin_login ]);
                    }
                    unset($meta[$k]);
                }
                // [1.6.338] Notifica o desbloqueio se estava mesmo ativo.
                if ( $was_active ) {
                    $notices[] = [ 'key' => $k, 'action' => 'lift' ];
                }
            }
        }

        $extra['blocks_meta'] = $meta;
        update_option( 'rmbz_referral_blacklist', $blacklist );
        $wpdb->update($table_wallets, [ 'is_banned' => $is_banned, 'extra_data' => wp_json_encode($extra) ], [ 'user_telemovel' => $telemovel ]);

        // [1.6.338] Notifica o artista (email + push + in-app dispensável).
        if ( function_exists('rmbz_blocks_notify') ) {
            foreach ( $notices as $n ) {
                rmbz_blocks_notify( $telemovel, $n['key'], $n['action'], $n['user'] ?? '', $n['until'] ?? 0 );
            }
        }

        $msg = "Punições e acessos atualizados com sucesso!";
        if ( ! empty($skipped) ) {
            $msg = "Atualizado. NÃO aplicado (falta o motivo interno): " . implode(', ', $skipped) . ".";
        }
    
    // ---------------------------------------------------------
    // AÇÃO B: AJUSTAR SALDO MANUALMENTE
    // ---------------------------------------------------------
    } elseif ( $action_type === 'adjust_balance' ) {
        $amount = (float) str_replace(',', '.', $_POST['adjust_amount']);
        $reason = sanitize_text_field($_POST['adjust_reason']);
        if ($amount != 0) {
            rmbz_update_wallet_balance($telemovel, $amount, 'admin_adjustment', null, "Ajuste Admin: " . $reason);
            $msg = "Saldo da carteira ajustado com sucesso!";
        } else {
            $msg = "Erro: O valor inserido não pode ser zero.";
        }
    
    // ---------------------------------------------------------
    // [1.6.310] REVOGAR LIMITES DIÁRIOS DE IA
    // ---------------------------------------------------------
    } elseif ( $action_type === 'reset_ai_limits' ) {
        if ( ! function_exists( 'rmbz_ai_reset_limits' ) ) {
            require_once dirname( __DIR__ ) . '/api/ai/ai-client.php';
        }
        $n = rmbz_ai_reset_limits( $telemovel );
        $msg = "Limites diários de IA revogados — o artista pode voltar a usar as ferramentas já.";

    // ---------------------------------------------------------
    // AÇÃO C: ANULAR UMA TRANSAÇÃO ESPECÍFICA DO EXTRATO
    // ---------------------------------------------------------
    } elseif ( $action_type === 'anular_transacao' ) {
        $trans_id = intval($_POST['transaction_id']);
        if ( $trans_id <= 0 ) {
            $msg = 'Erro: ID de transação inválido.';
        } else {
            // [1.6.118.16] Validações extra + função canónica para serializar
            // com outras escritas. Antes fazia UPDATE directo sem lock — race
            // condition se outro processo escrevesse na wallet ao mesmo tempo.
            // Também validamos que a transação pertence a ESTE telemovel
            // (segurança defensiva contra IDOR).
            $trans = $wpdb->get_row( $wpdb->prepare(
                "SELECT * FROM {$wpdb->prefix}rmbz_wallet_transactions
                 WHERE transaction_id = %d AND user_telemovel = %s",
                $trans_id, $telemovel
            ) );
            if ( ! $trans ) {
                $msg = 'Erro: Transação não encontrada ou não pertence a este artista.';
            } else {
                $amount_to_revert = -(float) $trans->amount;  // inverter sinal
                // Usar função canónica que tem GET_LOCK + validações
                if ( function_exists( 'rmbz_update_wallet_balance' ) ) {
                    $reverter = rmbz_update_wallet_balance(
                        $telemovel,
                        $amount_to_revert,
                        'admin_anula_transacao',  // tipo dedicado para auditoria
                        null,
                        sprintf( 'Admin anulou transação #%d (orig: %s)', $trans_id, $trans->type ?? 'desconhecido' )
                    );
                    if ( ! empty( $reverter['success'] ) ) {
                        // Só apaga a transação original DEPOIS do revert ter sucesso
                        $wpdb->delete(
                            $wpdb->prefix . 'rmbz_wallet_transactions',
                            [ 'transaction_id' => $trans_id, 'user_telemovel' => $telemovel ],
                            [ '%d', '%s' ]
                        );
                        $msg = 'Transação anulada com sucesso! O saldo foi revertido.';
                        error_log( sprintf(
                            '[1MZ admin_anula_transacao] Admin %s anulou trans #%d de %s (amount=%s)',
                            wp_get_current_user()->user_login ?? 'unknown',
                            $trans_id, $telemovel, $trans->amount
                        ) );
                    } else {
                        $msg = 'Erro ao anular: ' . ( $reverter['error'] ?? 'falha desconhecida' );
                    }
                } else {
                    // Fallback (caso função não esteja disponível)
                    $current_balance = (float) $wpdb->get_var( $wpdb->prepare(
                        "SELECT balance FROM {$table_wallets} WHERE user_telemovel = %s",
                        $telemovel
                    ) );
                    $novo_saldo = $current_balance + $amount_to_revert;
                    $wpdb->update( $table_wallets, [ 'balance' => $novo_saldo ], [ 'user_telemovel' => $telemovel ] );
                    $wpdb->delete(
                        $wpdb->prefix . 'rmbz_wallet_transactions',
                        [ 'transaction_id' => $trans_id, 'user_telemovel' => $telemovel ],
                        [ '%d', '%s' ]
                    );
                    $msg = 'Transação anulada com sucesso! O saldo foi revertido.';
                }
            }
        }

    // ---------------------------------------------------------
    // [1.5.141] AÇÃO C2: EXCLUIR UM PEDIDO DE LEVANTAMENTO ESPECÍFICO
    // Apaga o registo da tabela rmbz_withdrawal_requests. NÃO mexe no
    // saldo — quando o levantamento foi pedido, o saldo já foi debitado;
    // se foi aprovado, foi pago; se foi rejeitado, foi reembolsado via
    // wallet_transactions. Apagar o registo só remove o histórico.
    // ---------------------------------------------------------
    } elseif ( $action_type === 'excluir_levantamento' ) {
        $req_id = intval($_POST['request_id']);
        $deleted = $wpdb->delete(
            $wpdb->prefix . 'rmbz_withdrawal_requests',
            [ 'id' => $req_id, 'user_telemovel' => $telemovel ],
            [ '%d', '%s' ]
        );
        $msg = $deleted ? "Pedido de levantamento eliminado." : "Erro: pedido não encontrado.";

    // ---------------------------------------------------------
    // [1.5.141] AÇÃO C3: EXCLUIR UM PEDIDO DE DEPÓSITO ESPECÍFICO
    // Apaga o registo da tabela rmbz_deposit_requests. NÃO mexe no
    // saldo. Se o depósito foi aprovado, o crédito ao saldo já foi
    // registado em rmbz_wallet_transactions (gerido pelo Extrato).
    // Esta ação também tenta apagar o ficheiro do comprovativo (proof_image)
    // do disco para libertar espaço.
    // ---------------------------------------------------------
    } elseif ( $action_type === 'excluir_deposito' ) {
        $req_id = intval($_POST['request_id']);
        // Buscar proof_image antes de apagar — para remover o ficheiro
        $deposito = $wpdb->get_row($wpdb->prepare(
            "SELECT proof_image FROM {$wpdb->prefix}rmbz_deposit_requests WHERE id = %d AND user_telemovel = %s",
            $req_id, $telemovel
        ));
        if ( $deposito ) {
            // Apagar ficheiro do disco se existir
            if ( ! empty($deposito->proof_image) ) {
                $upload_dir = wp_upload_dir();
                $file_path = $upload_dir['basedir'] . '/' . ltrim( str_replace($upload_dir['baseurl'], '', $deposito->proof_image), '/' );
                if ( file_exists($file_path) && is_file($file_path) ) {
                    @unlink( $file_path );
                }
            }
            $wpdb->delete(
                $wpdb->prefix . 'rmbz_deposit_requests',
                [ 'id' => $req_id, 'user_telemovel' => $telemovel ],
                [ '%d', '%s' ]
            );
            $msg = "Pedido de depósito eliminado (e comprovativo apagado).";
        } else {
            $msg = "Erro: pedido não encontrado.";
        }

    // ---------------------------------------------------------
    // [1.5.141] AÇÃO C4: LIMPAR TODOS OS PEDIDOS DE LEVANTAMENTO
    // ---------------------------------------------------------
    } elseif ( $action_type === 'limpar_levantamentos' ) {
        $count = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_withdrawal_requests WHERE user_telemovel = %s",
            $telemovel
        ) );
        $wpdb->delete(
            $wpdb->prefix . 'rmbz_withdrawal_requests',
            [ 'user_telemovel' => $telemovel ],
            [ '%s' ]
        );
        $msg = sprintf( "%d pedido(s) de levantamento eliminados.", $count );

    // ---------------------------------------------------------
    // [1.5.141] AÇÃO C5: LIMPAR TODOS OS PEDIDOS DE DEPÓSITO
    // Também apaga ficheiros de comprovativo do disco.
    // ---------------------------------------------------------
    } elseif ( $action_type === 'limpar_depositos' ) {
        $depositos = $wpdb->get_results( $wpdb->prepare(
            "SELECT id, proof_image FROM {$wpdb->prefix}rmbz_deposit_requests WHERE user_telemovel = %s",
            $telemovel
        ) );
        $count = count( $depositos );
        $upload_dir = wp_upload_dir();
        foreach ( $depositos as $d ) {
            if ( ! empty($d->proof_image) ) {
                $file_path = $upload_dir['basedir'] . '/' . ltrim( str_replace($upload_dir['baseurl'], '', $d->proof_image), '/' );
                if ( file_exists($file_path) && is_file($file_path) ) {
                    @unlink( $file_path );
                }
            }
        }
        $wpdb->delete(
            $wpdb->prefix . 'rmbz_deposit_requests',
            [ 'user_telemovel' => $telemovel ],
            [ '%s' ]
        );
        $msg = sprintf( "%d pedido(s) de depósito eliminados (com comprovativos).", $count );

    // ---------------------------------------------------------
    // [1.5.142] AÇÃO C6: LIMPAR EXTRATO — só apagar registos
    // NÃO mexe no saldo. Útil para limpar histórico visual sem afectar
    // a contabilidade actual (admin assume que o saldo já está correcto).
    // ---------------------------------------------------------
    } elseif ( $action_type === 'limpar_extrato' ) {
        $count = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_wallet_transactions WHERE user_telemovel = %s",
            $telemovel
        ) );
        $wpdb->delete(
            $wpdb->prefix . 'rmbz_wallet_transactions',
            [ 'user_telemovel' => $telemovel ],
            [ '%s' ]
        );
        $msg = sprintf( "%d transação(ões) eliminadas do extrato. Saldo NÃO foi alterado.", $count );

    // ---------------------------------------------------------
    // [1.5.142] AÇÃO C7: ANULAR EXTRATO — apagar + reverter saldo
    // Soma todos os valores das transações e SUBTRAI do saldo actual,
    // depois apaga os registos. Equivale a "Anular" em massa.
    // CRÍTICO: pode levar a saldo negativo se houve mais créditos que
    // débitos. O frontend já avisa o admin antes de confirmar.
    // ---------------------------------------------------------
    } elseif ( $action_type === 'anular_extrato' ) {
        $sum_amount = (float) $wpdb->get_var( $wpdb->prepare(
            "SELECT COALESCE(SUM(amount), 0) FROM {$wpdb->prefix}rmbz_wallet_transactions WHERE user_telemovel = %s",
            $telemovel
        ) );
        $count = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_wallet_transactions WHERE user_telemovel = %s",
            $telemovel
        ) );
        $current_balance = (float) $wpdb->get_var( $wpdb->prepare(
            "SELECT balance FROM {$table_wallets} WHERE user_telemovel = %s",
            $telemovel
        ) );
        $novo_saldo = $current_balance - $sum_amount;
        $wpdb->update(
            $table_wallets,
            [ 'balance' => $novo_saldo ],
            [ 'user_telemovel' => $telemovel ],
            [ '%f' ], [ '%s' ]
        );
        $wpdb->delete(
            $wpdb->prefix . 'rmbz_wallet_transactions',
            [ 'user_telemovel' => $telemovel ],
            [ '%s' ]
        );
        $msg = sprintf(
            "%d transação(ões) anuladas. Saldo: %s MT → %s MT (revertido %s MT).",
            $count,
            number_format( $current_balance, 2, ',', '.' ),
            number_format( $novo_saldo, 2, ',', '.' ),
            number_format( $sum_amount, 2, ',', '.' )
        );

    // ---------------------------------------------------------
    // [1.5.143] AÇÃO C8: REVERTER UM PEDIDO DE LEVANTAMENTO
    //
    // Estratégia "opção B": apaga as transações relacionadas no Extrato
    // E ajusta o saldo de forma coerente, depois apaga o próprio pedido.
    //
    // Como identificamos as transações relacionadas? Não há marker estável
    // no campo `details` — usamos 3 sinais combinados:
    //   - tipo da transação: 'withdrawal_request' (e 'withdrawal_rejected' se foi rejeitado)
    //   - mesmo user_telemovel
    //   - valor exacto bate (signed)
    //   - janela temporal: ±48h em torno do request_date (tolerância segura)
    //
    // Para cada transação que apagamos, REVERTE-MOS o seu efeito no saldo:
    //   - se era -500 MT (debit do pedido), o utilizador FICOU sem 500 → devolvemos +500
    //   - se era +500 MT (reembolso por rejeição), o utilizador GANHOU 500 → tiramos -500
    // Líquido: saldo volta ao estado de antes do pedido existir.
    //
    // Casos cobertos:
    //   pendente  → 1 trans (-amount) → reverte +amount, apaga
    //   aprovado  → 1 trans (-amount) → reverte +amount, apaga
    //   rejeitado → 2 trans (-amount, +amount) → líquido 0, apaga ambas
    // ---------------------------------------------------------
    } elseif ( $action_type === 'reverter_levantamento' ) {
        $req_id = intval($_POST['request_id']);
        $req = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}rmbz_withdrawal_requests WHERE id = %d AND user_telemovel = %s",
            $req_id, $telemovel
        ) );
        if ( ! $req ) {
            $msg = "Erro: pedido de levantamento não encontrado.";
        } else {
            $impact = rmbz_admin_revert_request_impact( $telemovel, 'withdrawal', (float) $req->amount, $req->request_date );
            $wpdb->delete(
                $wpdb->prefix . 'rmbz_withdrawal_requests',
                [ 'id' => $req_id, 'user_telemovel' => $telemovel ],
                [ '%d', '%s' ]
            );
            $msg = sprintf(
                "Pedido de levantamento revertido: %d transação(ões) apagadas no Extrato, saldo ajustado em %s MT (saldo agora %s MT).",
                $impact['removed_count'],
                number_format( $impact['delta'], 2, ',', '.' ),
                number_format( $impact['new_balance'], 2, ',', '.' )
            );
        }

    // ---------------------------------------------------------
    // [1.5.143] AÇÃO C9: REVERTER UM PEDIDO DE DEPÓSITO
    // Apenas depósitos APROVADOS criaram transação no Extrato (+amount).
    // Pendente/rejeitado → 0 transações → saldo intacto.
    // ---------------------------------------------------------
    } elseif ( $action_type === 'reverter_deposito' ) {
        $req_id = intval($_POST['request_id']);
        $req = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}rmbz_deposit_requests WHERE id = %d AND user_telemovel = %s",
            $req_id, $telemovel
        ) );
        if ( ! $req ) {
            $msg = "Erro: pedido de depósito não encontrado.";
        } else {
            $impact = ( $req->status === 'aprovado' )
                ? rmbz_admin_revert_request_impact( $telemovel, 'deposit', (float) $req->amount, $req->request_date )
                : ['removed_count' => 0, 'delta' => 0.0, 'new_balance' => (float) $wpdb->get_var($wpdb->prepare("SELECT balance FROM {$table_wallets} WHERE user_telemovel = %s", $telemovel))];

            // Apagar ficheiro do disco
            if ( ! empty($req->proof_image) ) {
                $upload_dir = wp_upload_dir();
                $file_path = $upload_dir['basedir'] . '/' . ltrim( str_replace($upload_dir['baseurl'], '', $req->proof_image), '/' );
                if ( file_exists($file_path) && is_file($file_path) ) {
                    @unlink( $file_path );
                }
            }
            $wpdb->delete(
                $wpdb->prefix . 'rmbz_deposit_requests',
                [ 'id' => $req_id, 'user_telemovel' => $telemovel ],
                [ '%d', '%s' ]
            );
            $msg = sprintf(
                "Pedido de depósito revertido: %d transação(ões) apagadas no Extrato, saldo ajustado em %s MT (saldo agora %s MT).",
                $impact['removed_count'],
                number_format( $impact['delta'], 2, ',', '.' ),
                number_format( $impact['new_balance'], 2, ',', '.' )
            );
        }

    // ---------------------------------------------------------
    // [1.5.143] AÇÃO C10: REVERTER TODOS OS LEVANTAMENTOS
    // Itera os pedidos um a um (não simplifica via SUM porque cada pedido
    // pode ter combinações diferentes de transações — pendente/aprovado vs
    // rejeitado). Devolve totais agregados na mensagem.
    // ---------------------------------------------------------
    } elseif ( $action_type === 'reverter_todos_levantamentos' ) {
        $reqs = $wpdb->get_results( $wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}rmbz_withdrawal_requests WHERE user_telemovel = %s",
            $telemovel
        ) );
        $total_count = 0;
        $total_removed = 0;
        $total_delta = 0.0;
        foreach ( $reqs as $r ) {
            $imp = rmbz_admin_revert_request_impact( $telemovel, 'withdrawal', (float) $r->amount, $r->request_date );
            $total_removed += $imp['removed_count'];
            $total_delta   += $imp['delta'];
            $total_count++;
        }
        $wpdb->delete(
            $wpdb->prefix . 'rmbz_withdrawal_requests',
            [ 'user_telemovel' => $telemovel ],
            [ '%s' ]
        );
        $final_balance = (float) $wpdb->get_var( $wpdb->prepare(
            "SELECT balance FROM {$table_wallets} WHERE user_telemovel = %s",
            $telemovel
        ) );
        $msg = sprintf(
            "%d levantamento(s) revertidos. %d transações apagadas no Extrato. Saldo ajustado em %s MT (saldo agora %s MT).",
            $total_count, $total_removed,
            number_format( $total_delta, 2, ',', '.' ),
            number_format( $final_balance, 2, ',', '.' )
        );

    // ---------------------------------------------------------
    // [1.5.143] AÇÃO C11: REVERTER TODOS OS DEPÓSITOS
    // ---------------------------------------------------------
    } elseif ( $action_type === 'reverter_todos_depositos' ) {
        $reqs = $wpdb->get_results( $wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}rmbz_deposit_requests WHERE user_telemovel = %s",
            $telemovel
        ) );
        $upload_dir = wp_upload_dir();
        $total_count = 0;
        $total_removed = 0;
        $total_delta = 0.0;
        foreach ( $reqs as $r ) {
            // Só aprovados afectaram o saldo
            if ( $r->status === 'aprovado' ) {
                $imp = rmbz_admin_revert_request_impact( $telemovel, 'deposit', (float) $r->amount, $r->request_date );
                $total_removed += $imp['removed_count'];
                $total_delta   += $imp['delta'];
            }
            // Apagar comprovativo
            if ( ! empty($r->proof_image) ) {
                $file_path = $upload_dir['basedir'] . '/' . ltrim( str_replace($upload_dir['baseurl'], '', $r->proof_image), '/' );
                if ( file_exists($file_path) && is_file($file_path) ) {
                    @unlink( $file_path );
                }
            }
            $total_count++;
        }
        $wpdb->delete(
            $wpdb->prefix . 'rmbz_deposit_requests',
            [ 'user_telemovel' => $telemovel ],
            [ '%s' ]
        );
        $final_balance = (float) $wpdb->get_var( $wpdb->prepare(
            "SELECT balance FROM {$table_wallets} WHERE user_telemovel = %s",
            $telemovel
        ) );
        $msg = sprintf(
            "%d depósito(s) revertidos. %d transações apagadas no Extrato. Saldo ajustado em %s MT (saldo agora %s MT).",
            $total_count, $total_removed,
            number_format( $total_delta, 2, ',', '.' ),
            number_format( $final_balance, 2, ',', '.' )
        );

    // ---------------------------------------------------------
    // AÇÃO D: CANCELAR A SUBSCRIÇÃO VIP
    // ---------------------------------------------------------
    } elseif ( $action_type === 'cancel_vip' ) {
        $table_subs = $wpdb->prefix . 'rmbz_subscriptions';
        $wpdb->query($wpdb->prepare("UPDATE {$table_subs} SET end_date = %s, status = 'cancelled' WHERE user_telemovel = %s AND status = 'active'", current_time('mysql'), $telemovel));
        $msg = "O Acesso VIP deste artista foi cancelado!";

    // ---------------------------------------------------------
    // AÇÃO E: REDEFINIR O PIN DO ARTISTA
    // ---------------------------------------------------------
    } elseif ( $action_type === 'reset_pin' ) {
        $novo_pin = sanitize_text_field($_POST['new_pin']);
        if (strlen($novo_pin) == 4 && is_numeric($novo_pin)) {
            // [1.6.118.12] PIN agora é hashed antes de guardar.
            $hashed_pin = wp_hash_password( $novo_pin );
            $wpdb->update($table_wallets, ['user_pin' => $hashed_pin], ['user_telemovel' => $telemovel]);

            // Audit log
            error_log( sprintf(
                '[1MZ admin_reset_pin] Admin %s redefiniu PIN para %s (hash gravado correctamente).',
                wp_get_current_user()->user_login ?? 'unknown',
                $telemovel
            ) );

            // [1.6.118.16] **SEGURANÇA**: NÃO incluir PIN na URL redirect.
            // O PIN era passado em ?msg=...PIN%20redefinido%20para:%201234,
            // ficando no histórico do browser e em logs (access.log, referrer
            // headers). Agora: guarda em transient curto (60s) por admin+user
            // e a próxima página lê e mostra inline, sem URL.
            $pin_token_key = 'rmbz_pin_show_' . get_current_user_id() . '_' . md5( $telemovel );
            set_transient( $pin_token_key, $novo_pin, 60 ); // 60s para anotar
            $msg = '__SHOW_PIN__'; // sentinela — UI faz lookup no transient
        } else {
            $msg = "Erro: O PIN tem de ser composto por exatamente 4 números.";
        }

    // ---------------------------------------------------------
    // AÇÃO F: ENVIAR MENSAGEM POP-UP DIRETA
    // ---------------------------------------------------------
    } elseif ( $action_type === 'send_popup' ) {
        $p_title = sanitize_text_field($_POST['popup_title']);
        $p_message = sanitize_textarea_field($_POST['popup_message']);
        $p_type = sanitize_text_field($_POST['popup_type']);
        
        $wallet = $wpdb->get_row($wpdb->prepare("SELECT extra_data FROM {$table_wallets} WHERE user_telemovel = %s", $telemovel));
        $extra = !empty($wallet->extra_data) ? json_decode($wallet->extra_data, true) : [];
        
        $extra['admin_popup'] = [
            'title'   => $p_title,
            'message' => $p_message,
            'type'    => $p_type
        ];
        
        $wpdb->update($table_wallets, ['extra_data' => wp_json_encode($extra)], ['user_telemovel' => $telemovel]);
        $msg = "Mensagem Pop-up programada! O artista verá este aviso na próxima vez que abrir a conta.";

    // ---------------------------------------------------------
    // [1.6.118.16] AÇÃO F2: REMOVER POPUP PENDENTE (sem substituir)
    // ---------------------------------------------------------
    } elseif ( $action_type === 'clear_popup' ) {
        $wallet = $wpdb->get_row($wpdb->prepare("SELECT extra_data FROM {$table_wallets} WHERE user_telemovel = %s", $telemovel));
        $extra = !empty($wallet->extra_data) ? json_decode($wallet->extra_data, true) : [];
        if ( ! is_array($extra) ) $extra = [];
        if ( isset( $extra['admin_popup'] ) ) {
            unset( $extra['admin_popup'] );
            $wpdb->update($table_wallets, ['extra_data' => wp_json_encode($extra)], ['user_telemovel' => $telemovel]);
            $msg = "Popup pendente removido.";
        } else {
            $msg = "Não havia popup pendente.";
        }
    
    // ---------------------------------------------------------
    // AÇÃO G: PEDIR CÓDIGO DE SEGURANÇA PARA APAGAR CONTA (LIXEIRA)
    // ---------------------------------------------------------
    } elseif ( $action_type === 'request_delete' ) {
        // [1.6.118.16] random_int (CSPRNG) em vez de rand() — código de
        // segurança que vai ao email do admin não deve ser previsível.
        try {
            $code = random_int( 100000, 999999 );
        } catch ( Exception $e ) {
            $code = mt_rand( 100000, 999999 );  // fallback se random_bytes não disponível
        }
        set_transient('rmbz_del_code_' . $telemovel, $code, 15 * 60);

        $admin_email = get_option('admin_email');
        $subject = '[Admin] Aviso de Segurança 1MZ - Apagar Artista';
        // [1.6.118.16] Email em light theme (antes usava cores dark inline:
        // background #1a1a1a, color #fff, etc — ilegível em clientes de
        // email modernos com tema claro).
        $body = "<div style='font-family: Arial, sans-serif; padding: 24px; background: #ffffff; color: #1d2327; border: 1px solid #e1e4e8; border-radius: 10px; max-width: 480px; margin: 0 auto;'>"
              . "<h2 style='color: #b91c1c; text-align: center; margin: 0 0 18px;'>⚠️ Ação Crítica de Segurança</h2>"
              . "<p style='font-size: 14px; line-height: 1.5; color: #3c434a; margin: 0 0 18px;'>Foi pedido para apagar a conta do artista: <strong style='color:#1d2327;'>" . esc_html( $telemovel ) . "</strong>.</p>"
              . "<div style='text-align: center; margin: 28px 0;'>"
              . "<div style='font-size: 11px; color: #5f6368; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px;'>Código de Segurança</div>"
              . "<div style='font-size: 32px; font-weight: bold; color: #1d2327; background: #fff3cd; padding: 16px 32px; border-radius: 10px; letter-spacing: 8px; border: 2px solid #f0b90b; display: inline-block;'>{$code}</div>"
              . "</div>"
              . "<p style='font-size: 12px; color: #5f6368; line-height: 1.5; margin: 0;'>Válido 15 minutos. Se não pediste esta ação, ignora este email — o código sozinho não apaga nada.</p>"
              . "</div>";
        
        // ====================================================================
        // NOVA LÓGICA DE E-MAIL (A mesma dos depósitos e OTP)
        // ====================================================================
        if (function_exists('rmbz_build_html_email')) {
            $tpl = get_option('rmbz_email_templates');
            $sender_name = !empty($tpl['sender_name']) ? $tpl['sender_name'] : get_bloginfo('name');
            $sender_email = is_email($tpl['sender_email'] ?? '') ? $tpl['sender_email'] : get_option('admin_email');
            
            $html_body = rmbz_build_html_email($body, $sender_name);
            $headers = ['Content-Type: text/html; charset=UTF-8', 'From: ' . $sender_name . ' <' . $sender_email . '>'];
            wp_mail($admin_email, $subject, $html_body, $headers);
        } else {
            $headers = ['Content-Type: text/html; charset=UTF-8'];
            wp_mail($admin_email, $subject, $body, $headers);
        }

        // [1.5.400] Sino guarda só o conteúdo, nunca o email completo com tema.
        // [1.5.414] audience='admin' — alerta do sistema, nunca no sino do artista.
        $wpdb->insert($wpdb->prefix . 'rmbz_email_logs', ['recipient_email' => $admin_email, 'subject' => $subject, 'body' => $body, 'sent_date' => current_time('mysql', 1), 'is_read' => 0, 'is_cleared' => 0, 'audience' => 'admin'], ['%s', '%s', '%s', '%s', '%d', '%d', '%s']);
        
        wp_redirect( admin_url("admin.php?page=rmbz-historico-utilizador&user_id=" . urlencode($telemovel) . "&verify_del=1") ); exit;

    // ---------------------------------------------------------
    // AÇÃO H: CONFIRMAR CÓDIGO E MOVER PARA A LIXEIRA
    // ---------------------------------------------------------
    } elseif ( $action_type === 'confirm_delete' ) {
        $input_code = sanitize_text_field($_POST['security_code']);
        $saved_code = get_transient('rmbz_del_code_' . $telemovel);
        // [1.6.118.16] Comparação timing-safe + UTC + audit log
        if ( $saved_code && hash_equals( (string) $saved_code, (string) $input_code ) ) {
            $wallet = $wpdb->get_row($wpdb->prepare("SELECT extra_data FROM {$table_wallets} WHERE user_telemovel = %s", $telemovel));
            $extra = !empty($wallet->extra_data) ? json_decode($wallet->extra_data, true) : [];
            if ( ! is_array($extra) ) $extra = [];
            $extra['deleted_at'] = current_time('mysql', 1);  // UTC, consistente com resto do código
            $extra['deleted_by'] = wp_get_current_user()->user_login ?? 'admin_unknown';
            $wpdb->update($table_wallets, ['extra_data' => wp_json_encode($extra), 'is_banned' => 1], ['user_telemovel' => $telemovel]);
            delete_transient('rmbz_del_code_' . $telemovel);
            error_log( sprintf(
                '[1MZ admin_confirm_delete] Admin %s moveu conta %s para lixeira (30 dias até hard delete).',
                wp_get_current_user()->user_login ?? 'unknown',
                $telemovel
            ) );
            wp_redirect( admin_url("admin.php?page=rmbz-utilizadores&status=trash&msg=" . urlencode('Artista movido para o Lixo com sucesso! Ele será eliminado da base de dados permanentemente dentro de 30 dias.')) ); exit;
        } else {
            wp_redirect( admin_url("admin.php?page=rmbz-historico-utilizador&user_id=" . urlencode($telemovel) . "&verify_del=1&msg=" . urlencode('Erro de Segurança: O código inserido é inválido ou já expirou.')) ); exit;
        }
    }

    // ---------------------------------------------------------
    // [1.5.455] TERMINAR SESSÕES ATIVAS (site + app)
    // ---------------------------------------------------------
    if ( $action_type === 'terminate_sessions' ) {
        // 1) SITE: novo session_epoch na wallet — qualquer sessão de browser
        //    aberta antes deste momento morre na próxima verificação
        //    (rmbz_is_user_logged_in compara o epoch da sessão com o da conta).
        $wallet = $wpdb->get_row( $wpdb->prepare( "SELECT extra_data FROM {$table_wallets} WHERE user_telemovel = %s", $telemovel ) );
        $extra = ( ! empty( $wallet ) && ! empty( $wallet->extra_data ) ) ? json_decode( $wallet->extra_data, true ) : [];
        if ( ! is_array( $extra ) ) $extra = [];
        $extra['session_epoch'] = time();
        $wpdb->update( $table_wallets, [ 'extra_data' => wp_json_encode( $extra ) ], [ 'user_telemovel' => $telemovel ], [ '%s' ], [ '%s' ] );

        // 2) APP: revoga todos os refresh tokens ativos (mesmo padrão do
        //    app-version-control) e corta os JWT já emitidos via cutoff.
        $t_tok = $wpdb->prefix . 'rmbz_api_refresh_tokens';
        $revoked = 0;
        if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_tok'" ) === $t_tok ) {
            $revoked = (int) $wpdb->query( $wpdb->prepare(
                "UPDATE $t_tok SET revoked_at = %s, revoke_reason = 'admin_revoke'
                 WHERE user_telemovel = %s AND (revoked_at IS NULL OR revoked_at = '')",
                current_time( 'mysql', 1 ), $telemovel
            ) );
        }
        if ( function_exists( 'rmbz_app_token_mark_revoked' ) ) rmbz_app_token_mark_revoked( $telemovel, 'admin' );

        // 3) PUSH: desativa os tokens FCM — a app volta a registá-los no
        //    próximo login (sem sessão não deve receber notificações).
        $t_push = $wpdb->prefix . 'rmbz_app_push_tokens';
        if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_push'" ) === $t_push ) {
            $wpdb->query( $wpdb->prepare( "UPDATE $t_push SET is_active = 0 WHERE telemovel = %s", $telemovel ) );
        }

        $msg = sprintf( 'Sessões terminadas: sessão do site invalidada e %d sessão(ões) da app revogada(s). O artista terá de iniciar sessão de novo em todos os dispositivos.', $revoked );
    }

    wp_redirect( admin_url("admin.php?page=rmbz-historico-utilizador&user_id=" . urlencode($telemovel) . "&msg=" . urlencode($msg)) ); exit;
}
add_action('admin_post_rmbz_admin_update_user_controls', 'rmbz_admin_update_user_controls');

/**
 * ==========================================================================
 * 2. INTERFACE VISUAL: RAIO-X TOTAL DO ARTISTA (ADMIN DASHBOARD)
 * ==========================================================================
 */
function rmbz_mostrar_pagina_historico_utilizador() {
    if ( ! current_user_can('manage_options') ) wp_die('Sem permissão para ver esta página.');
    if ( empty($_GET['user_id']) ) { echo '<div class="wrap"><h2>Erro do Sistema</h2><p>Nenhum utilizador selecionado.</p></div>'; return; }

    global $wpdb;
    $telemovel = sanitize_text_field($_GET['user_id']);
    
    $user = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s", $telemovel) );
    if ( ! $user ) { echo '<div class="wrap"><h2>Erro</h2><p>O artista com este número não foi encontrado.</p></div>'; return; }

    // [1.6.336] Limpa bloqueios/banimentos temporários já expirados antes de
    // mostrar o estado, e recarrega para refletir o resultado.
    if ( function_exists('rmbz_apply_block_expiries') ) {
        rmbz_apply_block_expiries( $telemovel );
        $user = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s", $telemovel) );
    }

    $extra = !empty($user->extra_data) ? json_decode($user->extra_data, true) : [];

    if (isset($extra['deleted_at'])) {
        echo '<div class="wrap" style="margin-top:40px;"><div style="background:#ef4444; color:#fff; padding:30px; border-radius:12px; text-align:center; max-width:600px; margin:0 auto; box-shadow:0 10px 30px rgba(231,76,60,0.3);"><div style="font-size:60px; margin-bottom:15px;">🗑️</div><h2 style="color:var(--rmbz-text-primary, #fff); margin-top:0;">CONTA NA LIXEIRA</h2><p style="font-size:16px;">Este utilizador foi apagado e encontra-se a aguardar eliminação permanente.</p><a href="' . admin_url('admin.php?page=rmbz-utilizadores&status=trash') . '" style="display:inline-block; margin-top:15px; background:var(--rmbz-bg-card, #fff); color:var(--rmbz-danger, #ef4444); padding:10px 20px; border-radius:6px; text-decoration:none; font-weight:bold;">Ir para a Lixeira</a></div></div>'; return;
    }

    $is_banned = $user->is_banned;
    $block_dep = !empty($extra['block_deposits']) ? true : false;
    $block_wit = !empty($extra['block_withdrawals']) ? true : false;
    $block_dist = !empty($extra['block_distribution']) ? true : false;
    $block_vid = !empty($extra['block_video_applications']) ? true : false;
    $block_promo = !empty($extra['block_promotions']) ? true : false;
    $has_popup = isset($extra['admin_popup']);

    // [1.6.337] Meta por bloqueio: data de desbloqueio + motivo interno + motivo
    // do utilizador. Vazio = permanente.
    $blocks_meta = function_exists('rmbz_blocks_meta') ? rmbz_blocks_meta($extra) : ( $extra['blocks_meta'] ?? [] );
    $blocks_log  = ( isset($extra['blocks_log']) && is_array($extra['blocks_log']) ) ? $extra['blocks_log'] : [];

    // [1.5.133] Estado da toggle "Banir de Convites" — calculado a partir
    // da rmbz_referral_blacklist global (setting de admin).
    $referral_blacklist = (array) get_option('rmbz_referral_blacklist', []);
    $ban_referral = in_array($telemovel, $referral_blacklist, true);

    // CALCULAR ONLINE / OFFLINE COM TEMPO E DATA
    $last_seen = isset($extra['last_seen']) ? intval($extra['last_seen']) : 0;
    $is_online = ($last_seen > 0 && (time() - $last_seen) < 300); // 5 minutos de tolerância
    if ($is_online) {
        $online_text = '<span style="background:rgba(46, 204, 113, 0.1); color:var(--rmbz-success, #10b981); padding:4px 10px; border-radius:20px; font-size:11px; font-weight:bold; border:1px solid #2ecc71; margin-right:5px;">🟢 ONLINE AGORA</span>';
    } else {
        if ($last_seen > 0) {
            $data_hora = wp_date('d/m/Y \à\s H:i', $last_seen);
            $texto_visto = 'Visto pela última vez: ' . $data_hora;
        } else {
            $texto_visto = 'Nunca esteve online';
        }
        $online_text = '<span style="background:rgba(255, 255, 255, 0.05); color:var(--rmbz-text-muted, #aaa); padding:4px 10px; border-radius:20px; font-size:11px; border:1px solid #444; margin-right:5px;" title="Offline">⚪ ' . $texto_visto . '</span>';
    }

    $is_vip = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}rmbz_subscriptions WHERE user_telemovel = %s AND status = 'active' AND end_date > NOW()", $telemovel));
    $envios_site = $wpdb->get_var($wpdb->prepare("SELECT COUNT(id) FROM {$wpdb->prefix}rmbz_artist_submissions WHERE artist_telemovel = %s AND scenario_type = 'Publicação Site'", $telemovel));
    $envios_soc  = $wpdb->get_var($wpdb->prepare("SELECT COUNT(id) FROM {$wpdb->prefix}rmbz_artist_submissions WHERE artist_telemovel = %s AND scenario_type = 'Redes Sociais'", $telemovel));
    $projetos    = $wpdb->get_var($wpdb->prepare("SELECT COUNT(id) FROM {$wpdb->prefix}rmbz_artist_projects WHERE artist_telemovel = %s", $telemovel));

    // [1.6.118.16] Dados adicionais úteis para o admin
    // - Data de registo: primeira entrada da wallet (não há campo dedicado,
    //   mas a primeira transação ou primeiro deposit serve como proxy)
    $t_deps = $wpdb->prefix . 'rmbz_deposit_requests';
    $t_devs = $wpdb->prefix . 'rmbz_app_devices';
    $t_tokens = $wpdb->prefix . 'rmbz_api_refresh_tokens';

    // Data conta criada: primeiro deposit OU primeira transação (o mais antigo)
    $primeiro_dep = $wpdb->get_var( $wpdb->prepare(
        "SELECT MIN(request_date) FROM $t_deps WHERE user_telemovel = %s", $telemovel
    ) );
    $primeira_tx = $wpdb->get_var( $wpdb->prepare(
        "SELECT MIN(transaction_date) FROM {$wpdb->prefix}rmbz_wallet_transactions WHERE user_telemovel = %s", $telemovel
    ) );
    $created_dates = array_filter( [ $primeiro_dep, $primeira_tx ] );
    $created_at = ! empty( $created_dates ) ? min( $created_dates ) : null;

    // Origem da conta (primeira deposit com is_first_deposit=1)
    $source_platform = null;
    if ( $wpdb->get_var( "SHOW COLUMNS FROM $t_deps LIKE 'source_platform'" ) ) {
        $source_platform = $wpdb->get_var( $wpdb->prepare(
            "SELECT source_platform FROM $t_deps
             WHERE user_telemovel = %s AND is_first_deposit = 1
             ORDER BY request_date ASC LIMIT 1",
            $telemovel
        ) );
    }

    // Devices registados (app)
    $devices_count = 0;
    $last_app_version = null;
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_devs'" ) === $t_devs ) {
        $devices_count = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM $t_devs WHERE user_telemovel = %s", $telemovel
        ) );
        $last_app_version = $wpdb->get_var( $wpdb->prepare(
            "SELECT last_app_version FROM $t_devs
             WHERE user_telemovel = %s AND last_app_version IS NOT NULL
             ORDER BY last_seen_at DESC LIMIT 1",
            $telemovel
        ) );
    }

    // Sessões activas (refresh tokens não revogados)
    $active_sessions = 0;
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_tokens'" ) === $t_tokens ) {
        $active_sessions = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM $t_tokens
             WHERE user_telemovel = %s
               AND (revoked_at IS NULL OR revoked_at = '')
               AND expires_at > NOW()",
            $telemovel
        ) );
    }

    // Total gasto na plataforma (soma de depósitos aprovados)
    $total_depositado = (float) $wpdb->get_var( $wpdb->prepare(
        "SELECT COALESCE(SUM(amount),0) FROM $t_deps
         WHERE user_telemovel = %s AND status = 'aprovado'",
        $telemovel
    ) );

    // Total levantado
    $total_levantado = (float) $wpdb->get_var( $wpdb->prepare(
        "SELECT COALESCE(SUM(amount),0) FROM {$wpdb->prefix}rmbz_withdrawal_requests
         WHERE user_telemovel = %s AND status = 'aprovado'",
        $telemovel
    ) );

    // Limites aumentados para melhor visibilidade (admin vê histórico completo)
    $ultimos_envios = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}rmbz_artist_submissions WHERE artist_telemovel = %s ORDER BY submission_date DESC LIMIT 50", $telemovel));
    $transacoes_carteira = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}rmbz_wallet_transactions WHERE user_telemovel = %s ORDER BY transaction_date DESC LIMIT 100", $telemovel));
    $pedidos_levantamento = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}rmbz_withdrawal_requests WHERE user_telemovel = %s ORDER BY request_date DESC LIMIT 100", $telemovel));
    $pedidos_deposito     = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$t_deps} WHERE user_telemovel = %s ORDER BY request_date DESC LIMIT 100", $telemovel));

    // Totais para mostrar no header de cada tabela
    $total_envios_all   = (int) $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_artist_submissions WHERE artist_telemovel = %s", $telemovel) );
    $total_tx_all       = (int) $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_wallet_transactions WHERE user_telemovel = %s", $telemovel) );
    $total_lev_all      = (int) $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_withdrawal_requests WHERE user_telemovel = %s", $telemovel) );
    $total_dep_all      = (int) $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM {$t_deps} WHERE user_telemovel = %s", $telemovel) );
    ?>

    <style>
        /* [1.6.118.15] Página Perfil do Artista — refactor light theme
         * consistente com Gestão de Artistas (Carteiras).
         * Apenas mudança visual — handlers e form names mantidos.
         */
        .rmbz-profile-wrap { max-width: none; margin: 16px 20px 32px 0; font-family: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color: #1a1a1f; line-height: 1.5; }
        .rmbz-profile-wrap * { box-sizing: border-box; }
        .rmbz-profile-wrap a { color: inherit; }

        /* Voltar */
        .rp-back { display: inline-flex; align-items: center; gap: 6px; color: #5f6368; text-decoration: none; font-weight: 600; font-size: 13px; margin-bottom: 16px; padding: 6px 12px; border-radius: 6px; transition: 0.15s; }
        .rp-back:hover { background: #f1f3f5; color: #1d2327; }

        /* Notice/Error msg */
        .rp-msg { padding: 14px 18px; margin-bottom: 20px; border-radius: 8px; font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 10px; }
        .rp-msg.success { background: #d1fae5; border-left: 4px solid #10b981; color: #065f46; }
        .rp-msg.error   { background: #fee2e2; border-left: 4px solid #ef4444; color: #991b1b; }

        /* Header: avatar + nome + telemovel + estado */
        .rp-header { background: #fff; border: 1px solid #e1e4e8; border-radius: 14px; padding: 24px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.04); display: flex; gap: 20px; align-items: center; flex-wrap: wrap; }
        .rp-avatar { width: 72px; height: 72px; background: linear-gradient(135deg, #1a1a1f 0%, #2c2c34 100%); color: #f0b90b; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 800; font-size: 28px; flex-shrink: 0; box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
        .rp-header-info { flex: 1; min-width: 200px; }
        .rp-header-info h1 { font-size: 24px; font-weight: 800; margin: 0 0 6px 0; color: #1d2327; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; letter-spacing: -0.01em; }
        .rp-meta { color: #5f6368; font-size: 13px; display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
        .rp-meta .meta-item { display: inline-flex; align-items: center; gap: 4px; }

        /* Badges */
        .rp-badge { display: inline-block; padding: 3px 10px; border-radius: 12px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.3px; }
        .rp-badge-vip      { background: linear-gradient(135deg, #fff3cd 0%, #ffe5a0 100%); color: #856404; border: 1px solid #f0b90b; }
        .rp-badge-online   { background: #d1fae5; color: #065f46; }
        .rp-badge-offline  { background: #f1f3f5; color: #5f6368; }
        .rp-badge-banned   { background: #fee2e2; color: #991b1b; }
        .rp-badge-warn     { background: #fef3c7; color: #92400e; }
        .rp-badge-block    { background: #fde2e7; color: #9d174d; }
        .rp-badge-info     { background: #dbeafe; color: #1e40af; }
        .rp-badge-purple   { background: #ede9fe; color: #5b21b6; }
        .rp-badge-success  { background: #d1fae5; color: #065f46; }

        .rp-flags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }

        /* Stats row no topo */
        .rp-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; margin-bottom: 24px; }

        /* Info grid (dados detalhados pequenos) */
        .rp-info-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 10px; margin-bottom: 16px; }
        .rp-info-card { background: #f7f7fb; border: 1px solid #ebecf0; border-radius: 10px; padding: 12px 14px; }
        .rp-info-label { font-size: 10px; font-weight: 700; text-transform: uppercase; color: #5f6368; letter-spacing: 0.4px; margin-bottom: 4px; }
        .rp-info-value { font-size: 14px; font-weight: 700; color: #1d2327; line-height: 1.2; }
        .rp-stat { background: #fff; border: 1px solid #e1e4e8; border-radius: 12px; padding: 18px 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.04); }
        .rp-stat .label { font-size: 11px; font-weight: 700; text-transform: uppercase; color: #5f6368; letter-spacing: 0.5px; margin-bottom: 6px; }
        .rp-stat .value { font-size: 26px; font-weight: 800; color: #1d2327; line-height: 1.1; }
        .rp-stat .value .unit { font-size: 13px; font-weight: 500; color: #5f6368; margin-left: 4px; }
        .rp-stat.balance .value { color: #047857; }
        .rp-stat.gold    .value { color: #d4a000; }
        .rp-stat.info    .value { color: #1e40af; }
        .rp-stat.purple  .value { color: #6d28d9; }

        /* Grid layout main */
        .rp-grid { display: grid; grid-template-columns: 2fr 1fr; gap: 20px; }
        @media (max-width: 1100px) { .rp-grid { grid-template-columns: 1fr; } }

        /* Painel base */
        .rp-panel { background: #fff; border: 1px solid #e1e4e8; border-radius: 14px; padding: 20px 22px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.04); overflow: hidden; }
        .rp-panel.accent-gold   { border-left: 4px solid #f0b90b; }
        .rp-panel.accent-info   { border-left: 4px solid #3b82f6; }
        .rp-panel.accent-danger { border-left: 4px solid #ef4444; background: #fffafa; }
        .rp-panel h3 { color: #1d2327; margin: 0 0 16px 0; font-size: 15px; font-weight: 700; padding-bottom: 12px; border-bottom: 1px solid #f0f0f1; text-transform: uppercase; letter-spacing: 0.3px; display: flex; align-items: center; gap: 8px; }
        .rp-panel h3 .icon { font-size: 18px; }
        .rp-panel .empty { color: #5f6368; font-style: italic; font-size: 13px; padding: 16px 0; text-align: center; }

        /* Tabelas */
        .rp-table { width: 100%; border-collapse: collapse; font-size: 13px; }
        .rp-table th { background: #f7f7fb; color: #5f6368; padding: 10px 12px; text-align: left; border-bottom: 1px solid #e1e4e8; text-transform: uppercase; font-size: 11px; font-weight: 700; letter-spacing: 0.3px; }
        .rp-table td { padding: 12px; border-bottom: 1px solid #f0f0f1; color: #3c434a; vertical-align: middle; }
        .rp-table tr:last-child td { border-bottom: none; }
        .rp-table tr:hover td { background: #fbfbfc; }

        /* Status pills inline */
        .rp-pill { display: inline-block; padding: 3px 9px; border-radius: 12px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px; }
        .rp-pill.pending   { background: #fef3c7; color: #92400e; }
        .rp-pill.approved  { background: #d1fae5; color: #065f46; }
        .rp-pill.rejected  { background: #fee2e2; color: #991b1b; }
        .rp-pill.completed { background: #dbeafe; color: #1e40af; }

        /* Controlo rows (toggles) */
        .rp-control-row { display: flex; justify-content: space-between; align-items: center; padding: 14px 16px; background: #f7f7fb; border: 1px solid #ebecf0; border-radius: 8px; margin-bottom: 8px; }
        .rp-control-row strong { color: #1d2327; font-size: 13px; font-weight: 600; }
        .rp-control-desc { display: block; font-size: 11px; color: #5f6368; font-weight: 400; margin-top: 3px; }

        /* Toggle switch */
        .switch { position: relative; display: inline-block; width: 44px; height: 22px; flex-shrink: 0; }
        .switch input { opacity: 0; width: 0; height: 0; }
        .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #d1d5db; transition: .25s; border-radius: 22px; }
        .slider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 3px; bottom: 3px; background-color: white; transition: .25s; border-radius: 50%; box-shadow: 0 1px 3px rgba(0,0,0,0.2); }
        input:checked + .slider { background-color: #ef4444; }
        input:checked + .slider:before { transform: translateX(22px); }

        /* Inputs e botões */
        .onemz-input { width: 100%; padding: 10px 12px; background: #fff; border: 1px solid #d8dae0; color: #1d2327; border-radius: 8px; margin-bottom: 10px; font-size: 14px; transition: 0.15s; }
        .onemz-input:focus { border-color: #f0b90b; outline: none; box-shadow: 0 0 0 3px rgba(240,185,11,0.15); }
        .onemz-input::placeholder { color: #9ca3af; }

        .onemz-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; background: #1d2327; color: #f0b90b; border: none; padding: 10px 16px; font-weight: 700; border-radius: 8px; cursor: pointer; text-transform: uppercase; letter-spacing: 0.5px; transition: 0.15s; font-size: 12px; text-decoration: none; }
        .onemz-btn:hover { background: #2c2c34; color: #f0b90b; transform: translateY(-1px); }
        .onemz-btn[style*="background"]:hover { transform: translateY(-1px); }

        /* Modal verify_del overlay */
        .rp-modal-bg { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.55); z-index: 999999; display: flex; justify-content: center; align-items: center; backdrop-filter: blur(2px); }
        .rp-modal-box { background: #fff; padding: 32px; border-radius: 16px; width: 480px; max-width: 90vw; text-align: center; box-shadow: 0 25px 60px rgba(0,0,0,0.3); border: 1px solid #e1e4e8; }
        .rp-modal-box h3 { margin: 12px 0 8px; font-size: 22px; color: #991b1b; }
        .rp-modal-box p { color: #5f6368; font-size: 14px; line-height: 1.6; margin: 0 0 18px; }
        .rp-modal-box .pin-input { width: 100%; padding: 18px; text-align: center; font-size: 28px; letter-spacing: 10px; background: #f7f7fb; color: #1d2327; border: 2px solid #ef4444; border-radius: 10px; margin-bottom: 18px; outline: none; font-weight: 700; }

        /* Lista compacta inline */
        .rp-mini-list { list-style: none; padding: 0; margin: 0; }
        .rp-mini-list li { padding: 10px 12px; border-bottom: 1px solid #f0f0f1; font-size: 13px; color: #3c434a; display: flex; justify-content: space-between; align-items: center; gap: 12px; }
        .rp-mini-list li:last-child { border-bottom: none; }

        /* =====================================================================
         * [1.6.336] Reskin Material 3 — paleta/raio/sombras como nas Configurações
         * ===================================================================== */
        .rmbz-profile-wrap{
            --m3-primary:#5B4CE0; --m3-primary-press:#4A3ECF;
            --m3-outline:#e3e1ee; --m3-surface-2:#f5f4fb;
        }
        .rmbz-profile-wrap .rp-header,
        .rmbz-profile-wrap .rp-panel,
        .rmbz-profile-wrap .rp-modal-box{
            border-radius:20px; border:1px solid var(--m3-outline);
            box-shadow:0 1px 2px rgba(28,27,42,.04), 0 6px 20px rgba(28,27,42,.05);
        }
        .rmbz-profile-wrap .rp-panel h3{ text-transform:none; font-size:16px; letter-spacing:-.01em; }
        .rmbz-profile-wrap .onemz-input{ border-radius:11px; border:1.5px solid var(--m3-outline); }
        .rmbz-profile-wrap .onemz-input:focus{ border-color:var(--m3-primary); box-shadow:0 0 0 3px rgba(91,76,224,.18); }
        /* Botão primário M3 (mantém variantes com style inline) */
        .rmbz-profile-wrap .onemz-btn:not([style*="background"]){
            background:var(--m3-primary); color:#fff; border-radius:12px;
            text-transform:none; letter-spacing:.01em; font-size:13px; padding:11px 20px;
            box-shadow:0 2px 10px rgba(91,76,224,.35);
        }
        .rmbz-profile-wrap .onemz-btn:not([style*="background"]):hover{ background:var(--m3-primary-press); color:#fff; }

        /* [1.6.336] Grupo de controlo: toggle + data de desbloqueio */
        .rmbz-profile-wrap .rp-control-group{
            background:var(--m3-surface-2); border:1px solid var(--m3-outline);
            border-radius:14px; padding:2px 4px; margin-bottom:10px; transition:.15s;
        }
        .rmbz-profile-wrap .rp-control-group.is-on{ border-color:#f3b9c0; background:#fff6f6; }
        .rmbz-profile-wrap .rp-control-group .rp-control-row{ background:transparent; border:0; margin:0; }
        .rmbz-profile-wrap .rp-expiry{ padding:0 16px 12px; }
        .rmbz-profile-wrap .rp-expiry-label{ display:block; font-size:11px; font-weight:600; color:#5f6368; margin:2px 0 6px; }
        .rmbz-profile-wrap .rp-expiry-hint{ font-weight:400; color:#9ca3af; }
        .rmbz-profile-wrap .rp-expiry-inline{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
        .rmbz-profile-wrap .rp-expiry-input{ width:auto; margin:0; min-width:210px; }
        .rmbz-profile-wrap .rp-expiry-state{
            font-size:11px; font-weight:700; color:#9d174d; background:#fde2e7;
            padding:4px 11px; border-radius:10px; white-space:nowrap;
        }
    </style>

    <?php
    // [1.6.118.16] Validar que transient existe antes de mostrar modal.
    // Antes, mesmo após expiração (15min), o modal aparecia e ao submeter
    // mostrava erro. Agora se já expirou, mostramos aviso e voltamos atrás.
    if ( isset($_GET['verify_del']) && $_GET['verify_del'] == '1' ) {
        $del_code_exists = get_transient( 'rmbz_del_code_' . $telemovel );
        if ( ! $del_code_exists ):
            // Código já expirou — não mostrar modal, mostrar aviso só.
            ?>
            <div class="rp-modal-bg">
                <div class="rp-modal-box">
                    <div style="font-size:50px;">⏱️</div>
                    <h3 style="color:#9a3412;">Código Expirado</h3>
                    <p>O código de segurança para apagar esta conta expirou (15 min). Pede um novo código.</p>
                    <a href="<?php echo admin_url('admin.php?page=rmbz-historico-utilizador&user_id='.urlencode($telemovel)); ?>" class="onemz-btn" style="background:#1d2327;">Voltar ao Perfil</a>
                </div>
            </div>
            <?php
        else: ?>
    <div class="rp-modal-bg">
        <div class="rp-modal-box">
            <div style="font-size:50px;">🛡️</div>
            <h3>Confirmação de Segurança</h3>
            <p>Por motivos de segurança, um código de 6 dígitos foi enviado para o e-mail: <br><strong style="color:#1d2327;"><?php echo get_option('admin_email'); ?></strong>.</p>
            <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
                <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                <input type="hidden" name="control_action" value="confirm_delete">
                <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                <input type="text" name="security_code" required maxlength="6" placeholder="000000" class="pin-input" autocomplete="off" inputmode="numeric" pattern="[0-9]{6}">
                <div style="display:flex; gap:10px;">
                    <a href="<?php echo admin_url('admin.php?page=rmbz-historico-utilizador&user_id='.urlencode($telemovel)); ?>" class="onemz-btn" style="background:#f1f3f5; color:#1d2327; flex:1;">Cancelar</a>
                    <button type="submit" class="onemz-btn" style="background:#ef4444; color:#fff; flex:2;">Confirmar Exclusão</button>
                </div>
            </form>
        </div>
    </div>
    <?php endif;
    } ?>

    <div class="rmbz-profile-wrap">

        <a href="<?php echo admin_url('admin.php?page=rmbz-utilizadores'); ?>" class="rp-back">← Voltar à Lista Geral de Artistas</a>

        <?php
        // [1.6.118.16] Mostrar PIN inline (transient) — NÃO via URL.
        // Quando admin reseta PIN, o handler guarda em transient e
        // redirect com ?msg=__SHOW_PIN__. Aqui lemos e mostramos uma
        // vez, depois apagamos o transient.
        if ( isset( $_GET['msg'] ) && $_GET['msg'] === '__SHOW_PIN__' ) :
            $pin_show_key = 'rmbz_pin_show_' . get_current_user_id() . '_' . md5( $telemovel );
            $pin_show     = get_transient( $pin_show_key );
            if ( $pin_show ) :
                delete_transient( $pin_show_key );
                ?>
                <div class="rp-msg success" style="display:block; padding:18px 20px;">
                    <div style="font-weight:700; margin-bottom:8px;">✅ PIN redefinido com sucesso</div>
                    <div style="font-size:13px; color:#3c434a; margin-bottom:10px;">
                        Anota o novo PIN agora — esta mensagem desaparece se recarregares a página:
                    </div>
                    <div style="font-size:32px; letter-spacing:14px; font-weight:800; font-family:monospace; padding:14px 24px; background:#fff; color:#1d2327; border:2px dashed #f0b90b; border-radius:10px; display:inline-block; user-select:all;">
                        <?php echo esc_html( $pin_show ); ?>
                    </div>
                    <div style="font-size:11px; color:#5f6368; margin-top:8px;">
                        🔒 PIN apresentado uma única vez por segurança. Não é guardado em logs nem na URL.
                    </div>
                </div>
                <?php
            endif;
        elseif ( isset( $_GET['msg'] ) ) : ?>
            <div class="rp-msg <?php echo strpos($_GET['msg'], 'Erro') !== false ? 'error' : 'success'; ?>">
                <?php echo strpos($_GET['msg'], 'Erro') !== false ? '❌' : '✅'; ?> <?php echo esc_html($_GET['msg']); ?>
            </div>
        <?php endif; ?>

        <!-- HEADER -->
        <div class="rp-header">
            <div class="rp-avatar"><?php echo esc_html( strtoupper( mb_substr( $user->user_nome ?: '?', 0, 1 ) ) ); ?></div>
            <div class="rp-header-info">
                <h1>
                    <?php echo esc_html( $user->user_nome ?: '(sem nome)' ); ?>
                    <?php if ( $is_vip ): ?><span class="rp-badge rp-badge-vip">💎 VIP ATIVO</span><?php endif; ?>
                </h1>
                <div class="rp-meta">
                    <span class="meta-item">📞
                        <span style="font-variant-numeric: tabular-nums; user-select: all; cursor: pointer; padding: 2px 6px; border-radius: 4px; transition: 0.15s;"
                              onclick="navigator.clipboard.writeText('<?php echo esc_js( $user->user_telemovel ); ?>'); this.style.background='#d1fae5'; this.textContent='✓ Copiado'; setTimeout(()=>{this.style.background='transparent';this.textContent='<?php echo esc_js( $user->user_telemovel ); ?>';}, 1500);"
                              title="Clica para copiar">
                            <?php echo esc_html( $user->user_telemovel ); ?>
                        </span>
                    </span>
                    <?php if ( ! empty( $user->user_email ) ): ?>
                        <span class="meta-item">📧 <?php echo esc_html( $user->user_email ); ?></span>
                    <?php endif; ?>
                    <?php if ( ! empty( $user->user_provincia ) || ! empty( $extra['provincia'] ) ): ?>
                        <span class="meta-item">📍 <?php echo esc_html( $user->user_provincia ?: ( $extra['provincia'] ?? '' ) ); ?><?php if ( ! empty( $extra['cidade'] ) ): ?>, <?php echo esc_html( $extra['cidade'] ); ?><?php endif; ?></span>
                    <?php endif; ?>
                </div>
                <div class="rp-flags">
                    <?php if ( $is_online ): ?>
                        <span class="rp-badge rp-badge-online">🟢 ONLINE AGORA</span>
                    <?php elseif ( $last_seen > 0 ): ?>
                        <span class="rp-badge rp-badge-offline">⚪ Visto: <?php echo esc_html( wp_date('d/m/Y H:i', $last_seen) ); ?></span>
                    <?php else: ?>
                        <span class="rp-badge rp-badge-offline">⚪ Nunca esteve online</span>
                    <?php endif; ?>

                    <?php if ($is_banned):   ?><span class="rp-badge rp-badge-banned">⛔ CONTA BANIDA</span><?php endif; ?>
                    <?php if ($block_dep):   ?><span class="rp-badge rp-badge-warn">DEPÓSITOS BLOQUEADOS</span><?php endif; ?>
                    <?php if ($block_wit):   ?><span class="rp-badge rp-badge-warn">LEVANTAMENTOS BLOQUEADOS</span><?php endif; ?>
                    <?php if ($block_dist):  ?><span class="rp-badge rp-badge-purple">DISTRIBUIÇÃO BLOQUEADA</span><?php endif; ?>
                    <?php if ($block_vid):   ?><span class="rp-badge rp-badge-warn">VÍDEOS BLOQUEADOS</span><?php endif; ?>
                    <?php if ($block_promo): ?><span class="rp-badge rp-badge-success">PROMOÇÃO BLOQUEADA</span><?php endif; ?>
                    <?php if ($has_popup):   ?><span class="rp-badge rp-badge-info">📣 POPUP PENDENTE</span><?php endif; ?>
                    <?php if (!empty($extra['account_status']) && $extra['account_status'] === 'expired'): ?>
                        <span class="rp-badge rp-badge-warn">⚠ CONTA EXPIRADA</span>
                    <?php endif; ?>
                </div>
            </div>
        </div>

        <!-- INFORMAÇÃO DETALHADA DA CONTA -->
        <div class="rp-info-grid">
            <div class="rp-info-card">
                <div class="rp-info-label">📅 Conta criada</div>
                <div class="rp-info-value">
                    <?php if ( $created_at ): ?>
                        <?php echo esc_html( wp_date('d/m/Y', strtotime( $created_at )) ); ?>
                        <span style="font-size:11px; color:#5f6368; display:block;">
                            há <?php
                            $dias = floor( ( time() - strtotime( $created_at ) ) / 86400 );
                            if ( $dias === 0 ) echo 'hoje';
                            elseif ( $dias === 1 ) echo '1 dia';
                            elseif ( $dias < 30 ) echo $dias . ' dias';
                            elseif ( $dias < 365 ) echo floor( $dias / 30 ) . ' mês(es)';
                            else echo floor( $dias / 365 ) . ' ano(s)';
                            ?>
                        </span>
                    <?php else: ?>
                        <span style="color:#aaa; font-style:italic;">desconhecido</span>
                    <?php endif; ?>
                </div>
            </div>

            <div class="rp-info-card">
                <div class="rp-info-label">📲 Origem do Registo</div>
                <div class="rp-info-value">
                    <?php if ( $source_platform === 'app' ): ?>
                        <span style="color:#075985;">📱 App Android</span>
                    <?php elseif ( $source_platform === 'site' ): ?>
                        <span style="color:#3c434a;">🌐 Site</span>
                    <?php else: ?>
                        <span style="color:#aaa; font-style:italic;">— antigo —</span>
                    <?php endif; ?>
                </div>
            </div>

            <div class="rp-info-card">
                <div class="rp-info-label">📱 Dispositivos App</div>
                <div class="rp-info-value">
                    <?php echo (int) $devices_count; ?>
                    <?php if ( $last_app_version ): ?>
                        <span style="font-size:11px; color:#5f6368; display:block;">
                            Última: v<?php echo esc_html( $last_app_version ); ?>
                        </span>
                    <?php endif; ?>
                </div>
            </div>

            <div class="rp-info-card">
                <div class="rp-info-label">🔐 Sessões Activas</div>
                <div class="rp-info-value"><?php echo (int) $active_sessions; ?></div>
            </div>

            <div class="rp-info-card">
                <div class="rp-info-label">📥 Total Depositado</div>
                <div class="rp-info-value" style="color:#047857;">
                    <?php echo number_format( $total_depositado, 2, ',', '.' ); ?><span style="font-size:12px; color:#5f6368;"> MT</span>
                </div>
            </div>

            <div class="rp-info-card">
                <div class="rp-info-label">📤 Total Levantado</div>
                <div class="rp-info-value" style="color:#9a3412;">
                    <?php echo number_format( $total_levantado, 2, ',', '.' ); ?><span style="font-size:12px; color:#5f6368;"> MT</span>
                </div>
            </div>
        </div>

        <!-- ESTATÍSTICAS NO TOPO -->
        <div class="rp-stats">
            <div class="rp-stat balance">
                <div class="label">Saldo na Carteira</div>
                <div class="value"><?php echo number_format( $user->balance, 2, ',', '.' ); ?><span class="unit">MT</span></div>
            </div>
            <div class="rp-stat info">
                <div class="label">Músicas (Site)</div>
                <div class="value"><?php echo number_format( (int) $envios_site, 0, ',', '.' ); ?></div>
            </div>
            <div class="rp-stat gold">
                <div class="label">Vídeos (Redes)</div>
                <div class="value"><?php echo number_format( (int) $envios_soc, 0, ',', '.' ); ?></div>
            </div>
            <div class="rp-stat purple">
                <div class="label">Projetos (Vídeo)</div>
                <div class="value"><?php echo number_format( (int) $projetos, 0, ',', '.' ); ?></div>
            </div>
        </div>

        <div class="rp-grid">

            <div>
                <div class="rp-panel">
                    <h3><span class="icon">🎬</span> Histórico de Envios</h3>
                    <?php if (empty($ultimos_envios)): ?>
                        <div class="empty">O artista ainda não fez nenhum envio para a plataforma.</div>
                    <?php else: ?>
                        <table class="rp-table">
                            <tr><th>Data</th><th>Título da Obra</th><th>Destino</th><th>Estado</th></tr>
                            <?php foreach($ultimos_envios as $envio): 
                                $cor = '#aaa';
                                if($envio->review_status == 'aprovado' || $envio->review_status == 'finalizado') $cor = '#2ecc71';
                                if($envio->review_status == 'rejeitado') $cor = '#e74c3c';
                                if($envio->review_status == 'pendente') $cor = '#f0b90b';
                            ?>
                            <tr>
                                <td><?php echo date('d/m/y', strtotime($envio->submission_date)); ?></td>
                                <td><strong style="color:var(--rmbz-text-primary, #fff);"><?php echo esc_html($envio->music_title); ?></strong></td>
                                <td><?php echo esc_html($envio->scenario_type); ?></td>
                                <td><span style="color:<?php echo $cor; ?>; font-weight:bold; text-transform:uppercase; font-size:11px; background:rgba(255,255,255,0.05); padding:3px 8px; border-radius:4px; border:1px solid <?php echo $cor; ?>;"><?php echo esc_html($envio->review_status); ?></span></td>
                            </tr>
                            <?php endforeach; ?>
                        </table>
                    <?php endif; ?>
                </div>

                <div class="rp-panel">
                    <h3 style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;">
                        <span>💳 Extrato da Carteira <span style="font-size:12px;color:#5f6368;font-weight:500;">(<?php echo number_format( count( $transacoes_carteira ), 0, ",", "." ); echo $total_tx_all > count($transacoes_carteira) ? " de " . number_format( $total_tx_all, 0, ",", "." ) : ""; ?>)</span></span>
                        <?php if ( ! empty($transacoes_carteira) ):
                            /* [1.5.142] 2 botões no header conforme decisão "opção C":
                               - 🗑 Limpar registos: NÃO mexe no saldo
                               - ↩ Anular tudo: apaga + reverte saldo (= Anular em massa)
                               Calculamos a soma para o admin saber o impacto antes de confirmar. */
                            global $wpdb;
                            $sum_extrato = (float) $wpdb->get_var( $wpdb->prepare(
                                "SELECT COALESCE(SUM(amount), 0) FROM {$wpdb->prefix}rmbz_wallet_transactions WHERE user_telemovel = %s",
                                $telemovel
                            ) );
                            $count_extrato = (int) count($transacoes_carteira);
                            $current_bal = (float) $wpdb->get_var( $wpdb->prepare(
                                "SELECT balance FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s",
                                $telemovel
                            ) );
                            $bal_apos_anular = $current_bal - $sum_extrato;
                            $confirm_msg_anular = sprintf(
                                'ATENÇÃO: Vai ANULAR todas as transações do extrato E reverter o saldo.\n\n%d transações serão apagadas.\nSoma das transações: %s MT.\nSaldo actual: %s MT → Saldo após anulação: %s MT.\n\nContinuar?',
                                $count_extrato,
                                number_format($sum_extrato, 2, ',', '.'),
                                number_format($current_bal, 2, ',', '.'),
                                number_format($bal_apos_anular, 2, ',', '.')
                            );
                            $confirm_msg_limpar = sprintf(
                                'Vai apagar %d transações do extrato. O saldo NÃO será alterado (continua %s MT). Esta ação é só limpeza visual. Continuar?',
                                $count_extrato,
                                number_format($current_bal, 2, ',', '.')
                            );
                        ?>
                            <div style="display:flex;gap:8px;flex-wrap:wrap;">
                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('<?php echo esc_js($confirm_msg_limpar); ?>');" style="margin:0;">
                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                    <input type="hidden" name="control_action" value="limpar_extrato">
                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                    <button type="submit" title="Apaga só os registos. Saldo continua igual."
                                            style="background:rgba(231,76,60,0.15);color:var(--rmbz-danger, #ef4444);border:1px solid #e74c3c;padding:6px 14px;border-radius:6px;font-size:11px;cursor:pointer;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;">
                                        🗑 Limpar Registos
                                    </button>
                                </form>
                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('<?php echo esc_js($confirm_msg_anular); ?>');" style="margin:0;">
                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                    <input type="hidden" name="control_action" value="anular_extrato">
                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                    <button type="submit" title="Apaga registos E reverte o saldo."
                                            style="background:rgba(230,126,34,0.15);color:var(--rmbz-warning, #f59e0b);border:1px solid #e67e22;padding:6px 14px;border-radius:6px;font-size:11px;cursor:pointer;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;">
                                        ↩ Anular e Reverter
                                    </button>
                                </form>
                            </div>
                        <?php endif; ?>
                    </h3>
                    <?php if (empty($transacoes_carteira)): ?>
                        <p style="color:#5f6368; margin:0;">Ainda não existem movimentos financeiros nesta carteira.</p>
                    <?php else: ?>
                        <div style="max-height: 400px; overflow-y: auto; border-radius: 8px; border: 1px solid #333;">
                            <table class="rp-table">
                                <tr><th>Data</th><th>Descrição do Movimento</th><th>Valor</th><th style="text-align:right;">Ação</th></tr>
                                <?php foreach($transacoes_carteira as $trans): ?>
                                <tr>
                                    <td><?php echo date('d/m/y H:i', strtotime($trans->transaction_date)); ?></td>
                                    <td><?php echo esc_html($trans->details); ?></td>
                                    <td style="font-weight:bold; color:<?php echo ($trans->amount >= 0) ? '#2ecc71' : '#e74c3c'; ?>;">
                                        <?php echo ($trans->amount >= 0 ? '+' : '') . number_format($trans->amount, 2, ',', '.'); ?> MT
                                    </td>
                                    <td style="text-align:right;">
                                        <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('ATENÇÃO: Excluir esta transação vai apagar este registo e reverter o valor do saldo do artista! Deseja continuar?');">
                                            <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                            <input type="hidden" name="control_action" value="anular_transacao">
                                            <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                            <input type="hidden" name="transaction_id" value="<?php echo $trans->transaction_id; ?>">
                                            <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                            <button type="submit" style="background:rgba(231, 76, 60, 0.1); color:var(--rmbz-danger, #ef4444); border:1px solid #e74c3c; padding:6px 12px; border-radius:4px; font-size:11px; cursor:pointer; font-weight:bold; transition:0.2s;" onmouseover="this.style.background='#e74c3c'; this.style.color='#fff';" onmouseout="this.style.background='rgba(231, 76, 60, 0.1)'; this.style.color='#e74c3c';">Excluir</button>
                                        </form>
                                    </td>
                                </tr>
                                <?php endforeach; ?>
                            </table>
                        </div>
                    <?php endif; ?>
                </div>

                <?php /* [1.5.141/143] PANEL: Pedidos de Levantamento.
                    Cada linha tem 2 botões: 'Excluir' (só apaga registo) e
                    'Reverter' (apaga + remove transações relacionadas no
                    Extrato + ajusta saldo). Idem para o header com versões
                    "Limpar Tudo" e "Reverter Tudo". */ ?>
                <div class="rp-panel">
                    <h3 style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;">
                        <span>💸 Pedidos de Levantamento <span style="font-size:12px;color:#5f6368;font-weight:500;">(<?php echo number_format( count( $pedidos_levantamento ), 0, ",", "." ); echo $total_lev_all > count($pedidos_levantamento) ? " de " . number_format( $total_lev_all, 0, ",", "." ) : ""; ?>)</span></span>
                        <?php if ( ! empty($pedidos_levantamento) ): ?>
                            <div style="display:flex;gap:8px;flex-wrap:wrap;">
                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Vai apagar TODOS os <?php echo count($pedidos_levantamento); ?> pedidos de levantamento. Esta ação NÃO afecta o saldo nem o Extrato. Continuar?');" style="margin:0;">
                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                    <input type="hidden" name="control_action" value="limpar_levantamentos">
                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                    <button type="submit" title="Apaga só os pedidos. Saldo e Extrato intactos."
                                            style="background:rgba(231,76,60,0.15);color:var(--rmbz-danger, #ef4444);border:1px solid #e74c3c;padding:6px 14px;border-radius:6px;font-size:11px;cursor:pointer;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;">
                                        🗑 Limpar Tudo
                                    </button>
                                </form>
                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('ATENÇÃO: Vai REVERTER TODOS os <?php echo count($pedidos_levantamento); ?> pedidos. Para cada um, as transações relacionadas no Extrato serão apagadas E o saldo será ajustado. O resultado líquido pode ser positivo ou negativo. Continuar?');" style="margin:0;">
                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                    <input type="hidden" name="control_action" value="reverter_todos_levantamentos">
                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                    <button type="submit" title="Apaga pedidos + reverte transações no Extrato + ajusta saldo."
                                            style="background:rgba(230,126,34,0.15);color:var(--rmbz-warning, #f59e0b);border:1px solid #e67e22;padding:6px 14px;border-radius:6px;font-size:11px;cursor:pointer;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;">
                                        ↩ Reverter Tudo
                                    </button>
                                </form>
                            </div>
                        <?php endif; ?>
                    </h3>
                    <?php if ( empty($pedidos_levantamento) ): ?>
                        <p style="color:#5f6368; margin:0;">Sem pedidos de levantamento.</p>
                    <?php else: ?>
                        <div style="max-height:400px;overflow-y:auto;border-radius:8px;border:1px solid #333;">
                            <table class="rp-table">
                                <tr><th>Data</th><th>Valor</th><th>Origem</th><th>Método</th><th>Estado</th><th style="text-align:right;">Ação</th></tr>
                                <?php foreach ( $pedidos_levantamento as $lev ):
                                    $status_color = '#888';
                                    if ( $lev->status === 'aprovado' )  $status_color = '#2ecc71';
                                    if ( $lev->status === 'rejeitado' ) $status_color = '#e74c3c';
                                    if ( $lev->status === 'pendente' )  $status_color = '#f0b90b';
                                    $source_label = ($lev->source ?? 'wallet') === 'distro' ? 'USD (royalties)' : 'MT (wallet)';
                                ?>
                                    <tr>
                                        <td><?php echo esc_html( date('d/m/y H:i', strtotime($lev->request_date)) ); ?></td>
                                        <td style="font-weight:bold;color:var(--rmbz-danger, #ef4444);">-<?php echo number_format( (float) $lev->amount, 2, ',', '.' ); ?> MT</td>
                                        <td style="font-size:11px;color:var(--rmbz-text-muted, #aaa);"><?php echo esc_html($source_label); ?></td>
                                        <td style="font-size:11px;color:var(--rmbz-text-muted, #aaa);"><?php echo esc_html($lev->payment_method); ?></td>
                                        <td><span style="color:<?php echo esc_attr($status_color); ?>;font-weight:bold;font-size:11px;text-transform:uppercase;"><?php echo esc_html($lev->status); ?></span></td>
                                        <td style="text-align:right;">
                                            <div style="display:inline-flex;gap:4px;">
                                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Excluir este pedido? Saldo e Extrato NÃO serão alterados.');" style="margin:0;">
                                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                                    <input type="hidden" name="control_action" value="excluir_levantamento">
                                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                                    <input type="hidden" name="request_id" value="<?php echo (int) $lev->id; ?>">
                                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                                    <button type="submit" title="Apaga só o pedido"
                                                            style="background:rgba(231,76,60,0.1);color:var(--rmbz-danger, #ef4444);border:1px solid #e74c3c;padding:5px 10px;border-radius:4px;font-size:11px;cursor:pointer;font-weight:bold;">Excluir</button>
                                                </form>
                                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Reverter este pedido? As transações relacionadas no Extrato serão apagadas E o saldo será ajustado.');" style="margin:0;">
                                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                                    <input type="hidden" name="control_action" value="reverter_levantamento">
                                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                                    <input type="hidden" name="request_id" value="<?php echo (int) $lev->id; ?>">
                                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                                    <button type="submit" title="Apaga pedido + reverte saldo + apaga transações no Extrato"
                                                            style="background:rgba(230,126,34,0.1);color:var(--rmbz-warning, #f59e0b);border:1px solid #e67e22;padding:5px 10px;border-radius:4px;font-size:11px;cursor:pointer;font-weight:bold;">Reverter</button>
                                                </form>
                                            </div>
                                        </td>
                                    </tr>
                                <?php endforeach; ?>
                            </table>
                        </div>
                    <?php endif; ?>
                </div>

                <?php /* [1.5.141/143] PANEL: Pedidos de Depósito.
                    Mesma lógica de 2 botões (excluir / reverter).
                    'Excluir' apaga registo + comprovativo. 'Reverter' faz isso
                    + apaga as transações de crédito relacionadas no Extrato e
                    debita o saldo (só faz sentido para depósitos APROVADOS,
                    que são os únicos que afectaram o saldo). */ ?>
                <div class="rp-panel">
                    <h3 style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;">
                        <span>📥 Pedidos de Depósito <span style="font-size:12px;color:#5f6368;font-weight:500;">(<?php echo number_format( count( $pedidos_deposito ), 0, ",", "." ); echo $total_dep_all > count($pedidos_deposito) ? " de " . number_format( $total_dep_all, 0, ",", "." ) : ""; ?>)</span></span>
                        <?php if ( ! empty($pedidos_deposito) ): ?>
                            <div style="display:flex;gap:8px;flex-wrap:wrap;">
                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Vai apagar TODOS os <?php echo count($pedidos_deposito); ?> pedidos de depósito E os comprovativos do disco. Esta ação NÃO afecta o saldo nem o Extrato. Continuar?');" style="margin:0;">
                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                    <input type="hidden" name="control_action" value="limpar_depositos">
                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                    <button type="submit" title="Apaga só os pedidos + comprovativos. Saldo e Extrato intactos."
                                            style="background:rgba(231,76,60,0.15);color:var(--rmbz-danger, #ef4444);border:1px solid #e74c3c;padding:6px 14px;border-radius:6px;font-size:11px;cursor:pointer;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;">
                                        🗑 Limpar Tudo
                                    </button>
                                </form>
                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('ATENÇÃO: Vai REVERTER TODOS os <?php echo count($pedidos_deposito); ?> pedidos. Para cada APROVADO, a transação de crédito no Extrato será apagada E o saldo será debitado. PODE LEVAR A SALDO NEGATIVO. Continuar?');" style="margin:0;">
                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                    <input type="hidden" name="control_action" value="reverter_todos_depositos">
                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                    <button type="submit" title="Apaga pedidos + reverte créditos no Extrato + ajusta saldo."
                                            style="background:rgba(230,126,34,0.15);color:var(--rmbz-warning, #f59e0b);border:1px solid #e67e22;padding:6px 14px;border-radius:6px;font-size:11px;cursor:pointer;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;">
                                        ↩ Reverter Tudo
                                    </button>
                                </form>
                            </div>
                        <?php endif; ?>
                    </h3>
                    <?php if ( empty($pedidos_deposito) ): ?>
                        <p style="color:#5f6368; margin:0;">Sem pedidos de depósito.</p>
                    <?php else: ?>
                        <div style="max-height:400px;overflow-y:auto;border-radius:8px;border:1px solid #333;">
                            <table class="rp-table">
                                <tr><th>Data</th><th>Valor</th><th>Método</th><th>Tx ID</th><th>Estado</th><th style="text-align:right;">Ação</th></tr>
                                <?php foreach ( $pedidos_deposito as $dep ):
                                    $status_color = '#888';
                                    if ( $dep->status === 'aprovado' )  $status_color = '#2ecc71';
                                    if ( $dep->status === 'rejeitado' ) $status_color = '#e74c3c';
                                    if ( $dep->status === 'pendente' )  $status_color = '#f0b90b';
                                ?>
                                    <tr>
                                        <td><?php echo esc_html( date('d/m/y H:i', strtotime($dep->request_date)) ); ?></td>
                                        <td style="font-weight:bold;color:var(--rmbz-success, #10b981);">+<?php echo number_format( (float) $dep->amount, 2, ',', '.' ); ?> MT</td>
                                        <td style="font-size:11px;color:var(--rmbz-text-muted, #aaa);"><?php echo esc_html($dep->payment_method); ?></td>
                                        <td style="font-size:11px;color:var(--rmbz-text-muted, #aaa);font-family:monospace;"><?php echo esc_html( $dep->transaction_id ?: '—' ); ?></td>
                                        <td><span style="color:<?php echo esc_attr($status_color); ?>;font-weight:bold;font-size:11px;text-transform:uppercase;"><?php echo esc_html($dep->status); ?></span></td>
                                        <td style="text-align:right;">
                                            <div style="display:inline-flex;gap:4px;">
                                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Excluir este pedido? Vai apagar o comprovativo do disco. Saldo e Extrato NÃO serão alterados.');" style="margin:0;">
                                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                                    <input type="hidden" name="control_action" value="excluir_deposito">
                                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                                    <input type="hidden" name="request_id" value="<?php echo (int) $dep->id; ?>">
                                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                                    <button type="submit" title="Apaga só o pedido + comprovativo"
                                                            style="background:rgba(231,76,60,0.1);color:var(--rmbz-danger, #ef4444);border:1px solid #e74c3c;padding:5px 10px;border-radius:4px;font-size:11px;cursor:pointer;font-weight:bold;">Excluir</button>
                                                </form>
                                                <?php if ( $dep->status === 'aprovado' ): ?>
                                                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Reverter este depósito aprovado? A transação de crédito no Extrato será apagada E o saldo será debitado em <?php echo number_format((float) $dep->amount, 2, ',', '.'); ?> MT.');" style="margin:0;">
                                                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                                        <input type="hidden" name="control_action" value="reverter_deposito">
                                                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                                        <input type="hidden" name="request_id" value="<?php echo (int) $dep->id; ?>">
                                                        <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                                        <button type="submit" title="Apaga pedido + reverte crédito no Extrato + debita saldo"
                                                                style="background:rgba(230,126,34,0.1);color:var(--rmbz-warning, #f59e0b);border:1px solid #e67e22;padding:5px 10px;border-radius:4px;font-size:11px;cursor:pointer;font-weight:bold;">Reverter</button>
                                                    </form>
                                                <?php endif; ?>
                                            </div>
                                        </td>
                                    </tr>
                                <?php endforeach; ?>
                            </table>
                        </div>
                    <?php endif; ?>
                </div>
            </div>

            <div>
                <?php // [1.5.455] Terminar sessões ativas (site + app) ?>
                <div class="rp-panel">
                    <h3><span class="icon">🔐</span> Sessões ativas</h3>
                    <p style="color:#5f6368; font-size:12px; margin:-8px 0 12px;">
                        Sessões da app: <strong><?php echo (int) $active_sessions; ?></strong> ativa(s)
                        <?php if ( ! empty( $extra['last_seen'] ) ): ?> · última atividade: <strong><?php echo esc_html( date_i18n( 'd/m/Y H:i', (int) $extra['last_seen'] ) ); ?></strong><?php endif; ?>
                    </p>
                    <p style="color:#5f6368; font-size:12px; margin:0 0 12px; line-height:1.55;">
                        Termina todas as sessões do artista — a sessão do site é invalidada de imediato e todos os dispositivos da app são desligados (tokens revogados). Útil em caso de telemóvel perdido, conta partilhada ou suspeita de acesso indevido. O artista volta a entrar normalmente com o PIN dele.
                    </p>
                    <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>"
                          onsubmit="return confirm('Terminar TODAS as sessões ativas deste artista (site + app)? Ele será desligado de todos os dispositivos e terá de iniciar sessão de novo.');">
                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                        <input type="hidden" name="control_action" value="terminate_sessions">
                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr( $telemovel ); ?>">
                        <?php wp_nonce_field( 'rmbz_user_controls_nonce' ); ?>
                        <button type="submit" class="onemz-btn" style="background:#b3261e; color:#fff;">Terminar sessões ativas</button>
                    </form>
                </div>

                <div class="rp-panel accent-info">
                    <h3><span class="icon">📢</span> Enviar Mensagem Pop-up</h3>
                    <p style="color:#5f6368; font-size:12px; margin: -8px 0 15px;">Aparece no centro do ecrã do artista logo que ele abrir a sua conta. Ele será obrigado a clicar em "OK, Entendido".</p>

                    <?php if ( $has_popup ) :
                        $popup_existing = $extra['admin_popup'] ?? [];
                    ?>
                        <div style="background:#fef3c7; border:1px solid #fde68a; border-radius:8px; padding:12px 14px; margin-bottom:14px; font-size:12px; color:#92400e;">
                            <strong>⚠ Já existe um popup pendente:</strong><br>
                            <span style="font-size:11px;">
                                <strong><?php echo esc_html( $popup_existing['title'] ?? '(sem título)' ); ?></strong>
                                — <?php echo esc_html( mb_substr( $popup_existing['message'] ?? '', 0, 80 ) ); ?>
                            </span>
                            <div style="margin-top:8px; font-size:11px;">
                                Se enviares novo, vai <strong>substituir</strong> o existente.
                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" style="display:inline-block; margin-left:8px;" onsubmit="return confirm('Remover popup pendente sem o substituir?');">
                                    <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                                    <input type="hidden" name="control_action" value="clear_popup">
                                    <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                                    <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                                    <button type="submit" style="background:transparent; border:none; color:#92400e; text-decoration:underline; cursor:pointer; padding:0; font-size:11px;">remover existente →</button>
                                </form>
                            </div>
                        </div>
                    <?php endif; ?>

                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" <?php if ( $has_popup ) echo 'onsubmit="return confirm(\'Já existe popup pendente para este artista. Substituir?\');"'; ?>>
                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                        <input type="hidden" name="control_action" value="send_popup">
                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                        <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>

                        <label style="color:#1d2327; font-size:12px; margin-bottom:5px; display:block; font-weight:700; text-transform:uppercase; letter-spacing:0.3px;">Título do Aviso</label>
                        <input type="text" name="popup_title" class="onemz-input" placeholder="Ex: Pagamento Aprovado!" required>

                        <label style="color:#1d2327; font-size:12px; margin-bottom:5px; display:block; font-weight:700; text-transform:uppercase; letter-spacing:0.3px;">Mensagem Detalhada</label>
                        <textarea name="popup_message" class="onemz-input" rows="3" placeholder="Escreva a sua mensagem..." required></textarea>

                        <label style="color:#1d2327; font-size:12px; margin-bottom:5px; display:block; font-weight:700; text-transform:uppercase; letter-spacing:0.3px;">Tipo de Aviso (Cor do Ícone)</label>
                        <select name="popup_type" class="onemz-input" required>
                            <option value="info">ℹ️ Informativo (Azul)</option>
                            <option value="success">✅ Sucesso (Verde)</option>
                            <option value="warning">⚠️ Aviso (Amarelo)</option>
                            <option value="danger">🚨 Perigo/Erro (Vermelho)</option>
                        </select>

                        <button type="submit" class="onemz-btn" style="background:#3b82f6; color:#fff; margin-top:10px;">Forçar Pop-up no Ecrã</button>
                    </form>
                </div>

                <div class="rp-panel">
                    <h3>💰 Ajustar Saldo Manualmente</h3>
                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Tem a certeza que deseja alterar o saldo real deste artista?');">
                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                        <input type="hidden" name="control_action" value="adjust_balance">
                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                        <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>

                        <label style="color:var(--rmbz-text-secondary, #ccc); font-size:12px; margin-bottom:8px; display:block; font-weight:bold;">Valor a adicionar ou retirar (Use "-" para retirar)</label>
                        <input type="number" step="0.01" name="adjust_amount" class="onemz-input" placeholder="Ex: 1000 ou -500" required>

                        <label style="color:var(--rmbz-text-secondary, #ccc); font-size:12px; margin-bottom:8px; display:block; font-weight:bold;">Motivo / Descrição para o Extrato</label>
                        <input type="text" name="adjust_reason" class="onemz-input" placeholder="Ex: Bónus de campanha, Remoção de Fraude..." required>

                        <button type="submit" class="onemz-btn" style="margin-top:10px;">Atualizar Carteira</button>
                    </form>
                </div>

                <div class="rp-panel" style="border-color: var(--rmbz-brand, #f0b90b);">
                    <h3 style="color:var(--rmbz-brand, #f0b90b);">🔒 Limitar Acessos (Castigos)</h3>
                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                        <input type="hidden" name="control_action" value="punishments">
                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                        <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>

                        <?php
                        // [1.6.337] Helper local: cada bloqueio com toggle + data de
                        // desbloqueio + motivo INTERNO (obrigatório) + motivo do
                        // utilizador (mostrado na app/site). $m = meta do bloqueio.
                        $ctrl_row = function( $name, $title, $desc, $on, $m, $accent = false ) {
                            $until_ts = !empty($m['until']) ? (int) $m['until'] : 0;
                            $internal = isset($m['internal']) ? (string) $m['internal'] : '';
                            $user_r   = isset($m['user']) ? (string) $m['user'] : '';
                            $val   = function_exists('rmbz_block_until_input_value') ? rmbz_block_until_input_value( $until_ts ) : '';
                            $state = function_exists('rmbz_block_state_label') ? rmbz_block_state_label( (bool) $on, $until_ts ) : '';
                            ?>
                            <div class="rp-control-group<?php echo $on ? ' is-on' : ''; ?>"<?php echo $accent ? ' style="border-left:3px solid #ef4444;padding-left:12px;border-radius:10px;"' : ''; ?>>
                                <div class="rp-control-row">
                                    <div>
                                        <strong><?php echo esc_html($title); ?></strong>
                                        <span class="rp-control-desc"><?php echo esc_html($desc); ?></span>
                                    </div>
                                    <label class="switch"><input type="checkbox" class="rp-block-toggle" data-target="exp_<?php echo esc_attr($name); ?>" name="<?php echo esc_attr($name); ?>" value="1" <?php checked( (bool) $on, true ); ?>><span class="slider"></span></label>
                                </div>
                                <div class="rp-expiry" id="exp_<?php echo esc_attr($name); ?>"<?php echo $on ? '' : ' style="display:none;"'; ?>>
                                    <label class="rp-expiry-label">⏱️ Desbloquear em <span class="rp-expiry-hint">(deixa vazio = permanente)</span></label>
                                    <div class="rp-expiry-inline">
                                        <input type="datetime-local" name="<?php echo esc_attr($name); ?>_until" value="<?php echo esc_attr($val); ?>" class="onemz-input rp-expiry-input">
                                        <?php if ($state): ?><span class="rp-expiry-state"><?php echo esc_html($state); ?></span><?php endif; ?>
                                    </div>
                                    <label class="rp-expiry-label rp-reason-internal-label">🔒 Motivo interno <span class="rp-expiry-hint">(só admin — obrigatório para aplicar)</span></label>
                                    <textarea name="<?php echo esc_attr($name); ?>_reason_internal" class="onemz-input rp-reason" rows="2" placeholder="Porquê este castigo? (fica no registo, só admin vê)"><?php echo esc_textarea($internal); ?></textarea>
                                    <label class="rp-expiry-label">💬 Motivo para o artista <span class="rp-expiry-hint">(aparece na app/site — opcional)</span></label>
                                    <textarea name="<?php echo esc_attr($name); ?>_reason_user" class="onemz-input rp-reason" rows="2" placeholder="O que o artista vai ler (ex.: motivo + como resolver)"><?php echo esc_textarea($user_r); ?></textarea>
                                </div>
                            </div>
                            <?php
                        };
                        $mget = function( $k ) use ( $blocks_meta ) { return isset($blocks_meta[$k]) && is_array($blocks_meta[$k]) ? $blocks_meta[$k] : []; };
                        ?>

                        <?php $ctrl_row('is_banned', 'Impedir Login (Banir Totalmente)', 'O artista não conseguirá aceder ao painel.', ($is_banned == 1), $mget('is_banned'), true); ?>

                        <h4 style="color:#1d2327; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.5px; margin: 18px 0 10px 0; border-bottom: 1px solid #e1e4e8; padding-bottom: 8px;">💸 Limitações Financeiras</h4>

                        <?php $ctrl_row('block_withdrawals', 'Bloquear Levantamentos', 'Remove o botão de retirar fundos.', $block_wit, $mget('block_withdrawals')); ?>
                        <?php $ctrl_row('block_deposits', 'Bloquear Depósitos', 'Impede carregamentos na conta.', $block_dep, $mget('block_deposits')); ?>

                        <h4 style="color:#1d2327; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.5px; margin: 22px 0 10px 0; border-bottom: 1px solid #e1e4e8; padding-bottom: 8px;">🚫 Limitações de Serviços (Ações)</h4>

                        <?php $ctrl_row('block_distribution', 'Bloquear Distribuição Digital', 'Painel de enviar músicas para as lojas ficará bloqueado.', $block_dist, $mget('block_distribution')); ?>
                        <?php $ctrl_row('block_video_applications', 'Bloquear Candidaturas a Videoclipe', 'Impede o artista de enviar novos pedidos para a equipa avaliar.', $block_vid, $mget('block_video_applications')); ?>
                        <?php $ctrl_row('block_promotions', 'Bloquear Promoção nas Redes Sociais/Site', 'Impede o envio de novos áudios/vídeos para o site 1MusicMoz.', $block_promo, $mget('block_promotions')); ?>

                        <?php /* [1.5.133] Banir de receber comissões de convite. */ ?>
                        <?php $ctrl_row('ban_referral', 'Banir de Convites', 'Impede que este utilizador receba comissões quando outros artistas o indicarem como convidador. Útil contra fraudes.', $ban_referral, $mget('ban_referral')); ?>

                        <button type="submit" class="onemz-btn" style="margin-top:15px;">Aplicar Bloqueios</button>

                        <?php if ( ! empty($blocks_log) ): ?>
                            <div class="rp-blocks-log">
                                <h4 style="color:#1d2327; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.5px; margin: 22px 0 10px 0; border-bottom: 1px solid #e1e4e8; padding-bottom: 8px;">📋 Histórico de castigos</h4>
                                <ul class="rp-mini-list rp-log-list">
                                    <?php foreach ( array_slice($blocks_log, 0, 15) as $entry ):
                                        $act = $entry['action'] ?? '';
                                        $act_label = $act === 'apply' ? '⛔ Aplicou' : ( $act === 'lift' ? '✅ Levantou' : '⏱️ Expirou' );
                                        $klabel = function_exists('rmbz_block_label') ? rmbz_block_label($entry['key'] ?? '') : ($entry['key'] ?? '');
                                        $when = !empty($entry['at']) ? wp_date('d/m/Y H:i', (int)$entry['at']) : '';
                                    ?>
                                        <li>
                                            <span><strong><?php echo esc_html($act_label); ?></strong> <?php echo esc_html($klabel); ?>
                                                <?php if ( ! empty($entry['internal']) ): ?><br><span style="color:#6b6880;font-size:11px;">🔒 <?php echo esc_html($entry['internal']); ?></span><?php endif; ?>
                                            </span>
                                            <span style="color:#9ca3af;font-size:11px;white-space:nowrap;"><?php echo esc_html($when); ?><?php echo !empty($entry['by']) ? ' · ' . esc_html($entry['by']) : ''; ?></span>
                                        </li>
                                    <?php endforeach; ?>
                                </ul>
                            </div>
                        <?php endif; ?>
                    </form>
                    <script>
                    (function(){
                        var toggles = document.querySelectorAll('.rp-block-toggle');
                        for (var i=0;i<toggles.length;i++){
                            toggles[i].addEventListener('change', function(){
                                var box = document.getElementById(this.getAttribute('data-target'));
                                if (box) box.style.display = this.checked ? '' : 'none';
                            });
                        }
                    })();
                    </script>
                </div>

                <div class="rp-panel" style="border-color: var(--rmbz-info, #3b82f6);">
                    <h3 style="color:var(--rmbz-info, #3b82f6);">⚡ Ações de Segurança</h3>
                    <?php if (!empty($extra['reset_key'])): ?>
                        <div style="background: rgba(240, 185, 11, 0.1); border-left: 4px solid #f0b90b; padding: 15px; margin-bottom: 20px; border-radius: 4px;">
                            <h4 style="color: var(--rmbz-brand, #f0b90b); margin: 0 0 5px 0; font-size: 14px;">🔑 Chave de Recuperação Solicitada</h4>
                            <p style="color: var(--rmbz-text-secondary, #ccc); font-size: 12px; margin: 0 0 10px 0;">O artista iniciou o processo de recuperação de PIN. Copie esta chave e envie para ele via WhatsApp:</p>
                            <div style="font-size: 24px; color: var(--rmbz-text-primary, #fff); font-weight: bold; letter-spacing: 5px; background: var(--rmbz-bg-elevated, #111); padding: 10px; text-align: center; border-radius: 6px; border: 1px solid #444;"><?php echo esc_html($extra['reset_key']); ?></div>
                        </div>
                    <?php endif; ?>
                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" style="margin-bottom: 25px; border-bottom:1px solid #333; padding-bottom:25px;">
                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                        <input type="hidden" name="control_action" value="reset_pin">
                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                        <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                        
                        <label style="color:var(--rmbz-text-secondary, #ccc); font-size:12px; margin-bottom:8px; display:block; font-weight:bold;">Forçar novo PIN de Segurança (4 dígitos)</label>
                        <div style="display:flex; gap:10px;">
                            <input type="text" name="new_pin" maxlength="4" required class="onemz-input" placeholder="Ex: 1234" style="margin:0;">
                            <button type="submit" class="onemz-btn" style="background:#3b82f6; color:#fff; width:auto; padding:0 25px;">Mudar PIN</button>
                        </div>
                    </form>

                    <?php if($is_vip): ?>
                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Tem a certeza que deseja cancelar a assinatura VIP atual deste artista? Ele perderá imediatamente os acessos pagos.');">
                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                        <input type="hidden" name="control_action" value="cancel_vip">
                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                        <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                        <button type="submit" class="onemz-btn" style="background:#f59e0b; color:#fff;">Anular Assinatura VIP</button>
                    </form>
                    <?php else: ?>
                        <p style="color:var(--rmbz-text-faint, #777); font-size:13px; margin:0; text-align:center; background:var(--rmbz-bg-elevated, #111); padding:15px; border-radius:6px; border:1px dashed #444;">Este utilizador não tem uma assinatura VIP ativa.</p>
                    <?php endif; ?>
                </div>

                <?php
                // [1.6.310] Uso das ferramentas de IA hoje + revogar limite.
                if ( ! function_exists( 'rmbz_ai_usage_for' ) ) {
                    require_once dirname( __DIR__ ) . '/api/ai/ai-client.php';
                }
                $ai_usage = rmbz_ai_usage_for( $telemovel );
                $ai_any_used = false;
                foreach ( $ai_usage as $u ) { if ( $u['used'] > 0 ) { $ai_any_used = true; break; } }
                ?>
                <div class="rp-panel" style="border-color: var(--rmbz-info, #3b82f6);">
                    <h3 style="color:var(--rmbz-info, #3b82f6);">🤖 Uso do Assistente de IA (hoje)</h3>
                    <p style="color:var(--rmbz-text-muted,#aaa); font-size:13px; margin:0 0 14px; line-height:1.5;">
                        Cada ferramenta tem um limite diário (proteção de custo). Quando o artista o atinge, recebe
                        "atingiste o limite diário". Podes revogar para ele voltar a usar já. Os limites reiniciam sozinhos a cada 24h.
                    </p>
                    <table style="width:100%; border-collapse:collapse; font-size:13px;">
                        <thead>
                            <tr style="text-align:left; color:var(--rmbz-text-secondary,#ccc);">
                                <th style="padding:6px 8px;">Ferramenta</th>
                                <th style="padding:6px 8px; text-align:center;">Usado hoje</th>
                                <th style="padding:6px 8px; text-align:right;">Estado</th>
                            </tr>
                        </thead>
                        <tbody>
                        <?php foreach ( $ai_usage as $u ): $reached = $u['reached']; ?>
                            <tr style="border-top:1px solid #2a2a2a;">
                                <td style="padding:8px;"><?php echo esc_html( $u['label'] ); ?></td>
                                <td style="padding:8px; text-align:center; font-weight:600; color:<?php echo $reached ? 'var(--rmbz-danger,#ef4444)' : 'var(--rmbz-text-primary,#fff)'; ?>;">
                                    <?php echo (int) $u['used'] . ' / ' . (int) $u['max']; ?>
                                </td>
                                <td style="padding:8px; text-align:right;">
                                    <?php if ( $reached ): ?>
                                        <span style="color:var(--rmbz-danger,#ef4444); font-weight:600;">Limite atingido</span>
                                    <?php elseif ( $u['used'] > 0 ): ?>
                                        <span style="color:var(--rmbz-text-muted,#aaa);">Restam <?php echo (int) $u['remaining']; ?></span>
                                    <?php else: ?>
                                        <span style="color:var(--rmbz-text-faint,#777);">Sem uso</span>
                                    <?php endif; ?>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                        </tbody>
                    </table>
                    <?php if ( $ai_any_used ): ?>
                        <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Revogar os limites diários de IA deste artista? Ele poderá voltar a usar todas as ferramentas imediatamente.');" style="margin-top:16px;">
                            <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                            <input type="hidden" name="control_action" value="reset_ai_limits">
                            <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                            <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                            <button type="submit" class="onemz-btn" style="background:#3b82f6; color:#fff;">Revogar limites de IA</button>
                        </form>
                    <?php else: ?>
                        <p style="color:var(--rmbz-text-faint,#777); font-size:13px; margin:14px 0 0; text-align:center; background:var(--rmbz-bg-elevated,#111); padding:12px; border-radius:6px; border:1px dashed #444;">O artista ainda não usou ferramentas de IA hoje.</p>
                    <?php endif; ?>
                </div>

                <div class="rp-panel" style="border-color: var(--rmbz-danger, #ef4444); background: rgba(231,76,60,0.05);">
                    <h3 style="color:var(--rmbz-danger, #ef4444);">🗑️ Zona de Perigo (Apagar Artista)</h3>
                    <p style="color:var(--rmbz-text-muted, #aaa); font-size:13px; margin-bottom:20px; line-height:1.5;">A conta será banida e enviada para a Lixeira por 30 dias antes de ser permanentemente eliminada. Um código de segurança será enviado para o e-mail da administração para aprovar esta ação crítica.</p>
                    
                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
                        <input type="hidden" name="action" value="rmbz_admin_update_user_controls">
                        <input type="hidden" name="control_action" value="request_delete">
                        <input type="hidden" name="user_telemovel" value="<?php echo esc_attr($telemovel); ?>">
                        <?php wp_nonce_field('rmbz_user_controls_nonce'); ?>
                        <button type="submit" class="onemz-btn" style="background:#ef4444; color:#fff;">Pedir Código para Eliminar</button>
                    </form>
                </div>

            </div>
        </div>
    </div>
    <?php
}