<?php
// includes/my-account-page.php

if ( ! defined( 'ABSPATH' ) ) { exit; }

/**
 * ==========================================================================
 * 0. MOTOR AJAX DE NOTIFICAÇÕES (Ler e Limpar)
 * ==========================================================================
 */
add_action('wp_ajax_rmbz_mark_notif_read', 'rmbz_mark_notif_read_handler');
add_action('wp_ajax_nopriv_rmbz_mark_notif_read', 'rmbz_mark_notif_read_handler');
function rmbz_mark_notif_read_handler() {
    // [SEC-MA1] Endpoint era totalmente aberto: sem nonce, sem auth, sem
    // ownership. Qualquer pessoa podia marcar qualquer notificação como lida
    // por simples enumeração de IDs. Adicionado:
    //   - nonce (rmbz_notif_nonce, gerado nos templates do dashboard)
    //   - auth via sessão custom
    //   - ownership: a notificação tem de pertencer ao email do utilizador
    if ( ! check_ajax_referer('rmbz_notif_nonce', 'nonce', false) ) {
        wp_send_json_error(['message' => 'Falha de segurança.'], 403);
    }
    if ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) {
        wp_send_json_error(['message' => 'Sessão expirada.'], 401);
    }

    global $wpdb;
    $id        = isset($_POST['notif_id']) ? absint($_POST['notif_id']) : 0;
    $telemovel = rmbz_get_current_user_telemovel();
    if ( $id <= 0 ) wp_send_json_error(['message' => 'ID inválido.']);

    // Resolver o email do utilizador autenticado para validar ownership.
    $user_email = $wpdb->get_var( $wpdb->prepare(
        "SELECT user_email FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s",
        $telemovel
    ) );
    if ( ! $user_email ) wp_send_json_error(['message' => 'Conta não encontrada.'], 404);

    // Update só se a notificação for mesmo deste utilizador.
    $wpdb->update(
        $wpdb->prefix . 'rmbz_email_logs',
        ['is_read' => 1],
        ['id' => $id, 'recipient_email' => $user_email],
        ['%d'], ['%d', '%s']
    );
    wp_send_json_success();
}

add_action('wp_ajax_rmbz_clear_notifs', 'rmbz_clear_notifs_handler');
// [1.5.208] Sem nopriv, limpar notificações falhava para users com sessão telefone.
add_action('wp_ajax_nopriv_rmbz_clear_notifs', 'rmbz_clear_notifs_handler');
// NOVO: APAGAR O POP-UP DIRETO DA ADMINISTRAÇÃO
add_action('wp_ajax_rmbz_dismiss_admin_popup', 'rmbz_dismiss_admin_popup_handler');
add_action('wp_ajax_nopriv_rmbz_dismiss_admin_popup', 'rmbz_dismiss_admin_popup_handler');
function rmbz_dismiss_admin_popup_handler() {
    // [SEC-MA2] Era totalmente aberto e aceitava telemovel arbitrário por POST
    // — qualquer um podia dispensar o popup do admin de qualquer artista.
    // Agora: usa SEMPRE o telemóvel da sessão autenticada, ignora POST.
    if ( ! check_ajax_referer('rmbz_notif_nonce', 'nonce', false) ) {
        wp_send_json_error(['message' => 'Falha de segurança.'], 403);
    }
    if ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) {
        wp_send_json_error(['message' => 'Sessão expirada.'], 401);
    }

    global $wpdb;
    $telemovel = rmbz_get_current_user_telemovel(); // SEMPRE da sessão.
    $table = $wpdb->prefix . 'rmbz_wallets';

    $wallet = $wpdb->get_row($wpdb->prepare("SELECT extra_data FROM {$table} WHERE user_telemovel = %s", $telemovel));
    if ($wallet) {
        $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, ['extra_data' => wp_json_encode($extra)], ['user_telemovel' => $telemovel]);
        }
    }
    wp_send_json_success();
}

// NOVO: HEARTBEAT (SINAL DE VIDA) DO ARTISTA PARA SABER SE ESTÁ ONLINE
add_action('wp_ajax_rmbz_artist_heartbeat', 'rmbz_artist_heartbeat_handler');
add_action('wp_ajax_nopriv_rmbz_artist_heartbeat', 'rmbz_artist_heartbeat_handler');
function rmbz_artist_heartbeat_handler() {
    // [SEC-MA3] Adicionado nonce. Sem nonce, qualquer site externo conseguia
    // forjar o heartbeat de um utilizador via CSRF, mantendo "online" alguém
    // que está mesmo desconectado.
    if ( ! check_ajax_referer('rmbz_notif_nonce', 'nonce', false) ) wp_die();
    if ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) wp_die();
    global $wpdb;
    $telemovel = rmbz_get_current_user_telemovel();
    $table = $wpdb->prefix . 'rmbz_wallets';
    $wallet = $wpdb->get_row($wpdb->prepare("SELECT extra_data FROM {$table} WHERE user_telemovel = %s", $telemovel));
    if ($wallet) {
        $extra = !empty($wallet->extra_data) ? json_decode($wallet->extra_data, true) : [];
        if ( ! is_array($extra) ) $extra = [];
        $extra['last_seen'] = time();
        $wpdb->update($table, ['extra_data' => wp_json_encode($extra)], ['user_telemovel' => $telemovel]);
    }
    wp_send_json_success();
}

add_action('wp_ajax_nopriv_rmbz_clear_notifs', 'rmbz_clear_notifs_handler');
function rmbz_clear_notifs_handler() {
    // [SEC-MA4] Era completamente aberto e aceitava email arbitrário por POST
    // — qualquer um conseguia limpar todas as notificações de qualquer email.
    // Agora: nonce + auth + usa o email da conta da sessão.
    if ( ! check_ajax_referer('rmbz_notif_nonce', 'nonce', false) ) {
        wp_send_json_error(['message' => 'Falha de segurança.'], 403);
    }
    if ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) {
        wp_send_json_error(['message' => 'Sessão expirada.'], 401);
    }

    global $wpdb;
    $telemovel = rmbz_get_current_user_telemovel();
    $email = $wpdb->get_var( $wpdb->prepare(
        "SELECT user_email FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s",
        $telemovel
    ) );
    if ( ! $email ) wp_send_json_error(['message' => 'Conta não encontrada.'], 404);

    $wpdb->update($wpdb->prefix . 'rmbz_email_logs', ['is_cleared' => 1], ['recipient_email' => $email]);
    wp_send_json_success();
}

/**
 * ==========================================================================
 * 0. FUNÇÃO DE REDIRECIONAMENTO SEGURO
 * ==========================================================================
 */
if ( ! function_exists('rmbz_safe_redirect') ) {
    function rmbz_safe_redirect( $url ) {
        if ( ! headers_sent() ) {
            wp_redirect( $url );
        } else {
            echo '<script>window.location.href="' . esc_url($url) . '";</script>';
            echo '<noscript><meta http-equiv="refresh" content="0;url=' . esc_url($url) . '" /></noscript>';
        }
        exit;
    }
}

function rmbz_iniciar_sessao_segura() {
    if ( session_status() === PHP_SESSION_NONE && ! headers_sent() ) {
        session_start();
    }
}
add_action( 'plugins_loaded', 'rmbz_iniciar_sessao_segura', 0 );

$distro_path = RMBZ_PLUGIN_PATH . 'includes/distribution/distribution-main.php';
if ( file_exists( $distro_path ) ) { require_once $distro_path; }
require_once RMBZ_PLUGIN_PATH . 'includes/submission-corrections.php';

if ( ! defined( 'RMBZ_MIN_WITHDRAWAL' ) ) { define( 'RMBZ_MIN_WITHDRAWAL', 50.00 ); }

function rmbz_registrar_my_account_shortcode() { add_shortcode( 'rmbz_minha_conta', 'rmbz_exibir_my_account_page' ); }
add_action( 'init', 'rmbz_registrar_my_account_shortcode' );

/**
 * ==========================================================================
 * 1. PROCESSADORES DE AÇÕES (HANDLERS)
 * ==========================================================================
 */
function rmbz_handle_pin_login() {
    if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'rmbz_pin_login_nonce' ) ) wp_die('Falha de segurança!');

    if ( session_status() === PHP_SESSION_NONE && ! headers_sent() ) { session_start(); }

    $telemovel_input = isset($_POST['telemovel_input']) ? sanitize_text_field( wp_unslash($_POST['telemovel_input']) ) : '';
    $user_telemovel = ''; 
    if ( ! empty( $telemovel_input ) ) {
        $clean_input = preg_replace('/\s+/', '', $telemovel_input);
        $user_telemovel = (strpos((string) ($clean_input ?? ''), '+258') === 0) ? $clean_input : '+258' . $clean_input;
    }
    $user_pin = isset($_POST['pin']) ? sanitize_text_field( wp_unslash($_POST['pin']) ) : '';

    // [SEC-AUTH3] Rate limit anti brute-force do PIN.
    // Limite por (IP + telemovel) — mais granular que IP só, e mais protector
    // que telemovel só (não impede um atacante de tentar muitos telemóveis).
    if ( function_exists('rmbz_rate_limit') && $user_telemovel ) {
        $ip = isset($_SERVER['REMOTE_ADDR']) ? (string) $_SERVER['REMOTE_ADDR'] : 'unknown';
        $rl_key = 'login_' . md5($ip . '|' . $user_telemovel);
        if ( ! rmbz_rate_limit( $rl_key, 8 ) ) { // 8 tentativas/min
            $_SESSION['rmbz_login_error'] = 'Demasiadas tentativas. Aguarde 1 minuto.';
            $url = wp_get_referer() ? wp_get_referer() : home_url('/minha-conta/');
            rmbz_safe_redirect( $url );
        }
    }

    global $wpdb;
    $wallets_table = $wpdb->prefix . 'rmbz_wallets';
    $is_banned = $wpdb->get_var( $wpdb->prepare( "SELECT is_banned FROM {$wallets_table} WHERE user_telemovel = %s", $user_telemovel ) );
    
    if ( $is_banned == 1 ) {
        $_SESSION['rmbz_login_error'] = 'Conta bloqueada pela administração.';
    } elseif ( function_exists('rmbz_verify_user_pin') && rmbz_verify_user_pin($user_telemovel, $user_pin) ) {
        rmbz_handle_login($user_telemovel);
    } else {
        // [1.5.412] Não é conta de artista (ou o PIN de artista falhou) —
        // reconhece a EQUIPA DE PRODUÇÃO: telefone do perfil criado em
        // "Equipas & Pessoas" + PIN definido pelo admin → Portal da Equipa.
        $rmbz_tm = function_exists('rmbz_team_find_by_phone') ? rmbz_team_find_by_phone( $user_telemovel ) : null;
        if ( $rmbz_tm && function_exists('rmbz_team_verify_pin') && rmbz_team_verify_pin( $rmbz_tm, $user_pin )
             && function_exists('rmbz_team_portal_login') ) {
            rmbz_team_portal_login( $rmbz_tm );
        } else {
            $_SESSION['rmbz_login_error'] = 'Número ou PIN incorreto.';
        }
    }
    
    $url = wp_get_referer() ? wp_get_referer() : home_url('/minha-conta/');
    rmbz_safe_redirect( $url ); 
}
add_action( 'admin_post_nopriv_rmbz_pin_login', 'rmbz_handle_pin_login' );
add_action( 'admin_post_rmbz_pin_login', 'rmbz_handle_pin_login' );

function rmbz_handle_logout_action() {
    // [SEC-MA5] Antes não tinha nonce — qualquer site podia forçar logout do
    // utilizador via simples <img src=...>. Agora exige nonce.
    if ( ! isset($_GET['_wpnonce']) || ! wp_verify_nonce($_GET['_wpnonce'], 'rmbz_logout_nonce') ) {
        // Falha silenciosa: apenas redireciona sem ação.
        rmbz_safe_redirect( home_url('/minha-conta/') );
    }
    if ( function_exists('rmbz_handle_logout') ) rmbz_handle_logout();
    rmbz_safe_redirect( home_url('/minha-conta/') ); 
}
add_action( 'admin_post_nopriv_rmbz_logout', 'rmbz_handle_logout_action' );
add_action( 'admin_post_rmbz_logout', 'rmbz_handle_logout_action' );

/**
 * [FEAT 1.5.20] Helpers de validação e gestão de contactos guardados
 * para o modal de levantamento.
 */

/**
 * Normaliza um número de telefone moçambicano para o formato 9 dígitos
 * (sem +258, sem espaços, sem traços). Devolve string vazia se inválido.
 */
function rmbz_normalize_phone_mz( $raw ) {
    if ( ! is_string($raw) ) return '';
    $clean = preg_replace('/\D+/', '', $raw); // só dígitos
    // Remover prefixo país +258 / 00258 se presente
    if ( strlen($clean) === 12 && substr($clean, 0, 3) === '258' ) {
        $clean = substr($clean, 3);
    }
    if ( strlen($clean) === 11 && substr($clean, 0, 4) === '0258' ) {
        $clean = substr($clean, 4);
    }
    // Remover 0 inicial se ficou (formato local antigo)
    if ( strlen($clean) === 10 && substr($clean, 0, 1) === '0' ) {
        $clean = substr($clean, 1);
    }
    if ( strlen($clean) !== 9 ) return '';
    return $clean;
}

/**
 * Devolve o operador de um número moçambicano: 'mpesa', 'emola' ou ''.
 * Regras 2026:
 *   - M-Pesa (Vodacom): começa com 84 ou 85
 *   - E-Mola (Movitel): começa com 86 ou 87
 *   - Tmcel: 82 ou 83 (não suportado para levantamentos por agora)
 */
function rmbz_phone_operator_mz( $normalized_phone ) {
    if ( strlen($normalized_phone) !== 9 ) return '';
    $prefix = substr($normalized_phone, 0, 2);
    if ( in_array($prefix, ['84','85'], true) ) return 'mpesa';
    if ( in_array($prefix, ['86','87'], true) ) return 'emola';
    return '';
}

/**
 * Devolve a lista de contactos de pagamento guardados de um utilizador
 * (em wallets.extra_data → 'saved_payouts'). Cada item: {method, number, label}.
 */
function rmbz_get_saved_payouts( $user_telemovel ) {
    global $wpdb;
    $row = $wpdb->get_var( $wpdb->prepare(
        "SELECT extra_data FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s",
        $user_telemovel
    ) );
    if ( empty($row) ) return [];
    $data = json_decode($row, true);
    if ( ! is_array($data) || empty($data['saved_payouts']) || ! is_array($data['saved_payouts']) ) return [];
    // Sanity: filtrar entradas mal formadas
    return array_values( array_filter( $data['saved_payouts'], function($p) {
        return is_array($p) && ! empty($p['method']) && ! empty($p['number']);
    } ) );
}

/**
 * Adiciona um contacto à lista de contactos guardados (idempotente — não
 * duplica se o número já existe). Mantém os 5 mais recentes.
 */
function rmbz_save_payout_contact( $user_telemovel, $method, $number, $label = '' ) {
    global $wpdb;
    $number = rmbz_normalize_phone_mz( $number );
    if ( empty($number) || empty($method) ) return false;

    $row = $wpdb->get_var( $wpdb->prepare(
        "SELECT extra_data FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s",
        $user_telemovel
    ) );
    $data = ! empty($row) ? json_decode($row, true) : [];
    if ( ! is_array($data) ) $data = [];
    if ( empty($data['saved_payouts']) || ! is_array($data['saved_payouts']) ) {
        $data['saved_payouts'] = [];
    }

    // Idempotência: se já existe (mesmo método + número), só atualiza o label se for novo
    foreach ( $data['saved_payouts'] as &$existing ) {
        if ( $existing['method'] === $method && $existing['number'] === $number ) {
            if ( ! empty($label) && empty($existing['label']) ) {
                $existing['label'] = $label;
            }
            unset($existing);
            $wpdb->update(
                $wpdb->prefix . 'rmbz_wallets',
                [ 'extra_data' => wp_json_encode($data) ],
                [ 'user_telemovel' => $user_telemovel ]
            );
            return true;
        }
    }
    unset($existing);

    // Não existe — adicionar à frente
    array_unshift( $data['saved_payouts'], [
        'method' => $method,
        'number' => $number,
        'label'  => $label,
        'added'  => current_time('mysql'),
    ] );

    // Manter só os 5 mais recentes
    if ( count($data['saved_payouts']) > 5 ) {
        $data['saved_payouts'] = array_slice( $data['saved_payouts'], 0, 5 );
    }

    $wpdb->update(
        $wpdb->prefix . 'rmbz_wallets',
        [ 'extra_data' => wp_json_encode($data) ],
        [ 'user_telemovel' => $user_telemovel ]
    );
    return true;
}

function rmbz_handle_withdrawal_request() {
    $url = wp_get_referer() ? wp_get_referer() : home_url('/minha-conta/');
    if ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) wp_die('Não autorizado.');
    if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'rmbz_withdrawal_nonce' ) ) wp_die('Segurança falhou.');

    if ( session_status() === PHP_SESSION_NONE && ! headers_sent() ) { session_start(); }

    global $wpdb;
    $user_telemovel = rmbz_get_current_user_telemovel();

    // Defesa no servidor: a interface não é a fronteira de segurança. Respeita
    // bloqueio individual (incluindo motivo/prazo) e suspensão global antes de
    // reservar o lock ou tocar em qualquer saldo.
    $withdrawal_block = function_exists( 'rmbz_service_blocked_message' )
        ? rmbz_service_blocked_message( $user_telemovel, 'block_withdrawals', 'withdrawals' )
        : null;
    if ( $withdrawal_block !== null ) {
        $_SESSION['rmbz_withdrawal_notice'] = [ 'error', $withdrawal_block ];
        rmbz_safe_redirect( $url ); exit;
    }

    // [BUG-WD3] Lock pessimista por utilizador para evitar duplo-clique resultar
    // em duplo débito + duplo pedido pendente. Usa GET_LOCK do MySQL (5s).
    $lock_name = 'rmbz_wd_' . md5($user_telemovel);
    $got_lock = (int) $wpdb->get_var( $wpdb->prepare("SELECT GET_LOCK(%s, 5)", $lock_name) );
    if ( ! $got_lock ) {
        $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Outro pedido seu já está a ser processado. Aguarde uns segundos.'];
        rmbz_safe_redirect( $url ); exit;
    }

    try {
        // Bloqueio: apenas 1 pedido pendente em simultâneo (qualquer fonte).
        $has_pending = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}rmbz_withdrawal_requests WHERE user_telemovel = %s AND status = 'pendente'", $user_telemovel));
        if ( $has_pending ) {
            $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Já possui um pedido de levantamento pendente. Aguarde a conclusão antes de fazer um novo pedido.'];
            $wpdb->query( $wpdb->prepare("SELECT RELEASE_LOCK(%s)", $lock_name) );
            rmbz_safe_redirect( $url ); exit;
        }

        // [FEAT 1.5.15] Nova lógica: fonte dos fundos (wallet = carteira MT,
        // royalties = ganhos em USD convertidos para MT na altura do pedido).
        $source = isset($_POST['rmbz_withdrawal_source']) ? sanitize_key( $_POST['rmbz_withdrawal_source'] ) : 'wallet';
        if ( ! in_array($source, ['wallet','royalties'], true) ) $source = 'wallet';

        $payment_method  = isset($_POST['rmbz_payment_method'])  ? sanitize_text_field( wp_unslash($_POST['rmbz_payment_method']) )  : '';
        $payment_details = isset($_POST['rmbz_payment_details']) ? sanitize_text_field( wp_unslash($_POST['rmbz_payment_details']) ) : '';

        // Validar lista de métodos de pagamento
        $allowed_methods = ['mpesa', 'emola', 'mkesh', 'banco', 'M-Pesa', 'eMola', 'E-Mola', 'Mkesh', 'Banco'];
        if ( $payment_method !== '' && ! in_array($payment_method, $allowed_methods, true) ) {
            $payment_method = sanitize_text_field($payment_method);
        }

        if ( empty($payment_method) || empty($payment_details) ) {
            $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Indique o método e os dados de pagamento.'];
            $wpdb->query( $wpdb->prepare("SELECT RELEASE_LOCK(%s)", $lock_name) );
            rmbz_safe_redirect( $url ); exit;
        }

        // [FEAT 1.5.20] Validar que o número de telefone tem prefixo correto
        // para o método escolhido. M-Pesa só aceita 84/85 (Vodacom), E-Mola
        // só aceita 86/87 (Movitel). Se o prefixo não bate, o pagamento
        // falha sempre na operadora — melhor falhar aqui que perder tempo.
        $normalized_phone = rmbz_normalize_phone_mz( $payment_details );
        if ( empty($normalized_phone) ) {
            $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Número de telefone inválido. Deve ter 9 dígitos (ex: 841234567).'];
            $wpdb->query( $wpdb->prepare("SELECT RELEASE_LOCK(%s)", $lock_name) );
            rmbz_safe_redirect( $url ); exit;
        }
        $detected_op = rmbz_phone_operator_mz( $normalized_phone );
        $method_lower = strtolower( str_replace(['-',' '], '', $payment_method) ); // "M-Pesa" → "mpesa"
        if ( in_array($method_lower, ['mpesa','m-pesa'], true) && $detected_op !== 'mpesa' ) {
            $_SESSION['rmbz_withdrawal_notice'] = ['error', 'O número ' . $normalized_phone . ' não é M-Pesa. M-Pesa aceita números começados por 84 ou 85 (Vodacom).'];
            $wpdb->query( $wpdb->prepare("SELECT RELEASE_LOCK(%s)", $lock_name) );
            rmbz_safe_redirect( $url ); exit;
        }
        if ( in_array($method_lower, ['emola','e-mola'], true) && $detected_op !== 'emola' ) {
            $_SESSION['rmbz_withdrawal_notice'] = ['error', 'O número ' . $normalized_phone . ' não é E-Mola. E-Mola aceita números começados por 86 ou 87 (Movitel).'];
            $wpdb->query( $wpdb->prepare("SELECT RELEASE_LOCK(%s)", $lock_name) );
            rmbz_safe_redirect( $url ); exit;
        }
        // Substituir payment_details pelo número normalizado para guardar consistente
        $payment_details = $normalized_phone;

        if ( $source === 'wallet' ) {
            // -----------------------------------------------------------------
            // FONTE: CARTEIRA (MT)
            // Fluxo clássico: valida saldo MT, debita, cria request.
            // -----------------------------------------------------------------
            $amount = isset($_POST['rmbz_withdrawal_amount'])
                ? (float) str_replace(',', '.', wp_unslash($_POST['rmbz_withdrawal_amount']))
                : 0;

            $available_balance = function_exists('rmbz_get_withdrawable_balance')
                ? rmbz_get_withdrawable_balance($user_telemovel)
                : 0;

            if ( $amount <= 0 ) {
                $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Valor inválido.'];
            } elseif ( $amount < RMBZ_MIN_WITHDRAWAL ) {
                $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Mínimo de ' . RMBZ_MIN_WITHDRAWAL . ' MT.'];
            } elseif ( $amount > $available_balance ) {
                $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Saldo insuficiente na Carteira.'];
            } else {
                $details = 'Levantamento (' . $payment_method . ': ' . $payment_details . ')';
                $result = rmbz_update_wallet_balance($user_telemovel, -$amount, 'withdrawal_request', null, $details);

                if ( $result['success'] ) {
                    // [1.6.1] Capturar metadados de origem (canal/IP/dispositivo)
                    $rmbz_origin = function_exists('rmbz_origin_capture')
                        ? rmbz_origin_capture('web')
                        : ['channel'=>'web','ip'=>null,'user_agent'=>null,'device_id'=>null,'app_version'=>null];

                    $wpdb->insert( $wpdb->prefix . 'rmbz_withdrawal_requests',
                        [
                            'user_telemovel'      => $user_telemovel,
                            'amount'              => $amount,
                            'source'              => 'wallet',
                            'status'              => 'pendente',
                            'payment_method'      => $payment_method,
                            'payment_details'     => $payment_details,
                            'request_date'        => current_time('mysql', 1),
                            'origin_channel'      => $rmbz_origin['channel'],
                            'origin_ip'           => $rmbz_origin['ip'],
                            'origin_user_agent'   => $rmbz_origin['user_agent'],
                            'origin_device_id'    => $rmbz_origin['device_id'],
                            'origin_app_version'  => $rmbz_origin['app_version'],
                        ],
                        [ '%s', '%f', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ]
                    );
                    $_SESSION['rmbz_withdrawal_notice'] = ['success', 'Pedido enviado com sucesso.'];
                    // [FEAT 1.5.20] Guardar contacto para sugestão futura
                    rmbz_save_payout_contact( $user_telemovel, $payment_method, $payment_details );
                    // [FEAT 1.5.22] Audit log da criação do pedido
                    if ( function_exists('rmbz_wg_log') ) {
                        rmbz_wg_log( $wpdb->insert_id, 'created',
                            sprintf('Pedido criado pelo artista (canal=%s). Fonte=Carteira, Valor=%s MT, Para=%s:%s',
                                $rmbz_origin['channel'],
                                number_format($amount,2,',','.'), $payment_method, $payment_details
                            )
                        );
                    }
                } else {
                    $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Erro: ' . $result['error']];
                }
            }

        } else {
            // -----------------------------------------------------------------
            // FONTE: ROYALTIES (USD → MT)
            // Fluxo novo: o artista indicou valor em USD. Convertemos USD→MT
            // usando rmbz_secure_transfer_usd_to_mt() (que é atómica: debita
            // USD e credita MT na mesma transação SQL). Depois criamos o
            // request em MT como se fosse um levantamento normal da carteira,
            // mas marcado com source='royalties' para rastreabilidade.
            // Vantagens: reusa código testado, mantém atomicidade, e se o
            // admin rejeitar o levantamento o dinheiro volta para a carteira
            // (em MT — não reverte a conversão, o que é aceitável porque o
            // câmbio já está fixo).
            // -----------------------------------------------------------------
            $amount_usd = isset($_POST['rmbz_withdrawal_amount_usd'])
                ? (float) str_replace(',', '.', wp_unslash($_POST['rmbz_withdrawal_amount_usd']))
                : 0;

            $exchange_rate = function_exists('rmbz_get_exchange_rate')
                ? rmbz_get_exchange_rate()
                : 63.50;
            $min_usd = max( 0.01, round( RMBZ_MIN_WITHDRAWAL / $exchange_rate, 2 ) );

            // Calcular quanto USD está realmente disponível
            $distro_balance_usd = 0.0;
            $table_stats = $wpdb->prefix . 'rmbz_distro_stats';
            if ( $wpdb->get_var("SHOW TABLES LIKE '$table_stats'") === $table_stats ) {
                $row = $wpdb->get_row( $wpdb->prepare(
                    "SELECT total_earnings FROM {$table_stats} WHERE artist_telemovel = %s",
                    $user_telemovel
                ) );
                $distro_balance_usd = $row ? (float) $row->total_earnings : 0.0;
            }

            if ( $amount_usd <= 0 ) {
                $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Valor inválido.'];
            } elseif ( $amount_usd < $min_usd ) {
                $_SESSION['rmbz_withdrawal_notice'] = ['error', sprintf('Mínimo de $%.2f USD (equivalente a %s MT).', $min_usd, number_format(RMBZ_MIN_WITHDRAWAL, 2, ',', '.'))];
            } elseif ( round($amount_usd, 4) > round($distro_balance_usd, 4) ) {
                $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Saldo de Royalties insuficiente.'];
            } elseif ( ! function_exists('rmbz_secure_transfer_usd_to_mt') ) {
                $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Módulo de conversão não disponível. Contacte o suporte.'];
            } else {
                // Converter USD → MT (atómica)
                $transfer = rmbz_secure_transfer_usd_to_mt( $user_telemovel, $amount_usd );
                if ( ! $transfer['success'] ) {
                    $_SESSION['rmbz_withdrawal_notice'] = ['error', 'Erro na conversão: ' . $transfer['message']];
                } else {
                    // Agora debitar o MT convertido + criar o request
                    $amount_mt = round( $amount_usd * $exchange_rate, 2 );

                    $details = sprintf(
                        'Levantamento de Royalties (%s: %s) — $%.2f USD convertidos a %.2f = %.2f MT',
                        $payment_method, $payment_details, $amount_usd, $exchange_rate, $amount_mt
                    );

                    $debit = rmbz_update_wallet_balance(
                        $user_telemovel, -$amount_mt, 'withdrawal_request', null, $details
                    );

                    if ( $debit['success'] ) {
                        // [1.6.1] Capturar metadados de origem (canal/IP/dispositivo)
                        $rmbz_origin = function_exists('rmbz_origin_capture')
                            ? rmbz_origin_capture('web')
                            : ['channel'=>'web','ip'=>null,'user_agent'=>null,'device_id'=>null,'app_version'=>null];

                        $wpdb->insert( $wpdb->prefix . 'rmbz_withdrawal_requests',
                            [
                                'user_telemovel'      => $user_telemovel,
                                'amount'              => $amount_mt,
                                'source'              => 'royalties',
                                'exchange_rate'       => $exchange_rate,
                                'status'              => 'pendente',
                                'payment_method'      => $payment_method,
                                'payment_details'     => $payment_details,
                                'request_date'        => current_time('mysql', 1),
                                'origin_channel'      => $rmbz_origin['channel'],
                                'origin_ip'           => $rmbz_origin['ip'],
                                'origin_user_agent'   => $rmbz_origin['user_agent'],
                                'origin_device_id'    => $rmbz_origin['device_id'],
                                'origin_app_version'  => $rmbz_origin['app_version'],
                            ],
                            [ '%s', '%f', '%s', '%f', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ]
                        );
                        $_SESSION['rmbz_withdrawal_notice'] = [
                            'success',
                            sprintf('Pedido enviado! $%.2f USD → %s MT a pagamento.', $amount_usd, number_format($amount_mt, 2, ',', '.'))
                        ];
                        // [FEAT 1.5.20] Guardar contacto para sugestão futura
                        rmbz_save_payout_contact( $user_telemovel, $payment_method, $payment_details );
                        // [FEAT 1.5.22] Audit log da criação do pedido
                        if ( function_exists('rmbz_wg_log') ) {
                            rmbz_wg_log( $wpdb->insert_id, 'created',
                                sprintf('Pedido criado pelo artista (canal=%s). Fonte=Royalties, $%.2f USD → %s MT, Para=%s:%s',
                                    $rmbz_origin['channel'],
                                    $amount_usd, number_format($amount_mt,2,',','.'), $payment_method, $payment_details
                                )
                            );
                        }
                    } else {
                        // Caso muito raro: conversão USD→MT correu, mas falhou
                        // o débito. O dinheiro ficou na carteira. Avisar claramente.
                        $_SESSION['rmbz_withdrawal_notice'] = [
                            'error',
                            'Conversão USD→MT realizada (' . number_format($amount_mt, 2, ',', '.') . ' MT creditados na carteira), mas falhou criar pedido: ' . $debit['error'] . '. Por favor, refaça o pedido a partir da Carteira.'
                        ];
                    }
                }
            }
        }
    } finally {
        $wpdb->query( $wpdb->prepare("SELECT RELEASE_LOCK(%s)", $lock_name) );
    }
    rmbz_safe_redirect( $url ); 
}
add_action( 'admin_post_rmbz_request_withdrawal', 'rmbz_handle_withdrawal_request' );
add_action( 'admin_post_nopriv_rmbz_request_withdrawal', 'rmbz_handle_withdrawal_request' );

function rmbz_exibir_my_account_page() {
    nocache_headers();
    ob_start();
    // [1.5.412] Sessão da EQUIPA DE PRODUÇÃO tem prioridade: mostra o Portal
    // da Equipa (a pessoa entrou com o telefone do perfil + PIN da equipa).
    if ( function_exists('rmbz_team_portal_current') && rmbz_team_portal_current() ) {
        rmbz_team_portal_render();
    } elseif ( ! function_exists('rmbz_is_user_logged_in') || ! rmbz_is_user_logged_in() ) {
        rmbz_render_login_view();
    } else {
        // [1.5.414] Painel VIP Desktop (Material 3) — opt-in, só para VIP.
        $rmbz_tel = function_exists('rmbz_get_current_user_telemovel') ? rmbz_get_current_user_telemovel() : '';
        if ( function_exists('rmbz_vip_render_dashboard') && rmbz_vip_is_active( $rmbz_tel ) && rmbz_vip_layout_on( $rmbz_tel ) ) {
            // O primeiro depósito obrigatório tem prioridade também no layout
            // VIP e no estúdio de distribuição.
            if ( function_exists('rmbz_first_deposit_gate_block_if_needed') && rmbz_first_deposit_gate_block_if_needed() ) {
                // O helper já renderizou o estado de pagamento pendente.
            } else {
                // [1.5.419] ESTÚDIO DE DISTRIBUIÇÃO em ecrã inteiro DENTRO da
                // minha-conta (takeover): sem sair do painel, o módulo de
                // distribuição abre full-screen com "← Voltar ao painel".
                if ( isset( $_GET['distro_action'] ) && function_exists('rmbz_vip_render_distro_studio') ) {
                    rmbz_vip_render_distro_studio( $rmbz_tel );
                } else {
                    rmbz_vip_render_dashboard( $rmbz_tel );
                }
            }
        } else {
            // VIP que ainda não ligou o painel novo vê o convite no topo.
            if ( function_exists('rmbz_vip_optin_banner') && rmbz_vip_is_active( $rmbz_tel ) ) {
                rmbz_vip_optin_banner();
            }
            rmbz_render_dashboard_view();
            rmbz_render_coupon_celebrate_modal();
        }
    }
    return ob_get_clean();
}

/**
 * [1.5.298] Modal de celebração após resgate de cupão — parabéns + benefícios
 * (e destaque para a IA). Lê o que o handler guardou em sessão e abre sozinho.
 */
function rmbz_render_coupon_celebrate_modal() {
    if ( empty( $_SESSION['rmbz_coupon_celebrate'] ) || ! is_array( $_SESSION['rmbz_coupon_celebrate'] ) ) {
        return;
    }
    $c = $_SESSION['rmbz_coupon_celebrate'];
    unset( $_SESSION['rmbz_coupon_celebrate'] ); // mostrar uma única vez

    $title    = isset( $c['title'] ) ? (string) $c['title'] : 'Parabéns!';
    $message  = isset( $c['message'] ) ? (string) $c['message'] : '';
    $has_ai   = ! empty( $c['has_ai'] );
    $benefits = ( isset( $c['benefits'] ) && is_array( $c['benefits'] ) ) ? $c['benefits'] : [];
    $gold = '#f0b90b';
    ?>
    <div id="rmbz-coupon-modal" style="position:fixed; inset:0; z-index:99999; display:flex; align-items:center; justify-content:center; background:rgba(0,0,0,0.7); padding:20px;">
        <div style="background:#161616; color:#fff; border:1px solid rgba(240,185,11,0.4); border-radius:20px; max-width:420px; width:100%; padding:28px 24px; text-align:center; box-shadow:0 20px 60px rgba(0,0,0,0.6); font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
            <div style="width:64px; height:64px; margin:0 auto 14px; border-radius:50%; background:linear-gradient(135deg,#daa520,<?php echo esc_attr($gold); ?>); display:flex; align-items:center; justify-content:center; font-size:32px;">🎉</div>
            <h2 style="margin:0 0 6px; font-size:22px; font-weight:800; color:#fff;"><?php echo esc_html( $title ); ?></h2>
            <?php if ( $message ): ?>
                <p style="margin:0 0 18px; font-size:14px; color:#bbb;"><?php echo esc_html( $message ); ?></p>
            <?php endif; ?>

            <?php if ( ! empty( $benefits ) ): ?>
                <div style="text-align:left; margin-bottom:18px;">
                    <p style="font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.5px; color:#888; margin:0 0 8px;">O que ganhaste</p>
                    <?php foreach ( $benefits as $b ):
                        $icon = isset($b['icon']) ? (string)$b['icon'] : '✅';
                        $text = isset($b['text']) ? (string)$b['text'] : '';
                        $is_ai_row = ( $icon === '🤖' );
                    ?>
                        <div style="display:flex; align-items:center; gap:12px; padding:11px 13px; margin-bottom:6px; border-radius:12px; background:<?php echo $is_ai_row ? 'rgba(240,185,11,0.12)' : '#1f1f1f'; ?>; <?php echo $is_ai_row ? 'border:1px solid rgba(240,185,11,0.4);' : ''; ?>">
                            <span style="font-size:18px;"><?php echo esc_html( $icon ); ?></span>
                            <span style="font-size:13px; font-weight:<?php echo $is_ai_row ? '700' : '500'; ?>; color:<?php echo $is_ai_row ? esc_attr($gold) : '#eee'; ?>;"><?php echo esc_html( $text ); ?></span>
                        </div>
                    <?php endforeach; ?>
                </div>
            <?php endif; ?>

            <?php if ( $has_ai ): ?>
                <p style="font-size:12px; color:<?php echo esc_attr($gold); ?>; margin:0 0 16px;">Abre o teu painel e usa o Assistente de IA para alavancar a tua música. 🚀</p>
            <?php endif; ?>

            <button type="button" onclick="document.getElementById('rmbz-coupon-modal').remove();" style="width:100%; padding:13px; border:none; border-radius:14px; background:linear-gradient(90deg,#f0b90b,#d4a000); color:#000; font-size:14px; font-weight:800; cursor:pointer;">Boa! 🎉</button>
        </div>
    </div>
    <?php
}

/**
 * ==========================================================================
 * 2. VIEW: LOGIN E REGISTO COM TEMA MODERNO E ANTI-BOT
 * ==========================================================================
 */
function rmbz_render_login_view() {
    $settings = get_option('rmbz_payment_settings');
    // [1.5.129] Mostra valor da inscrição inicial. Fallback para legacy.
    $sub_price = (float) get_option('rmbz_first_deposit_min', 0);
    if ( $sub_price <= 0 ) {
        $sub_price = (float) get_option('rmbz_sub_price', 1500);
    }
    $mpesa_number = isset($settings['rmbz_mpesa_number']) ? $settings['rmbz_mpesa_number'] : '';
    $emola_number = isset($settings['rmbz_emola_number']) ? $settings['rmbz_emola_number'] : '';

    $num1 = rand(1, 9); $num2 = rand(1, 9);
    $hash = md5(($num1 + $num2) . '1mz_bot_secret');

    // [DS 1.5.43] Página de login refeita com design system.
    //
    // Componentes usados:
    //   .rmbz-auth-wrapper / .rmbz-auth-card (§11)
    //   .rmbz-tabs.rmbz-tabs--auth (§4.5)
    //   .rmbz-auth-section (§11)
    //   .rmbz-radio-group + .rmbz-radio-pill (§6.5)
    //   rmbz_field() / rmbz_btn() / rmbz_alert() / rmbz_modal() (helpers PHP)
    //
    // Contratos do servidor PRESERVADOS (4 forms, 4 nonces, 4 actions):
    //   * rmbz_pin_login           (rmbz_pin_login_nonce)
    //   * rmbz_verify_recovery     (rmbz_recovery_nonce)
    //   * rmbz_execute_reset       (rmbz_execute_reset_nonce)
    //   * onemz_process_registration (onemz_registration_nonce)
    //
    // Anti-bot: $num1+$num2 hash secret '1mz_bot_secret' — intacto.
    // Tabs JS: switchAuthTab() — preservada (mesma API, novas classes).
    // Recovery step state via $_GET['recovery_step'] — preservado.
    // toggleRegMethod(): preservada (lógica de required dinâmico).

    $icon_star = '<span class="rmbz-auth-brand-glyph" aria-hidden="true">1MZ</span>';
    $icon_login = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                . '<path d="M11 16h6a1 1 0 001-1V5a1 1 0 00-1-1h-6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>'
                . '<path d="M12 10H2m0 0l3-3m-3 3l3 3" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>'
                . '</svg>';
    $icon_search = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                 . '<circle cx="9" cy="9" r="6" stroke="currentColor" stroke-width="1.8"/>'
                 . '<path d="M14 14l4 4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>'
                 . '</svg>';
    $icon_key = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
              . '<path d="M11 11a4 4 0 100-8 4 4 0 000 8zm-2.5-1.5L3 15v3h3l5.5-5.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>'
              . '</svg>';
    $icon_check = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                . '<path d="M4 10l4 4 8-8" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>'
                . '</svg>';
    $icon_whatsapp = '<svg viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg" width="18" height="18">'
                   . '<path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/>'
                   . '</svg>';
    ?>

    <div class="onemz-login-container onemz-artist-dashboard">

        <?php
        // Popup de mensagem (sucesso/erro de operações anteriores)
        if ( isset( $_SESSION['rmbz_withdrawal_notice'] ) ):
            $msg = $_SESSION['rmbz_withdrawal_notice'];
            $is_err = ( $msg[0] === 'error' );
            $variant = $is_err ? 'danger' : 'success';
            $title   = $is_err ? __( 'Atenção', '1mz-for-artists' ) : __( 'Sucesso', '1mz-for-artists' );
            $icon_html = $is_err
                ? '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="48" height="48"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/><path d="M8 8l8 8M16 8l-8 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>'
                : '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="48" height="48"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/><path d="M7 12l4 4 6-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';

            $popup_body = '<div style="text-align:center;padding:var(--rmbz-space-4) 0;">'
                        . '<div style="display:flex;justify-content:center;color:var(--rmbz-' . $variant . ');margin-bottom:var(--rmbz-space-3);">' . $icon_html . '</div>'
                        . '<p style="margin:0;color:var(--rmbz-text-secondary);font-size:var(--rmbz-text-sm);line-height:var(--rmbz-leading-relaxed);">'
                        . esc_html( $msg[1] ?? '' )
                        . '</p></div>';

            $popup_footer = rmbz_btn([
                'label'   => __( 'OK, Entendido', '1mz-for-artists' ),
                'variant' => $is_err ? 'danger' : 'success',
                'full'    => true,
                'attrs'   => [ 'data-rmbz-action' => 'close' ],
            ]);

            echo rmbz_modal([
                'id'     => 'rmbz-session-popup',
                'title'  => $title,
                'body'   => $popup_body,
                'footer' => $popup_footer,
            ]);
            // Popup começa aberto (mensagem flash) — abrir via JS após DOM ready
            ?>
            <script>
                document.addEventListener('DOMContentLoaded', function() {
                    if (window.rmbz && window.rmbz.modal) {
                        window.rmbz.modal.open('rmbz-session-popup');
                    }
                });
            </script>
            <?php
            unset( $_SESSION['rmbz_withdrawal_notice'] );
        endif;
        ?>

        <?php
        // Banner de erro de login
        if ( isset( $_SESSION['rmbz_login_error'] ) ):
            $login_error = $_SESSION['rmbz_login_error'];
            unset( $_SESSION['rmbz_login_error'] );
            ?>
            <div class="rmbz-auth-flash">
                <?php
                echo rmbz_alert([
                    'variant' => 'danger',
                    'title'   => __( 'Não foi possível entrar', '1mz-for-artists' ),
                    'body'    => '<p style="margin:0;font-size:var(--rmbz-text-sm);">' . esc_html( $login_error ) . '</p>',
                ]);
                ?>
            </div>
        <?php endif; ?>

        <div class="rmbz-auth-wrapper rmbz-auth-wrapper--split">

            <?php
            // Ícones SVG para as features do painel (currentColor).
            $promo_features = [
                [
                    'svg'   => '<svg viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="1.7"/><path d="M3 12h18M12 3a14 14 0 010 18M12 3a14 14 0 000 18" stroke="currentColor" stroke-width="1.7"/></svg>',
                    'title' => __( 'Distribuição global', '1mz-for-artists' ),
                    'desc'  => __( '150+ lojas: Spotify, Apple Music, TikTok, YouTube…', '1mz-for-artists' ),
                ],
                [
                    'svg'   => '<svg viewBox="0 0 24 24" fill="none"><rect x="3" y="6" width="18" height="12" rx="2.5" stroke="currentColor" stroke-width="1.7"/><circle cx="12" cy="12" r="2.6" stroke="currentColor" stroke-width="1.7"/></svg>',
                    'title' => __( 'Royalties em USD', '1mz-for-artists' ),
                    'desc'  => __( 'Levanta via M-Pesa, eMola ou Mkesh quando quiseres.', '1mz-for-artists' ),
                ],
                [
                    'svg'   => '<svg viewBox="0 0 24 24" fill="none"><path d="M4 20V10M10 20V4M16 20v-8M22 20H2" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>',
                    'title' => __( 'Analytics em tempo real', '1mz-for-artists' ),
                    'desc'  => __( 'Streams, ouvintes e países onde a tua música toca.', '1mz-for-artists' ),
                ],
                [
                    'svg'   => '<svg viewBox="0 0 24 24" fill="none"><rect x="3" y="5" width="18" height="14" rx="2.5" stroke="currentColor" stroke-width="1.7"/><path d="M10 9.5l5 2.5-5 2.5v-5z" fill="currentColor"/></svg>',
                    'title' => __( 'Ganha um videoclipe', '1mz-for-artists' ),
                    'desc'  => __( 'Produção profissional feita pela equipa 1MZ.', '1mz-for-artists' ),
                ],
                [
                    'svg'   => '<svg viewBox="0 0 24 24" fill="none"><path d="M12 3l8 3.5V12c0 4.5-3.3 7.8-8 8.5-4.7-.7-8-4-8-8.5V6.5L12 3z" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/><path d="M8.5 12l2.3 2.3 4.7-4.6" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></svg>',
                    'title' => __( '100% dos teus direitos', '1mz-for-artists' ),
                    'desc'  => __( 'A tua música é tua. Sem contratos exclusivos.', '1mz-for-artists' ),
                ],
            ];
            ?>
            <!-- Painel de apresentação (o que a 1MZ For Artists faz) -->
            <aside class="rmbz-auth-promo">
                <span class="rmbz-auth-promo__badge">
                    <span class="rmbz-auth-promo__badge-dot"></span>
                    <?php esc_html_e( '1MZ For Artists', '1mz-for-artists' ); ?>
                </span>
                <h2 class="rmbz-auth-promo__title">
                    <?php esc_html_e( 'A tua música. O teu controlo.', '1mz-for-artists' ); ?>
                    <span><?php esc_html_e( 'Tudo num só lugar.', '1mz-for-artists' ); ?></span>
                </h2>
                <p class="rmbz-auth-promo__sub">
                    <?php esc_html_e( 'Distribuição, relatórios e pagamentos organizados para artistas que querem trabalhar com clareza.', '1mz-for-artists' ); ?>
                </p>

                <div class="rmbz-auth-promo__features">
                    <?php foreach ( $promo_features as $pf ): ?>
                        <div class="rmbz-auth-promo__feat">
                            <span class="rmbz-auth-promo__feat-ic"><?php echo $pf['svg']; ?></span>
                            <span class="rmbz-auth-promo__feat-txt">
                                <strong><?php echo esc_html( $pf['title'] ); ?></strong>
                                <small><?php echo esc_html( $pf['desc'] ); ?></small>
                            </span>
                        </div>
                    <?php endforeach; ?>
                </div>

                <div class="rmbz-auth-promo__stats">
                    <div><strong>150+</strong><span><?php esc_html_e( 'Lojas', '1mz-for-artists' ); ?></span></div>
                    <div><strong>100%</strong><span><?php esc_html_e( 'Royalties', '1mz-for-artists' ); ?></span></div>
                    <div><strong>USD</strong><span><?php esc_html_e( 'M-Pesa/eMola', '1mz-for-artists' ); ?></span></div>
                </div>
            </aside>

            <div class="rmbz-auth-card">
                <div class="rmbz-auth-card__header">
                    <span class="rmbz-auth-card__icon" aria-hidden="true"><?php echo $icon_star; ?></span>
                    <h2 class="rmbz-auth-card__title">1MZ For Artists</h2>
                    <p class="rmbz-auth-card__subtitle">
                        <?php esc_html_e( 'Entra com o teu telefone e PIN ou cria um novo perfil.', '1mz-for-artists' ); ?>
                    </p>
                </div>

                <div class="rmbz-tabs rmbz-tabs--auth" role="tablist" aria-label="<?php esc_attr_e( 'Modo de acesso', '1mz-for-artists' ); ?>">
                    <button type="button" class="rmbz-tab onemz-auth-tab active" onclick="switchAuthTab('login')" role="tab" aria-selected="true">
                        <span class="rmbz-tab__label"><?php esc_html_e( 'Entrar', '1mz-for-artists' ); ?></span>
                    </button>
                    <button type="button" class="rmbz-tab onemz-auth-tab" onclick="switchAuthTab('register')" role="tab" aria-selected="false">
                        <span class="rmbz-tab__label"><?php esc_html_e( 'Criar Conta', '1mz-for-artists' ); ?></span>
                    </button>
                </div>

                <div class="rmbz-auth-card__body">

                    <?php // ── FORM 1: LOGIN ────────────────────────────── ?>
                    <form id="form-login" class="onemz-auth-form active" method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
                        <input type="hidden" name="action" value="rmbz_pin_login">
                        <?php wp_nonce_field('rmbz_pin_login_nonce'); ?>

                        <div class="rmbz-stack-md">
                            <?php
                            echo rmbz_field([
                                'name'        => 'telemovel_input',
                                'label'       => __( 'Telemóvel', '1mz-for-artists' ),
                                'type'        => 'tel',
                                'placeholder' => '841234567',
                                'required'    => true,
                                'attrs'       => [
                                    'pattern'   => '[0-9+]+',
                                    'inputmode' => 'numeric',
                                    'minlength' => '9',
                                    'maxlength' => '15',
                                    'oninput'   => "this.value = this.value.replace(/[^0-9+]/g, '')",
                                ],
                            ]);

                            echo rmbz_field([
                                'name'        => 'pin',
                                'label'       => __( 'O Seu PIN (4 Dígitos)', '1mz-for-artists' ),
                                'type'        => 'password',
                                'placeholder' => '••••',
                                'required'    => true,
                                'attrs'       => [
                                    'pattern'      => '\d{4}',
                                    'inputmode'    => 'numeric',
                                    'minlength'    => '4',
                                    'maxlength'    => '4',
                                    'autocomplete' => 'current-password',
                                    'style'        => 'text-align:center;letter-spacing:0.5em;font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-xl);width:100%;max-width:100%;margin-left:0;margin-right:0;box-sizing:border-box;display:block;',
                                ],
                            ]);

                            echo rmbz_btn([
                                'label'   => __( 'Entrar na Conta', '1mz-for-artists' ),
                                'variant' => 'primary',
                                'type'    => 'submit',
                                'icon'    => $icon_login,
                                'full'    => true,
                                'attrs'   => [ 'data-rmbz-loading-on-submit' => '1' ],
                            ]);
                            ?>
                        </div>

                        <div style="text-align:center;margin-top:var(--rmbz-space-4);">
                            <a href="#" onclick="switchAuthTab('recover-1'); return false;" style="color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);text-decoration:underline;">
                                <?php esc_html_e( 'Esqueceu o seu PIN? Clique aqui para recuperar.', '1mz-for-artists' ); ?>
                            </a>
                        </div>
                    </form>

                    <?php // ── FORM 2: RECOVER STEP 1 ────────────────────── ?>
                    <form id="form-recover-1" class="onemz-auth-form" method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
                        <input type="hidden" name="action" value="rmbz_verify_recovery">
                        <?php wp_nonce_field('rmbz_recovery_nonce'); ?>

                        <div style="text-align:center;margin-bottom:var(--rmbz-space-5);">
                            <h3 style="margin:0 0 var(--rmbz-space-2) 0;font-family:var(--rmbz-font-display);font-size:var(--rmbz-text-lg);font-weight:var(--rmbz-weight-semibold);color:var(--rmbz-brand);">
                                <?php esc_html_e( 'Recuperação de Conta', '1mz-for-artists' ); ?>
                            </h3>
                            <p style="margin:0;color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);line-height:var(--rmbz-leading-relaxed);">
                                <?php esc_html_e( 'Introduza os dados exactos da sua conta para verificarmos a sua identidade.', '1mz-for-artists' ); ?>
                            </p>
                        </div>

                        <div class="rmbz-stack-md">
                            <?php
                            echo rmbz_field([
                                'name'        => 'rec_nome',
                                'label'       => __( 'Nome Artístico (igual ao registo)', '1mz-for-artists' ),
                                'type'        => 'text',
                                'placeholder' => 'Ex: MC Exemplo',
                                'required'    => true,
                                'attrs'       => [ 'autocapitalize' => 'words' ],
                            ]);

                            echo rmbz_field([
                                'name'        => 'rec_telemovel',
                                'label'       => __( 'Telemóvel da conta', '1mz-for-artists' ),
                                'type'        => 'tel',
                                'placeholder' => '841234567',
                                'required'    => true,
                                'attrs'       => [
                                    'pattern'   => '[0-9+]+',
                                    'inputmode' => 'numeric',
                                    'minlength' => '9',
                                    'maxlength' => '15',
                                    'oninput'   => "this.value = this.value.replace(/[^0-9+]/g, '')",
                                ],
                            ]);

                            echo rmbz_btn([
                                'label'   => __( 'Verificar Conta', '1mz-for-artists' ),
                                'variant' => 'primary',
                                'type'    => 'submit',
                                'icon'    => $icon_search,
                                'full'    => true,
                                'attrs'   => [ 'data-rmbz-loading-on-submit' => '1' ],
                            ]);
                            ?>
                        </div>

                        <div style="text-align:center;margin-top:var(--rmbz-space-4);">
                            <a href="#" onclick="switchAuthTab('login'); return false;" style="color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);text-decoration:none;">
                                ← <?php esc_html_e( 'Voltar ao Login', '1mz-for-artists' ); ?>
                            </a>
                        </div>
                    </form>

                    <?php // ── FORM 3: RECOVER STEP 2 ────────────────────── ?>
                    <form id="form-recover-2" class="onemz-auth-form" method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
                        <input type="hidden" name="action" value="rmbz_execute_reset">
                        <?php wp_nonce_field('rmbz_execute_reset_nonce'); ?>

                        <div style="text-align:center;margin-bottom:var(--rmbz-space-5);">
                            <h3 style="margin:0 0 var(--rmbz-space-2) 0;font-family:var(--rmbz-font-display);font-size:var(--rmbz-text-lg);font-weight:var(--rmbz-weight-semibold);color:var(--rmbz-success);">
                                ✓ <?php esc_html_e( 'Conta Encontrada!', '1mz-for-artists' ); ?>
                            </h3>
                            <p style="margin:0 0 var(--rmbz-space-4) 0;color:var(--rmbz-text-secondary);font-size:var(--rmbz-text-xs);line-height:var(--rmbz-leading-relaxed);">
                                <?php esc_html_e( 'A sua conta foi validada. Para garantir a segurança máxima, peça a sua chave de acesso à administração via WhatsApp.', '1mz-for-artists' ); ?>
                            </p>
                            <a href="https://wa.me/258871800905?text=Olá,%20preciso%20da%20minha%20Chave%20de%20Recuperação%20de%20PIN%20na%20plataforma%201MZ." target="_blank" rel="noopener" style="display:inline-flex;align-items:center;gap:var(--rmbz-space-2);background:#25D366;color:#fff;padding:var(--rmbz-space-3) var(--rmbz-space-5);border-radius:var(--rmbz-radius-pill);text-decoration:none;font-weight:var(--rmbz-weight-semibold);font-size:var(--rmbz-text-sm);box-shadow:0 4px 12px rgba(37, 211, 102, 0.3);">
                                <?php echo $icon_whatsapp; ?>
                                <?php esc_html_e( 'Pedir Chave no WhatsApp', '1mz-for-artists' ); ?>
                            </a>
                        </div>

                        <div class="rmbz-stack-md">
                            <?php
                            echo rmbz_field([
                                'name'        => 'rec_key',
                                'label'       => __( 'Chave de Recuperação (6 dígitos fornecida no WhatsApp)', '1mz-for-artists' ),
                                'type'        => 'text',
                                'placeholder' => '123456',
                                'required'    => true,
                                'attrs'       => [
                                    'maxlength'    => '6',
                                    'minlength'    => '6',
                                    'inputmode'    => 'numeric',
                                    'pattern'      => '\d{6}',
                                    'autocomplete' => 'one-time-code',
                                    'style'        => 'text-align:center;font-family:var(--rmbz-font-mono);font-weight:var(--rmbz-weight-bold);letter-spacing:0.5em;font-size:var(--rmbz-text-xl);color:var(--rmbz-brand);width:100%;max-width:100%;margin-left:0;margin-right:0;box-sizing:border-box;display:block;',
                                ],
                            ]);

                            echo rmbz_field([
                                'name'        => 'rec_new_pin',
                                'label'       => __( 'O Seu Novo PIN (4 números)', '1mz-for-artists' ),
                                'type'        => 'password',
                                'placeholder' => '••••',
                                'required'    => true,
                                'attrs'       => [
                                    'maxlength'    => '4',
                                    'minlength'    => '4',
                                    'pattern'      => '\d{4}',
                                    'inputmode'    => 'numeric',
                                    'autocomplete' => 'new-password',
                                    'style'        => 'text-align:center;letter-spacing:0.5em;font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-xl);width:100%;max-width:100%;margin-left:0;margin-right:0;box-sizing:border-box;display:block;',
                                ],
                            ]);

                            echo rmbz_btn([
                                'label'   => __( 'Guardar Novo PIN', '1mz-for-artists' ),
                                'variant' => 'primary',
                                'type'    => 'submit',
                                'icon'    => $icon_key,
                                'full'    => true,
                                'attrs'   => [ 'data-rmbz-loading-on-submit' => '1' ],
                            ]);
                            ?>
                        </div>

                        <div style="text-align:center;margin-top:var(--rmbz-space-4);">
                            <a href="#" onclick="switchAuthTab('login'); return false;" style="color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);text-decoration:none;">
                                <?php esc_html_e( 'Cancelar e voltar', '1mz-for-artists' ); ?>
                            </a>
                        </div>
                    </form>

                    <?php // ── FORM 4: REGISTO ─────────────────────────── ?>
                    <form id="form-register" class="onemz-auth-form" method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" enctype="multipart/form-data">
                        <input type="hidden" name="action" value="onemz_process_registration">
                        <?php wp_nonce_field('onemz_registration_nonce'); ?>

                        <div class="rmbz-stack-md">
                            <?php
                            echo rmbz_field([
                                'name'        => 'reg_nome',
                                'label'       => __( 'Nome Artístico', '1mz-for-artists' ),
                                'type'        => 'text',
                                'placeholder' => 'Ex: MC Exemplo',
                                'required'    => true,
                                'attrs'       => [ 'autocapitalize' => 'words' ],
                            ]);

                            echo rmbz_field([
                                'name'        => 'reg_telemovel',
                                'label'       => __( 'Telemóvel (login)', '1mz-for-artists' ),
                                'type'        => 'tel',
                                'placeholder' => '841234567',
                                'required'    => true,
                                'attrs'       => [
                                    'pattern'   => '[0-9]{9}',
                                    'inputmode' => 'numeric',
                                    'minlength' => '9',
                                    'maxlength' => '9',
                                    'oninput'   => "this.value = this.value.replace(/[^0-9]/g, '')",
                                ],
                            ]);
                            ?>

                            <div class="rmbz-field">
                                <label class="rmbz-field__label" for="reg-provincia">
                                    <?php esc_html_e( 'Província', '1mz-for-artists' ); ?>
                                </label>
                                <select name="reg_provincia" id="reg-provincia" required class="rmbz-input">
                                    <option value="" disabled selected>-- <?php esc_html_e( 'Seleccione', '1mz-for-artists' ); ?> --</option>
                                    <option value="Maputo Cidade">Maputo Cidade</option>
                                    <option value="Maputo Província">Maputo Província</option>
                                    <option value="Gaza">Gaza</option>
                                    <option value="Inhambane">Inhambane</option>
                                    <option value="Sofala">Sofala</option>
                                    <option value="Manica">Manica</option>
                                    <option value="Tete">Tete</option>
                                    <option value="Zambézia">Zambézia</option>
                                    <option value="Nampula">Nampula</option>
                                    <option value="Cabo Delgado">Cabo Delgado</option>
                                    <option value="Niassa">Niassa</option>
                                    <option value="Diáspora (Exterior)">Fora de Moçambique</option>
                                </select>
                            </div>

                            <?php
                            echo rmbz_field([
                                'name'        => 'reg_cidade',
                                'label'       => __( 'Cidade / Distrito', '1mz-for-artists' ),
                                'type'        => 'text',
                                'placeholder' => 'Ex: Nampula, Matola, Beira...',
                                'required'    => true,
                                'attrs'       => [ 'autocapitalize' => 'words' ],
                            ]);

                            echo rmbz_field([
                                'name'        => 'reg_pin',
                                'label'       => __( 'PIN (senha de 4 dígitos)', '1mz-for-artists' ),
                                'type'        => 'password',
                                'placeholder' => '••••',
                                'required'    => true,
                                'attrs'       => [
                                    'maxlength'    => '4',
                                    'minlength'    => '4',
                                    'pattern'      => '\d{4}',
                                    'inputmode'    => 'numeric',
                                    'autocomplete' => 'new-password',
                                    'style'        => 'text-align:center;letter-spacing:0.5em;font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-xl);width:100%;max-width:100%;margin-left:0;margin-right:0;box-sizing:border-box;display:block;',
                                ],
                            ]);

                            // [1.5.131] Campo opcional "Convidado por" (telemóvel
                            // de quem convidou). Se preenchido e válido, o convidador
                            // recebe comissão quando o convidado fizer 1º depósito
                            // aprovado + comprar plano VIP.
                            // [1.5.133] Validação ao vivo via AJAX — assim que o
                            // utilizador escreve um número completo, mostramos
                            // "✓ Convite aprovado — Nome" ou "✗ motivo".
                            // [1.5.135] Embrulho num container amarelo destacado
                            // com badge "OPCIONAL" para deixar claro que NÃO é
                            // obrigatório. Guarda no submit avisa se o número
                            // foi preenchido mas é inválido.
                            ?>
                            <div class="rmbz-referral-wrapper" style="border:1px solid rgba(240,185,11,0.45);background:rgba(240,185,11,0.05);border-radius:10px;padding:14px;margin-top:6px;position:relative;">
                                <span style="position:absolute;top:-9px;left:14px;background:#f0b90b;color:#1a1a1a;padding:2px 9px;border-radius:10px;font-size:10px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;">
                                    <?php esc_html_e( 'Opcional', '1mz-for-artists' ); ?>
                                </span>
                                <?php
                                echo rmbz_field([
                                    'name'        => 'reg_referral_phone',
                                    'label'       => __( 'Convidado por (telemóvel do amigo)', '1mz-for-artists' ),
                                    'type'        => 'tel',
                                    'prefix'      => '+258',
                                    'placeholder' => '84xxxxxxx',
                                    'required'    => false,
                                    'hint'        => __( 'Se um amigo te convidou, mete aqui os 9 dígitos do número dele (ex: 841234567) para ele receber recompensa. Se não te convidaram, deixa em branco.', '1mz-for-artists' ),
                                    'attrs'       => [
                                        'id'           => 'rmbz-referral-input',
                                        'inputmode'    => 'numeric',
                                        'autocomplete' => 'off',
                                        'maxlength'    => '9',
                                        'pattern'      => '[0-9]{9}',
                                    ],
                                ]);
                                ?>

                                <div id="rmbz-referral-feedback" style="display:none;margin-top:8px;padding:10px 12px;border-radius:6px;font-size:13px;line-height:1.4;"></div>

                                <?php /* [1.5.135] Hidden state — o JS escreve aqui o
                                    estado actual da validação do número. O handler de
                                    submit lê para decidir se avisa ou não. Valores:
                                    "" (vazio/não preenchido), "valid", "invalid", "checking" */ ?>
                                <input type="hidden" id="rmbz-referral-state" value="">
                            </div>

                            <script>
                            /* [1.5.133/135] Validação ao vivo do campo "Convidado por".
                               Debounce 500ms para não martelar o servidor enquanto
                               o utilizador escreve. AJAX devolve {valid, message}.
                               Pintamos verde (válido) ou vermelho (inválido).
                               Sem `&&` para sobreviver ao escape do WP (1.5.119/126).
                               [1.5.135] Mantém estado em hidden input + adiciona
                               submit handler que avisa se preencheu inválido.
                               [1.5.136] Prefix +258 visual (rmbz_field prefix).
                               Input agora limita a 9 dígitos. Auto-limpa prefixos
                               +258/258 quando utilizador cola número completo. */
                            (function(){
                                var input = document.getElementById('rmbz-referral-input');
                                if (!input) return;
                                var feedback = document.getElementById('rmbz-referral-feedback');
                                if (!feedback) return;
                                var stateInput = document.getElementById('rmbz-referral-state');
                                if (!stateInput) return;

                                /* [1.5.136] Auto-limpar prefixos colados.
                                   Se o utilizador colar "+258841234567" ou "258841234567"
                                   (que é o reflexo natural de copiar do WhatsApp),
                                   removemos o prefixo automaticamente para ficarem só
                                   os 9 dígitos. Caso contrário o maxlength=9 cortaria
                                   no sítio errado. */
                                input.addEventListener('input', function(){
                                    var v = input.value || '';
                                    // Strip espaços e caracteres não-dígitos
                                    var digits = v.replace(/\D/g, '');
                                    // Remover prefixo 258 se presente (com ou sem +)
                                    if (digits.indexOf('258') === 0 && digits.length > 9) {
                                        digits = digits.substring(3);
                                    }
                                    // Limitar a 9 dígitos
                                    if (digits.length > 9) digits = digits.substring(0, 9);
                                    // Só actualizar se mudou (evita loop infinito de eventos)
                                    if (digits !== v) {
                                        input.value = digits;
                                    }
                                });

                                var ajaxUrl = '<?php echo esc_url_raw( admin_url('admin-ajax.php') ); ?>';
                                var nonce   = '<?php echo esc_js( wp_create_nonce('rmbz_validate_referral_nonce') ); ?>';
                                var debounceTimer = null;
                                var lastQueried = '';

                                function setState(s) { stateInput.value = s; }

                                function showOk(msg) {
                                    feedback.style.display = 'block';
                                    feedback.style.background = 'rgba(46,204,113,0.12)';
                                    feedback.style.border = '1px solid rgba(46,204,113,0.4)';
                                    feedback.style.color = '#9be7b8';
                                    feedback.textContent = msg;
                                    setState('valid');
                                }
                                function showErr(msg) {
                                    feedback.style.display = 'block';
                                    feedback.style.background = 'rgba(231,76,60,0.12)';
                                    feedback.style.border = '1px solid rgba(231,76,60,0.4)';
                                    feedback.style.color = '#ffb3ad';
                                    feedback.textContent = '✗ ' + msg;
                                    setState('invalid');
                                }
                                function showLoading() {
                                    feedback.style.display = 'block';
                                    feedback.style.background = 'rgba(150,150,150,0.10)';
                                    feedback.style.border = '1px solid rgba(150,150,150,0.3)';
                                    feedback.style.color = '#aaa';
                                    feedback.textContent = '⏳ A verificar...';
                                    setState('checking');
                                }
                                function hide() {
                                    feedback.style.display = 'none';
                                    feedback.textContent = '';
                                    setState('');
                                }

                                function check(value) {
                                    if (value === lastQueried) return;
                                    lastQueried = value;
                                    showLoading();

                                    var fd = new FormData();
                                    fd.append('action', 'rmbz_validate_referral');
                                    fd.append('nonce', nonce);
                                    fd.append('referral_phone', value);
                                    // buyer_phone vai vazio — utilizador ainda não tem conta

                                    fetch(ajaxUrl, { method: 'POST', body: fd, credentials: 'same-origin' })
                                        .then(function(r){ return r.json(); })
                                        .then(function(resp){
                                            // resp.success=true (resposta válida do servidor) com data.valid bool
                                            var ok = false;
                                            if (resp) { if (resp.success) { ok = true; } }
                                            if (!ok) { showErr('Erro a verificar.'); return; }

                                            var data = resp.data || {};
                                            if (data.valid) {
                                                showOk(data.message || '✓ Convite aprovado.');
                                            } else {
                                                showErr(data.message || 'Não autorizado.');
                                            }
                                        })
                                        .catch(function(){ showErr('Erro de rede.'); });
                                }

                                input.addEventListener('input', function(){
                                    var v = (input.value || '').replace(/\s+/g, '');
                                    if (debounceTimer) { clearTimeout(debounceTimer); }
                                    if (v.length === 0) { hide(); lastQueried = ''; return; }
                                    // Só dispara se o número parece minimamente completo (≥9 dígitos)
                                    var digits = v.replace(/\D/g, '');
                                    if (digits.length < 9) { hide(); return; }
                                    debounceTimer = setTimeout(function(){ check(v); }, 500);
                                });

                                /* [1.5.135] Guarda no submit do form de registo.
                                   Se o utilizador preencheu o campo mas a validação
                                   diz que está inválido (ou ainda a verificar),
                                   mostramos um confirm explicando que o "convidador"
                                   não vai receber recompensa. Se confirmar, o
                                   registo continua mas o referral será silenciosamente
                                   ignorado pelo servidor. */
                                var form = input.form;
                                if (form) {
                                    form.addEventListener('submit', function(ev){
                                        var v = (input.value || '').trim();
                                        if (v.length === 0) return; // vazio, ok, é opcional
                                        var st = stateInput.value;
                                        if (st === 'valid') return; // tudo bem
                                        // Aqui: 'invalid', 'checking' ou '' (não chegou a verificar)
                                        var msg;
                                        if (st === 'checking') {
                                            msg = 'Ainda estamos a verificar o número de convite. Tens a certeza que queres continuar? '
                                                + 'Se não esperares, o convidador pode não receber a recompensa.';
                                        } else {
                                            msg = '⚠ ATENÇÃO: O número de convite que preencheste NÃO é válido (ou não está cadastrado na 1MZ). '
                                                + 'Se continuares, a tua conta será criada normalmente — MAS quem te convidou NÃO vai receber recompensa por ti.\n\n'
                                                + 'Queres continuar mesmo assim?\n\n'
                                                + '• OK = continuar e ignorar o número de convite\n'
                                                + '• Cancelar = corrigir o número primeiro';
                                        }
                                        if (!confirm(msg)) {
                                            ev.preventDefault();
                                            ev.stopPropagation();
                                            input.focus();
                                            return false;
                                        }
                                    }, true);
                                }
                            })();
                            </script>
                        </div>

                        <?php // ── Sub-secção: Activação VIP ────────────── ?>
                        <div class="rmbz-auth-section">
                            <h4 class="rmbz-auth-section__title">
                                <?php
                                printf(
                                    /* translators: %s = preço da subscrição em MT */
                                    esc_html__( 'Activação VIP (%s MT)', '1mz-for-artists' ),
                                    esc_html( $sub_price )
                                );
                                ?>
                            </h4>

                            <div class="rmbz-stack-md">
                                <div>
                                    <label style="display:block;color:var(--rmbz-text-muted);font-size:var(--rmbz-text-2xs);font-weight:var(--rmbz-weight-semibold);text-transform:uppercase;letter-spacing:var(--rmbz-tracking-wider);margin-bottom:var(--rmbz-space-2);">
                                        <?php esc_html_e( 'Como deseja activar a conta?', '1mz-for-artists' ); ?>
                                    </label>
                                    <div class="rmbz-radio-group rmbz-radio-group--full" role="radiogroup" aria-label="<?php esc_attr_e( 'Tipo de activação', '1mz-for-artists' ); ?>">
                                        <label class="rmbz-radio-pill">
                                            <input type="radio" name="reg_activation_type" value="payment" required checked onchange="toggleRegMethod('payment')">
                                            <span class="rmbz-radio-pill__label">💳 <?php esc_html_e( 'Pagar', '1mz-for-artists' ); ?></span>
                                        </label>
                                        <label class="rmbz-radio-pill">
                                            <input type="radio" name="reg_activation_type" value="coupon" required onchange="toggleRegMethod('coupon')">
                                            <span class="rmbz-radio-pill__label">🎟️ <?php esc_html_e( 'Tenho Cupão', '1mz-for-artists' ); ?></span>
                                        </label>
                                    </div>
                                </div>

                                <div id="reg-payment-box">
                                    <div class="rmbz-stack-md">
                                        <div>
                                            <label class="rmbz-field__label" for="reg_payment_method">
                                                <?php esc_html_e( 'Método de pagamento', '1mz-for-artists' ); ?>
                                            </label>
                                            <select name="reg_payment_method" id="reg_payment_method" required class="rmbz-input" onchange="
                                                let sel = this.options[this.selectedIndex];
                                                let numBox = document.getElementById('reg-payment-instructions');
                                                let displayNum = document.getElementById('reg-display-pay-number');
                                                if(sel.value) { numBox.style.display='block'; displayNum.innerText = sel.getAttribute('data-number'); } else { numBox.style.display='none'; }
                                            ">
                                                <option value="" disabled selected>-- <?php esc_html_e( 'Seleccione', '1mz-for-artists' ); ?> --</option>
                                                <option value="M-Pesa" data-number="<?php echo esc_attr( $mpesa_number ); ?>">🔴 M-Pesa</option>
                                                <option value="E-Mola" data-number="<?php echo esc_attr( $emola_number ); ?>">🟢 E-Mola</option>
                                            </select>
                                        </div>

                                        <div id="reg-payment-instructions" style="display:none;background:var(--rmbz-bg-elevated);padding:var(--rmbz-space-4);border-radius:var(--rmbz-radius-sm);border:1px solid var(--rmbz-border-subtle);text-align:center;">
                                            <span style="color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);display:block;margin-bottom:var(--rmbz-space-2);">
                                                <?php
                                                printf(
                                                    /* translators: %s = preço */
                                                    esc_html__( 'Envie %s MT para:', '1mz-for-artists' ),
                                                    '<strong style="color:var(--rmbz-brand);">' . esc_html( $sub_price ) . '</strong>'
                                                );
                                                ?>
                                            </span>
                                            <strong id="reg-display-pay-number" style="display:block;font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-xl);color:var(--rmbz-text-primary);letter-spacing:0.05em;font-variant-numeric:tabular-nums;"></strong>
                                        </div>

                                        <div class="rmbz-field">
                                            <label class="rmbz-field__label" for="reg_sender_phone">
                                                <?php esc_html_e( 'O número que transferiu', '1mz-for-artists' ); ?>
                                            </label>
                                            <input type="tel" name="reg_sender_phone" id="reg_sender_phone" required placeholder="841234567" class="rmbz-input" pattern="[0-9]{9,15}" inputmode="numeric" minlength="9" maxlength="15">
                                        </div>

                                        <div>
                                            <label style="display:block;color:var(--rmbz-text-muted);font-size:var(--rmbz-text-2xs);font-weight:var(--rmbz-weight-semibold);text-transform:uppercase;letter-spacing:var(--rmbz-tracking-wider);margin-bottom:var(--rmbz-space-2);">
                                                <?php esc_html_e( 'Comprovativo', '1mz-for-artists' ); ?>
                                            </label>
                                            <div class="rmbz-radio-group rmbz-radio-group--full" role="radiogroup" aria-label="<?php esc_attr_e( 'Tipo de comprovativo', '1mz-for-artists' ); ?>">
                                                <label class="rmbz-radio-pill">
                                                    <input type="radio" name="reg_proof_type" value="id" checked onchange="document.getElementById('reg-proof-id-box').style.display='block'; document.getElementById('reg-proof-image-box').style.display='none'; document.getElementById('reg_transaction_id').required=true; document.getElementById('reg_proof_image').required=false;">
                                                    <span class="rmbz-radio-pill__label">📝 <?php esc_html_e( 'ID Transacção', '1mz-for-artists' ); ?></span>
                                                </label>
                                                <label class="rmbz-radio-pill">
                                                    <input type="radio" name="reg_proof_type" value="image" onchange="document.getElementById('reg-proof-id-box').style.display='none'; document.getElementById('reg-proof-image-box').style.display='block'; document.getElementById('reg_transaction_id').required=false; document.getElementById('reg_proof_image').required=true;">
                                                    <span class="rmbz-radio-pill__label">📸 <?php esc_html_e( 'Imagem', '1mz-for-artists' ); ?></span>
                                                </label>
                                            </div>
                                        </div>

                                        <div id="reg-proof-id-box" class="rmbz-field">
                                            <input type="text" name="reg_transaction_id" id="reg_transaction_id" required placeholder="<?php esc_attr_e( 'ID da SMS (Ex: 9B2C...)', '1mz-for-artists' ); ?>" class="rmbz-input" style="text-transform:uppercase;font-family:var(--rmbz-font-mono);font-weight:600;letter-spacing:0.08em;color:var(--rmbz-brand);" autocapitalize="characters" autocomplete="off">
                                        </div>

                                        <div id="reg-proof-image-box" class="rmbz-field" style="display:none;">
                                            <input type="file" name="reg_proof_image" id="reg_proof_image" accept="image/jpeg,image/png,image/webp" class="rmbz-input" style="padding:var(--rmbz-space-3);cursor:pointer;border:1px dashed var(--rmbz-border-strong);background:var(--rmbz-bg-input);">
                                        </div>
                                    </div>
                                </div>

                                <div id="reg-coupon-box" style="display:none;">
                                    <div class="rmbz-field">
                                        <label class="rmbz-field__label" for="reg_coupon_code" style="color:var(--rmbz-success);">
                                            <?php esc_html_e( 'Código do cupão promocional', '1mz-for-artists' ); ?>
                                        </label>
                                        <input type="text" name="reg_coupon_code" id="reg_coupon_code" placeholder="<?php esc_attr_e( 'Ex: VIP1MZLIVRE', '1mz-for-artists' ); ?>" class="rmbz-input" style="text-transform:uppercase;font-family:var(--rmbz-font-mono);font-weight:600;letter-spacing:0.15em;text-align:center;border-color:var(--rmbz-success);" autocapitalize="characters" autocomplete="off">
                                        <span class="rmbz-field__hint" style="color:var(--rmbz-warning);">
                                            <?php esc_html_e( 'Apenas cupões de "Dias VIP" são válidos no registo. Cupões de saldo monetário não serão aceites.', '1mz-for-artists' ); ?>
                                        </span>

                                        <?php /* [1.5.137] Feedback ao vivo da validação do cupão */ ?>
                                        <div id="reg-coupon-feedback" style="display:none;margin-top:8px;padding:10px 12px;border-radius:6px;font-size:13px;line-height:1.4;"></div>

                                        <?php /* [1.5.137] Hidden state — JS escreve aqui o estado actual.
                                            Valores: "" (vazio), "valid", "invalid", "checking" */ ?>
                                        <input type="hidden" id="reg-coupon-state" value="">
                                    </div>
                                </div>
                            </div>
                        </div>

                        <?php // ── Anti-bot ─────────────────────────────── ?>
                        <div class="rmbz-auth-section" style="margin-top:var(--rmbz-space-4);">
                            <h4 class="rmbz-auth-section__title" style="color:var(--rmbz-brand);">
                                <?php esc_html_e( 'Anti-spam *', '1mz-for-artists' ); ?>
                            </h4>
                            <p style="margin:0 0 var(--rmbz-space-3) 0;color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);">
                                <?php esc_html_e( 'Resolva a conta matemática:', '1mz-for-artists' ); ?>
                            </p>
                            <div style="display:flex;align-items:center;gap:var(--rmbz-space-3);">
                                <strong style="font-family:var(--rmbz-font-display);font-size:var(--rmbz-text-2xl);color:var(--rmbz-text-primary);font-variant-numeric:tabular-nums;">
                                    <?php echo intval( $num1 ); ?> + <?php echo intval( $num2 ); ?> =
                                </strong>
                                <input type="number" name="anti_bot_answer" required inputmode="numeric" placeholder="?" class="rmbz-input" style="width:90px;text-align:center;font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-xl);font-weight:var(--rmbz-weight-bold);">
                                <input type="hidden" name="anti_bot_hash" value="<?php echo esc_attr( $hash ); ?>">
                            </div>
                        </div>

                        <div style="margin-top:var(--rmbz-space-5);">
                            <?php
                            echo rmbz_btn([
                                'label'   => __( 'Confirmar Registo', '1mz-for-artists' ),
                                'variant' => 'primary',
                                'type'    => 'submit',
                                'icon'    => $icon_check,
                                'full'    => true,
                                'attrs'   => [ 'data-rmbz-loading-on-submit' => '1' ],
                            ]);
                            ?>
                        </div>
                    </form>

                </div>
            </div>
        </div>

        <script>
            // [DS 1.5.43] Tab switcher do auth — preserva API original
            // (switchAuthTab) mas sincroniza aria-selected.
            function switchAuthTab(tab) {
                document.querySelectorAll('.onemz-auth-tab').forEach(t => {
                    t.classList.remove('active');
                    t.setAttribute('aria-selected', 'false');
                });
                document.querySelectorAll('.onemz-auth-form').forEach(f => f.classList.remove('active'));

                if (tab === 'login') {
                    const tabBtn = document.querySelectorAll('.onemz-auth-tab')[0];
                    tabBtn.classList.add('active');
                    tabBtn.setAttribute('aria-selected', 'true');
                    document.getElementById('form-login').classList.add('active');
                } else if (tab === 'register') {
                    const tabBtn = document.querySelectorAll('.onemz-auth-tab')[1];
                    tabBtn.classList.add('active');
                    tabBtn.setAttribute('aria-selected', 'true');
                    document.getElementById('form-register').classList.add('active');
                } else if (tab === 'recover-1') {
                    document.getElementById('form-recover-1').classList.add('active');
                } else if (tab === 'recover-2') {
                    document.getElementById('form-recover-2').classList.add('active');
                }
            }

            // [DS 1.5.43] Toggle pagamento vs cupão no registo — preserva
            // a função original que muda atributos required em vários campos.
            function toggleRegMethod(method) {
                const payBox = document.getElementById('reg-payment-box');
                const coupBox = document.getElementById('reg-coupon-box');
                const payMethod = document.getElementById('reg_payment_method');
                const senderPhone = document.getElementById('reg_sender_phone');
                const transId = document.getElementById('reg_transaction_id');
                const proofImg = document.getElementById('reg_proof_image');
                const couponCode = document.getElementById('reg_coupon_code');

                if (method === 'coupon') {
                    payBox.style.display = 'none';
                    coupBox.style.display = 'block';
                    payMethod.required = false;
                    senderPhone.required = false;
                    transId.required = false;
                    proofImg.required = false;
                    couponCode.required = true;
                } else {
                    payBox.style.display = 'block';
                    coupBox.style.display = 'none';
                    payMethod.required = true;
                    senderPhone.required = true;
                    couponCode.required = false;
                    const proofType = document.querySelector('input[name="reg_proof_type"]:checked').value;
                    if (proofType === 'id') {
                        transId.required = true;
                        proofImg.required = false;
                    } else {
                        transId.required = false;
                        proofImg.required = true;
                    }
                }
            }

            /* [1.5.137] Validação ao vivo do cupão de registo.
               Debounce 500ms. AJAX devolve {valid, days, message}.
               Pinta verde (válido com X dias VIP) ou vermelho (motivo).
               Bloqueia submit se utilizador insistir com cupão inválido. */
            (function(){
                var input    = document.getElementById('reg_coupon_code');
                var feedback = document.getElementById('reg-coupon-feedback');
                var stateInp = document.getElementById('reg-coupon-state');
                if (!input || !feedback || !stateInp) return;

                var ajaxUrl = '<?php echo esc_url_raw( admin_url('admin-ajax.php') ); ?>';
                var nonce   = '<?php echo esc_js( wp_create_nonce('rmbz_validate_coupon_nonce') ); ?>';
                var timer = null;
                var lastQ = '';

                function setState(s){ stateInp.value = s; }

                function showOk(msg){
                    feedback.style.display    = 'block';
                    feedback.style.background = 'rgba(46,204,113,0.12)';
                    feedback.style.border     = '1px solid rgba(46,204,113,0.4)';
                    feedback.style.color      = '#9be7b8';
                    feedback.textContent      = msg;
                    setState('valid');
                }
                function showErr(msg){
                    feedback.style.display    = 'block';
                    feedback.style.background = 'rgba(231,76,60,0.12)';
                    feedback.style.border     = '1px solid rgba(231,76,60,0.4)';
                    feedback.style.color      = '#ffb3ad';
                    feedback.textContent      = '✗ ' + msg;
                    setState('invalid');
                }
                function showLoading(){
                    feedback.style.display    = 'block';
                    feedback.style.background = 'rgba(150,150,150,0.10)';
                    feedback.style.border     = '1px solid rgba(150,150,150,0.3)';
                    feedback.style.color      = '#aaa';
                    feedback.textContent      = '⏳ A verificar cupão...';
                    setState('checking');
                }
                function hide(){
                    feedback.style.display = 'none';
                    feedback.textContent   = '';
                    setState('');
                }

                function check(code){
                    if (code === lastQ) return;
                    lastQ = code;
                    showLoading();

                    var fd = new FormData();
                    fd.append('action', 'rmbz_validate_registration_coupon');
                    fd.append('nonce',  nonce);
                    fd.append('coupon_code', code);

                    fetch(ajaxUrl, { method: 'POST', body: fd, credentials: 'same-origin' })
                        .then(function(r){ return r.json(); })
                        .then(function(resp){
                            var ok = false;
                            if (resp) { if (resp.success) { ok = true; } }
                            if (!ok) { showErr('Erro a verificar cupão.'); return; }
                            var d = resp.data || {};
                            if (d.valid === true) { showOk(d.message || '✓ Cupão válido.'); }
                            else                  { showErr(d.message || 'Cupão inválido.'); }
                        })
                        .catch(function(){ showErr('Erro de rede. Tente novamente.'); });
                }

                input.addEventListener('input', function(){
                    var v = (input.value || '').toUpperCase().replace(/\s+/g, '');
                    if (timer) { clearTimeout(timer); }
                    if (v.length === 0) { hide(); lastQ = ''; return; }
                    /* Só verifica a partir de 3 chars (evitar spam de queries em códigos curtos) */
                    if (v.length < 3) { hide(); return; }
                    timer = setTimeout(function(){ check(v); }, 500);
                });

                /* Bloqueio de submit se cupão estiver invalido/em verificação.
                   Aplica-se SÓ se o utilizador escolheu "Tenho Cupão" (coupBox visível). */
                var form = input.form;
                if (form) {
                    form.addEventListener('submit', function(ev){
                        var coupBox = document.getElementById('reg-coupon-box');
                        if (!coupBox || coupBox.style.display === 'none') return; /* não escolheu cupão, ignorar */

                        var v = (input.value || '').trim();
                        if (v.length === 0) return; /* vazio, server-side já avisa */

                        var st = stateInp.value;
                        if (st === 'valid') return; /* tudo bem */

                        var msg;
                        if (st === 'checking') {
                            msg = 'Ainda estamos a verificar o cupão. Aguarde 1 segundo e tente submeter novamente.';
                        } else {
                            msg = '✗ O cupão que inseriste NÃO é válido.\n\n'
                                + 'Não vais conseguir activar a conta com este código. Por favor:\n'
                                + '• Verifica se digitaste correctamente\n'
                                + '• Ou escolhe "PAGAR" em vez de "TENHO CUPÃO"';
                        }
                        ev.preventDefault();
                        ev.stopPropagation();
                        alert(msg);
                        input.focus();
                        return false;
                    }, true);
                }
            })();

            // Estado inicial das tabs em caso de redirect com recovery_step
            <?php if ( isset( $_GET['recovery_step'] ) && $_GET['recovery_step'] == '1' ): ?>
                switchAuthTab('recover-1');
            <?php elseif ( isset( $_GET['recovery_step'] ) && $_GET['recovery_step'] == '2' ): ?>
                switchAuthTab('recover-2');
            <?php endif; ?>
        </script>
    </div>
    <?php
}
/**
 * ==========================================================================
 * 3. VIEW: DASHBOARD PRINCIPAL (CABECALHO VIP E NOTIFICAÇÕES)
 * ==========================================================================
 */
function rmbz_render_dashboard_view() {
    global $wpdb;
    $user_telemovel = rmbz_get_current_user_telemovel();

    // [1.5.128] FIRST DEPOSIT GATE.
    // O shortcode rmbz_minha_conta (que renderiza a página principal "Olá, X")
    // é o que efectivamente os utilizadores usam — não os shortcodes
    // 1mz_artist_area/1mz_distribution_dashboard onde o gate foi adicionado
    // na 1.5.127. Por isso não bloqueava nada na prática.
    // Aqui, antes de qualquer query/render do dashboard, verificamos se o
    // utilizador está em estado pre-activação (first deposit pendente).
    // Se sim, renderizamos só o gate e saímos.
    if ( function_exists('rmbz_first_deposit_gate_block_if_needed') ) {
        if ( rmbz_first_deposit_gate_block_if_needed() ) {
            return;
        }
    }

    // 1. DADOS DO UTILIZADOR E SALDO CARTEIRA (MT)
    $user = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s", $user_telemovel) );
    $wallet_balance_mt = (float) ($user->balance ?? 0);
    $withdrawable_balance = function_exists('rmbz_get_withdrawable_balance') ? rmbz_get_withdrawable_balance($user_telemovel) : 0;

    // 2. SALDO DE DISTRIBUIÇÃO (USD)
    $distro_balance_usd = 0.00;
    $table_distro_stats = $wpdb->prefix . 'rmbz_distro_stats';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$table_distro_stats'") === $table_distro_stats ) {
        $distro_stats = $wpdb->get_row( $wpdb->prepare("SELECT total_earnings FROM {$table_distro_stats} WHERE artist_telemovel = %s", $user_telemovel) );
        $distro_balance_usd = $distro_stats ? (float)$distro_stats->total_earnings : 0.00;
    }

    // [DS 1.5.59] Contadores para os pills do cartão Distribuição:
    //   - $distro_live_count    = músicas publicadas (status live ou distribuido)
    //   - $distro_attention_count = releases que precisam de acção (status returned)
    // Uma única query SELECT COUNT(*) com CASE WHEN para evitar 2 round-trips à DB.
    // Indexada por artist_telemovel — performance trivial mesmo em listas grandes.
    $distro_live_count      = 0;
    $distro_attention_count = 0;
    $table_distro_releases = $wpdb->prefix . 'rmbz_distro_releases';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$table_distro_releases'") === $table_distro_releases ) {
        $row = $wpdb->get_row( $wpdb->prepare(
            "SELECT
                SUM(CASE WHEN status IN ('live','distribuido') THEN 1 ELSE 0 END) AS live_count,
                SUM(CASE WHEN status = 'returned' THEN 1 ELSE 0 END) AS attention_count
             FROM {$table_distro_releases}
             WHERE artist_telemovel = %s",
            $user_telemovel
        ) );
        if ( $row ) {
            $distro_live_count      = (int) $row->live_count;
            $distro_attention_count = (int) $row->attention_count;
        }
    }

    // 3. CONVERSÃO E SOMA
    // [BUGFIX 1.5.10] Usar helper central (trata caso da taxa guardada como 0).
    $exchange_rate = function_exists('rmbz_get_exchange_rate')
        ? rmbz_get_exchange_rate()
        : (float) get_option('rmbz_exchange_rate', 63.50);
    $distro_balance_mt = $distro_balance_usd * $exchange_rate;
    $total_assets_mt = $wallet_balance_mt + $distro_balance_mt;

    // 4. SUBSCRIÇÃO
    $has_subscription = function_exists('rmbz_user_has_active_subscription') ? rmbz_user_has_active_subscription($user_telemovel) : false;
    $days_left = 0;
    if ($has_subscription && function_exists('rmbz_get_subscription_expiry')) {
        $expiry = rmbz_get_subscription_expiry($user_telemovel);
        $days_left = ceil((strtotime($expiry) - current_time('timestamp')) / 86400);
    }

    // --- LÓGICA DE NOTIFICAÇÕES ---
    $wpdb->suppress_errors = true;
    $notificacoes = [];
    if (!empty($user->user_email) && strpos($user->user_email, '@1mz.local') === false) {
        // [1.5.414] audience <> 'admin' é o filtro DEFINITIVO (marcado na
        // escrita); os NOT LIKE ficam como rede de segurança para registos
        // muito antigos que o backfill não apanhe.
        $notificacoes = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}rmbz_email_logs
             WHERE recipient_email = %s
             AND is_cleared = 0
             AND audience <> 'admin'
             AND subject NOT LIKE '%%Novo Depósito%%'
             AND subject NOT LIKE '%%Novo Levantamento%%'
             AND subject NOT LIKE '%%Nova Submissão%%'
             AND subject NOT LIKE '%%Novo Projeto%%'
             AND subject NOT LIKE '%%[Admin]%%'
             ORDER BY sent_date DESC LIMIT 15",
            $user->user_email
        ));
    }
    $wpdb->suppress_errors = false;
    if ( !is_array($notificacoes) ) $notificacoes = [];
    
    $unread_count = 0;
    foreach($notificacoes as $n) { if(isset($n->is_read) && $n->is_read == 0) $unread_count++; }

    // 5. CONSULTAS DB GERAIS
    $table_submissions = $wpdb->prefix . 'rmbz_artist_submissions';
    $per_page = 10;
    $paged = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1;
    $offset = ($paged - 1) * $per_page;
    
    $total_submissions = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(id) FROM {$table_submissions} WHERE artist_telemovel = %s", $user_telemovel) );
    $total_pages = ceil($total_submissions / $per_page);
    $submissions = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_submissions} WHERE artist_telemovel = %s ORDER BY submission_date DESC LIMIT %d OFFSET %d", $user_telemovel, $per_page, $offset ) );
    
    $table_projects = $wpdb->prefix . 'rmbz_artist_projects';
    $projects = $wpdb->get_results( $wpdb->prepare( "SELECT p.* FROM {$table_projects} p WHERE p.artist_telemovel = %s ORDER BY p.contract_date DESC", $user_telemovel ) );
    if ( function_exists( 'rmbz_filming_project_hidden_from_artist' ) ) {
        $projects = array_values( array_filter( $projects, function( $project ) {
            return ( $project->production_status ?? '' ) !== 'cancelled_no_confirmation'
                || ! rmbz_filming_project_hidden_from_artist( $project );
        } ) );
    }
    
    $table_transactions = $wpdb->prefix . 'rmbz_wallet_transactions';

    /* [1.5.139] Paginação do extrato. Antes era LIMIT 30 fixo — em contas com
       muitas transações (royalties por match review podem gerar dezenas de
       linhas só num import) o utilizador via uma lista interminável.
       Agora: 15 por página, query string `?ext_page=N`. Não interfere
       com `?paged=N` (paginação de envios) — chave separada. */
    $ext_per_page = 15;
    $ext_paged    = isset($_GET['ext_page']) ? max(1, intval($_GET['ext_page'])) : 1;
    $ext_offset   = ($ext_paged - 1) * $ext_per_page;

    $total_transactions = (int) $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM {$table_transactions} WHERE user_telemovel = %s",
        $user_telemovel
    ) );
    $total_ext_pages = (int) ceil( $total_transactions / $ext_per_page );

    $transactions = $wpdb->get_results( $wpdb->prepare(
        "SELECT * FROM {$table_transactions} WHERE user_telemovel = %s ORDER BY transaction_date DESC LIMIT %d OFFSET %d",
        $user_telemovel, $ext_per_page, $ext_offset
    ) );
    
    $table_deposits = $wpdb->prefix . 'rmbz_deposit_requests';
    $deposit_requests = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_deposits} WHERE user_telemovel = %s ORDER BY request_date DESC LIMIT 30", $user_telemovel ) );
    
    // --- NOVIDADE: CONSULTA DOS LEVANTAMENTOS DA CARTEIRA ---
    $table_withdrawals = $wpdb->prefix . 'rmbz_withdrawal_requests';
    $withdrawal_requests = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_withdrawals} WHERE user_telemovel = %s ORDER BY request_date DESC LIMIT 30", $user_telemovel ) );
    // --------------------------------------------------------

    $has_pending_deposit = false;
    foreach ($deposit_requests as $deposit) { if ($deposit->status === 'pendente') { $has_pending_deposit = true; break; } }
    ?>
    <div class="onemz-artist-dashboard rmbz-fullbleed">

        <?php
        // [1.6.337] Limitações ativas com motivo para o artista + cronómetro.
        if ( function_exists('rmbz_apply_block_expiries') ) rmbz_apply_block_expiries($user_telemovel);
        $rmbz_blocks = function_exists('rmbz_user_active_blocks') ? rmbz_user_active_blocks($user_telemovel) : [];
        $rmbz_blocks = array_values( array_filter($rmbz_blocks, function($b){ return $b['key'] !== 'is_banned'; }) );
        if ( ! empty($rmbz_blocks) ): ?>
            <div class="rmbz-restrictions">
                <?php foreach ($rmbz_blocks as $b): ?>
                    <div class="rmbz-restriction">
                        <div class="rmbz-restriction-top">
                            <span class="rmbz-restriction-badge" aria-hidden="true">
                                <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="2"/><path d="M5.6 5.6l12.8 12.8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
                            </span>
                            <div class="rmbz-restriction-tt">
                                <span class="rmbz-restriction-title"><?php echo esc_html($b['label']); ?></span>
                                <span class="rmbz-restriction-sub"><?php echo ((int)$b['until'] > 0) ? 'Temporariamente bloqueado' : 'Bloqueado'; ?></span>
                            </div>
                        </div>
                        <?php if ($b['reason'] !== ''): ?>
                            <div class="rmbz-restriction-reason"><?php echo esc_html($b['reason']); ?></div>
                        <?php endif; ?>
                        <?php if ((int)$b['until'] > 0): ?>
                            <div class="rmbz-countdown" data-until="<?php echo (int)$b['until'] * 1000; ?>">
                                <span class="rmbz-cd-label">DESBLOQUEIA EM</span>
                                <span class="rmbz-cd-num">—:—:—</span>
                            </div>
                        <?php else: ?>
                            <div class="rmbz-restriction-perm">Permanente — contacta o suporte.</div>
                        <?php endif; ?>
                    </div>
                <?php endforeach; ?>
            </div>
            <style>
                .rmbz-restrictions{ display:flex; flex-direction:column; gap:14px; margin:0 0 20px; }
                .rmbz-restriction{
                    background:linear-gradient(135deg,rgba(229,72,77,.14),rgba(229,72,77,.04));
                    border:1px solid rgba(229,72,77,.32); border-radius:22px; padding:18px 20px;
                    box-shadow:0 6px 22px rgba(0,0,0,.18); backdrop-filter:blur(4px);
                }
                .rmbz-restriction-top{ display:flex; align-items:center; gap:14px; }
                .rmbz-restriction-badge{
                    flex:0 0 auto; width:42px; height:42px; border-radius:50%;
                    background:rgba(229,72,77,.18); color:#ff6b6b;
                    display:flex; align-items:center; justify-content:center;
                }
                .rmbz-restriction-badge svg{ width:22px; height:22px; }
                .rmbz-restriction-tt{ display:flex; flex-direction:column; gap:2px; }
                .rmbz-restriction-title{ color:#fff; font-weight:800; font-size:16px; letter-spacing:-.01em; }
                .rmbz-restriction-sub{ color:#ff8f8f; font-weight:600; font-size:12px; }
                .rmbz-restriction-reason{
                    color:#e9d4d2; font-size:14px; line-height:1.55; margin-top:14px;
                    background:rgba(255,255,255,.05); border-radius:12px; padding:12px 14px;
                }
                .rmbz-restriction-perm{
                    display:inline-block; margin-top:14px; background:rgba(229,72,77,.16);
                    color:#ff8f8f; font-weight:700; font-size:14px; padding:9px 16px; border-radius:12px;
                }
                .rmbz-countdown{
                    margin:16px auto 2px; display:flex; flex-direction:column; align-items:center; gap:2px;
                    background:rgba(229,72,77,.16); border-radius:16px; padding:12px 26px; width:fit-content;
                }
                .rmbz-cd-label{ color:rgba(255,143,143,.85); font-size:10px; font-weight:800; letter-spacing:1.5px; }
                .rmbz-cd-num{ color:#ff6b6b; font-weight:800; font-size:26px; font-variant-numeric:tabular-nums; line-height:1.1; }
            </style>
            <script>
            (function(){
                function fmt(ms){
                    if(ms<=0) return null;
                    var s=Math.floor(ms/1000), d=Math.floor(s/86400); s-=d*86400;
                    var h=Math.floor(s/3600); s-=h*3600;
                    var m=Math.floor(s/60); s-=m*60;
                    var p=function(n){return (n<10?'0':'')+n;};
                    return (d>0? d+'d ':'') + p(h)+':'+p(m)+':'+p(s);
                }
                var els=document.querySelectorAll('.rmbz-countdown');
                function tick(){
                    var now=Date.now(), reloadNeeded=false;
                    els.forEach(function(el){
                        var until=parseInt(el.getAttribute('data-until'),10)||0;
                        var num=el.querySelector('.rmbz-cd-num'); if(!num) return;
                        var t=fmt(until-now);
                        if(t===null){ num.textContent='A desbloquear…'; reloadNeeded=true; }
                        else { num.textContent=t; }
                    });
                    if(reloadNeeded){ setTimeout(function(){ location.reload(); }, 2500); }
                }
                tick(); setInterval(tick,1000);
            })();
            </script>
        <?php endif; ?>

        <?php
        // [1.5.401] Convites de PARTICIPAÇÃO (feat) pendentes — este artista foi
        // adicionado como participação num Projecto de Vídeo de outro artista.
        $rmbz_feat_invites = function_exists('rmbz_feat_pending_for') ? rmbz_feat_pending_for($user_telemovel) : [];
        foreach ( $rmbz_feat_invites as $rmbz_fi ) : $rmbz_fi_id = (int) $rmbz_fi['project_id']; ?>
            <div style="background:linear-gradient(135deg,rgba(240,185,11,.16),rgba(240,185,11,.05)); border:1.5px solid rgba(240,185,11,.45); border-radius:22px; padding:18px 20px; margin:0 0 20px; box-shadow:0 6px 22px rgba(0,0,0,.18);">
                <div style="display:flex; align-items:center; gap:14px;">
                    <div style="flex:0 0 auto; width:42px; height:42px; border-radius:50%; background:rgba(240,185,11,.2); display:flex; align-items:center; justify-content:center; font-size:20px;">🎤</div>
                    <div>
                        <div style="color:#fff; font-weight:800; font-size:16px;">Foste adicionado como participação num Projecto de Vídeo</div>
                        <div style="color:var(--rmbz-text-secondary,#b8b8c0); font-size:13px; margin-top:2px;">
                            <strong style="color:#f0b90b;"><?php echo esc_html($rmbz_fi['owner_name']); ?></strong> adicionou-te ao vídeo de
                            <strong style="color:#fff;">"<?php echo esc_html($rmbz_fi['title']); ?>"</strong> (nível <?php echo esc_html($rmbz_fi['level']); ?>).
                            Sem a tua resposta a produção não avança.
                        </div>
                    </div>
                </div>
                <div style="margin-top:14px;">
                    <button type="button" onclick="document.getElementById('rmbz-feat-inv-<?php echo $rmbz_fi_id; ?>').style.display='flex';"
                        style="background:#f0b90b; color:#1a1400; border:0; border-radius:12px; padding:11px 22px; font-weight:800; font-size:13px; cursor:pointer;">Ver convite e responder</button>
                </div>
            </div>

            <?php /* Modal: detalhes + TERMOS DA PARTICIPAÇÃO + aceitar/recusar. */ ?>
            <div id="rmbz-feat-inv-<?php echo $rmbz_fi_id; ?>" style="display:none; position:fixed; inset:0; z-index:99999; background:rgba(20,16,40,0.55); align-items:center; justify-content:center; padding:16px;">
                <div style="background:#fff; border-radius:20px; max-width:580px; width:100%; max-height:88vh; overflow-y:auto; padding:24px 22px; box-shadow:0 30px 60px -20px rgba(0,0,0,0.5);">
                    <div style="font-size:18px; font-weight:800; color:#1a1a20;">🎤 Convite de Participação — 1MZ For Artists</div>
                    <p style="font-size:13px; color:#56535f; margin:8px 0 12px;">
                        <strong><?php echo esc_html($rmbz_fi['owner_name']); ?></strong> declarou-te como participação
                        (<strong><?php echo esc_html($rmbz_fi['feat_name']); ?></strong>) no Projecto de Vídeo
                        <strong>"<?php echo esc_html($rmbz_fi['title']); ?>"</strong>. Lê os termos antes de responder:
                    </p>
                    <ol style="font-size:13px; color:#3a3744; line-height:1.65; padding-left:20px; margin:0 0 14px;">
                        <?php foreach ( ( function_exists('rmbz_feat_terms') ? rmbz_feat_terms() : [] ) as $rmbz_ft ) : ?>
                            <li><strong><?php echo esc_html($rmbz_ft[0]); ?></strong> — <?php echo esc_html($rmbz_ft[1]); ?></li>
                        <?php endforeach; ?>
                    </ol>
                    <label style="display:flex; gap:8px; align-items:flex-start; font-size:13px; color:#1a1a20; font-weight:600; background:#fdf6e3; border-radius:10px; padding:10px 12px; cursor:pointer;">
                        <input type="checkbox" id="rmbz-feat-agree-<?php echo $rmbz_fi_id; ?>" style="margin-top:2px;"
                               onchange="document.getElementById('rmbz-feat-accept-btn-<?php echo $rmbz_fi_id; ?>').disabled = !this.checked;">
                        <span>Li e concordo com os Termos da Participação da 1MZ For Artists.</span>
                    </label>
                    <div style="display:flex; gap:10px; margin-top:14px; flex-wrap:wrap;">
                        <button type="button" onclick="document.getElementById('rmbz-feat-inv-<?php echo $rmbz_fi_id; ?>').style.display='none';"
                            style="flex:1; min-width:110px; background:#eeebf7; color:#1a1a20; border:0; border-radius:12px; padding:12px; font-weight:700; font-size:13px; cursor:pointer;">Fechar</button>
                        <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" style="flex:1; min-width:110px; display:flex;"
                              onsubmit="return confirm('⚠️ Tens a certeza que queres RECUSAR?\n\nAo recusar, o projeto \'<?php echo esc_js($rmbz_fi['title']); ?>\' é CANCELADO automaticamente — sem o participante não há como fazer o vídeo. O dono será notificado.');">
                            <input type="hidden" name="action" value="rmbz_feat_respond">
                            <input type="hidden" name="project_id" value="<?php echo $rmbz_fi_id; ?>">
                            <input type="hidden" name="decision" value="reject">
                            <?php wp_nonce_field('rmbz_feat_respond_nonce'); ?>
                            <button type="submit" style="flex:1; background:#fdecea; color:#b3261e; border:0; border-radius:12px; padding:12px; font-weight:700; font-size:13px; cursor:pointer;">✕ Recusar</button>
                        </form>
                        <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" style="flex:1.4; min-width:150px; display:flex;">
                            <input type="hidden" name="action" value="rmbz_feat_respond">
                            <input type="hidden" name="project_id" value="<?php echo $rmbz_fi_id; ?>">
                            <input type="hidden" name="decision" value="accept">
                            <input type="hidden" name="terms_accepted" value="1">
                            <?php wp_nonce_field('rmbz_feat_respond_nonce'); ?>
                            <button type="submit" id="rmbz-feat-accept-btn-<?php echo $rmbz_fi_id; ?>" disabled
                                style="flex:1; background:#1a8a4a; color:#fff; border:0; border-radius:12px; padding:12px; font-weight:700; font-size:13px; cursor:pointer;">✅ Concordo — aceitar</button>
                        </form>
                    </div>
                    <p style="font-size:11px; color:#8a8794; margin:12px 0 0;">⚠️ Se recusares, o projeto é cancelado automaticamente e o dono é avisado em todos os canais.</p>
                </div>
            </div>
        <?php endforeach; ?>

        <?php
        $is_fake_email = (empty($user->user_email) || strpos($user->user_email, '@1mz.local') !== false);
        // Verifica se tem algum projeto que JÁ NÃO ESTEJA pendente, rejeitado ou em correção (ou seja, Aprovado/Em andamento)
        $has_approved_project = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}rmbz_artist_projects WHERE artist_telemovel = %s AND production_status NOT IN ('pending_review', 'rejected', 'correction') LIMIT 1", $user_telemovel));

        // NOVO: Verifica se o sistema está à espera que o utilizador insira o código OTP
        $is_pending_otp = isset($_SESSION['rmbz_verify_email_pending']) && $_SESSION['rmbz_verify_email_pending'] === true;

        // NOVO: Só mostra o aviso obrigatório se NÃO estiver na fase de inserir o código
        if ($is_fake_email && $has_approved_project && !$is_pending_otp): 
        ?>
        <div style="position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.97); z-index:999999999; display:flex; justify-content:center; align-items:center;">
            <div style="background:#1e1e1e; padding:40px; border-radius:12px; max-width:450px; width:90%; border:2px solid #f0b90b; text-align:center; box-shadow: 0 20px 50px rgba(0,0,0,0.9);">
                <div style="font-size:60px; margin-bottom:15px; animation: bounceEmail 2s infinite;">📧</div>
                <h2 style="color:#f0b90b; margin-top:0; font-size:24px; font-weight:900;">Ação Obrigatória</h2>
                <p style="color:#ccc; font-size:14px; line-height:1.6; margin-bottom:25px;">
                    Parabéns! Tens um projeto de videoclipe <strong>aprovado</strong> e em andamento. <br><br>
                    Para podermos comunicar contigo e enviar-te os orçamentos e detalhes de gravação, precisas de configurar um <strong>E-mail Real</strong> na tua conta.
                </p>
                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
                    
                    <input type="hidden" name="action" value="rmbz_update_profile_request">
                    <?php wp_nonce_field('rmbz_update_profile_nonce'); ?>
                    
                    <input type="hidden" name="user_provincia" value="<?php echo esc_attr($user->user_provincia ?? ''); ?>">
                    
                    <input type="email" name="user_email" required placeholder="O teu melhor e-mail..." style="width:100%; padding:15px; border-radius:8px; border:1px solid #f0b90b; background:#111; color:#fff; font-size:16px; margin-bottom:20px; text-align:center; outline:none; box-sizing:border-box;">
                    
                    <button type="submit" class="onemz-btn" style="background:#f0b90b; color:#000; width:100%; padding:15px; font-size:15px; border:none; border-radius:8px; font-weight:900; cursor:pointer; text-transform:uppercase;">Receber Código de Confirmação</button>
                </form>
            </div>
        </div>
        <style>@keyframes bounceEmail { 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} 40% {transform: translateY(-20px);} 60% {transform: translateY(-10px);} }</style>
        <?php endif; ?>
        
        <?php 
        $w_extra = !empty($user->extra_data) ? json_decode($user->extra_data, true) : [];
        if(isset($w_extra['admin_popup'])):
            $popup = $w_extra['admin_popup'];
            $p_color = '#3498db'; $p_icon = 'ℹ️';
            if($popup['type'] === 'warning') { $p_color = '#f0b90b'; $p_icon = '⚠️'; }
            if($popup['type'] === 'danger') { $p_color = '#e74c3c'; $p_icon = '🚨'; }
            if($popup['type'] === 'success') { $p_color = '#2ecc71'; $p_icon = '✅'; }
        ?>
            <div id="admin-direct-popup" style="position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.85); z-index:9999999; display:flex; justify-content:center; align-items:center;">
                <div style="background:#1e1e1e; padding:30px; border-radius:12px; text-align:center; max-width:400px; width:90%; border:2px solid <?php echo $p_color; ?>; box-shadow: 0 10px 30px rgba(0,0,0,0.5); animation: popIn 0.3s ease-out forwards;">
                    <div style="font-size:50px; margin-bottom:15px;"><?php echo $p_icon; ?></div>
                    <h3 style="color:<?php echo $p_color; ?>; margin-top:0; font-size:22px; font-weight:900;"><?php echo esc_html($popup['title']); ?></h3>
                    <p style="color:#ccc; font-size:15px; margin-bottom:25px; line-height:1.6;"><?php echo nl2br(esc_html($popup['message'])); ?></p>
                    <button onclick="dismissAdminPopup('<?php echo esc_js($user_telemovel); ?>')" style="background:<?php echo $p_color; ?>; color:#fff; border:none; padding:12px 30px; border-radius:6px; font-weight:bold; cursor:pointer; font-size:14px; width:100%; text-transform:uppercase;">OK, Entendido</button>
                </div>
            </div>
            <script>
            function dismissAdminPopup(telemovel) {
                document.getElementById('admin-direct-popup').style.display='none';
                let fd = new FormData();
                fd.append('action', 'rmbz_dismiss_admin_popup');
                // [SEC-MA*] nonce obrigatório no novo handler.
                fd.append('nonce', '<?php echo esc_js( wp_create_nonce("rmbz_notif_nonce") ); ?>');
                fetch('<?php echo esc_url( admin_url("admin-ajax.php") ); ?>', {method: 'POST', body: fd, credentials: 'same-origin'});
            }
            </script>
        <?php endif; ?>
        
        <?php
        /* [1.5.130] Limpeza proactiva da notice "Conta criada... pagamento
           inicial em análise" quando ela ficou órfã em sessão.
           Cenário: utilizador registou-se, gate disparou (1.5.128) e fez
           return early antes desta linha — notice nunca foi consumida.
           Quando admin aprova o depósito → gate deixa de disparar → dashboard
           chega aqui e mostra o popup velho.
           Heurística: se a notice fala em "pagamento inicial" E o utilizador
           JÁ tem depósito aprovado ou subscrição activa, é claramente
           obsoleta — descartar silenciosamente. */
        if ( isset($_SESSION['rmbz_withdrawal_notice']) && is_array($_SESSION['rmbz_withdrawal_notice']) ) {
            $sn = $_SESSION['rmbz_withdrawal_notice'];
            $sn_text = isset($sn[1]) ? (string) $sn[1] : '';
            if ( stripos($sn_text, 'pagamento inicial') !== false ) {
                $tel_check = $user_telemovel;
                $has_approved_dep = (int) $wpdb->get_var( $wpdb->prepare(
                    "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_deposit_requests
                     WHERE user_telemovel = %s AND status = 'aprovado'",
                    $tel_check
                ) );
                $has_active_sub = function_exists('rmbz_user_has_active_subscription')
                    ? rmbz_user_has_active_subscription( $tel_check )
                    : false;
                if ( $has_approved_dep > 0 || $has_active_sub ) {
                    unset( $_SESSION['rmbz_withdrawal_notice'] );
                }
            }
        }
        ?>

        <?php if (isset($_SESSION['rmbz_withdrawal_notice'])): 
            $msg = $_SESSION['rmbz_withdrawal_notice']; $is_err = ($msg[0] === 'error');
            $cor = $is_err ? '#e74c3c' : '#2ecc71'; $icone = $is_err ? '❌' : '✅'; $titulo = $is_err ? 'Atenção' : 'Sucesso';
        ?>
            <div id="rmbz-session-popup" style="position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.85); z-index:999999; display:flex; justify-content:center; align-items:center;">
                <div style="background:#1e1e1e; padding:30px; border-radius:12px; text-align:center; max-width:350px; width:90%; border:2px solid <?php echo $cor; ?>; box-shadow: 0 10px 30px rgba(0,0,0,0.5); animation: popIn 0.3s ease-out forwards;">
                    <div style="font-size:50px; margin-bottom:15px;"><?php echo $icone; ?></div>
                    <h3 style="color:<?php echo $cor; ?>; margin-top:0; font-size:22px; font-weight:900;"><?php echo $titulo; ?></h3>
                    <p style="color:#ccc; font-size:14px; margin-bottom:25px; line-height:1.5;"><?php echo esc_html($msg[1] ?? ''); ?></p>
                    <button onclick="document.getElementById('rmbz-session-popup').style.display='none'" style="background:<?php echo $cor; ?>; color:#fff; border:none; padding:12px 30px; border-radius:6px; font-weight:bold; cursor:pointer; font-size:14px; width:100%; text-transform:uppercase;">OK, Entendido</button>
                </div>
            </div>
            <style>@keyframes popIn { 0% { transform: scale(0.8); opacity: 0; } 100% { transform: scale(1); opacity: 1; } }</style>
        <?php unset($_SESSION['rmbz_withdrawal_notice']); endif; ?>

        <?php
        // [DS 1.5.42] Header do dashboard refeito com design system.
        //
        // Componentes novos (CSS §10):
        //   .rmbz-header / .rmbz-avatar / .rmbz-id-pill /
        //   .rmbz-bell / .rmbz-notif-dropdown / .rmbz-notif-item
        //
        // Modais de notificação agora usam rmbz_modal() em vez de markup
        // inline. JS openNotification() chama window.rmbz.modal.open().
        //
        // Preservado:
        //   • IDs JS-dependentes: notif-bell-container, notif-dropdown,
        //     notif-badge, notif-item-{id}, notif-dot-{id},
        //     notif-modal-{id}, profile-modal
        //   • Funções globais: toggleNotifications, openNotification,
        //     closeNotification, clearAllNotifications
        //   • URL de logout com nonce rmbz_logout_nonce
        //   • Endpoint AJAX rmbz_mark_notif_read e rmbz_clear_notifs
        //
        // Ícones SVG inline (tomados como currentColor pelos componentes):
        $icon_bell = '<svg class="rmbz-bell__icon" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" width="20" height="20" style="width:20px;height:20px;flex-shrink:0;display:block;">'
                   . '<path d="M10 2a5 5 0 00-5 5v3.5L3.5 13.5h13L15 10.5V7a5 5 0 00-5-5z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>'
                   . '<path d="M8 16a2 2 0 004 0" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>'
                   . '</svg>';
        $icon_settings = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                       . '<circle cx="10" cy="10" r="2.5" stroke="currentColor" stroke-width="1.6"/>'
                       . '<path d="M10 1.5v2M10 16.5v2M3.5 10h-2M18.5 10h-2M5.4 5.4l-1.4-1.4M16 16l-1.4-1.4M5.4 14.6l-1.4 1.4M16 4l-1.4 1.4" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>'
                       . '</svg>';
        $icon_logout = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                     . '<path d="M12 4V3a1 1 0 00-1-1H4a1 1 0 00-1 1v14a1 1 0 001 1h7a1 1 0 001-1v-1" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>'
                     . '<path d="M9 10h9m0 0l-3-3m3 3l-3 3" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>'
                     . '</svg>';
        $icon_inbox_empty = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="40" height="40">'
                          . '<path d="M3 13v5a2 2 0 002 2h14a2 2 0 002-2v-5M3 13l3-9h12l3 9M3 13h6l1 2h4l1-2h6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>'
                          . '</svg>';

        $user_initial = strtoupper( substr( (string) ( $user->user_nome ?? '?' ), 0, 1 ) );
        ?>
        <header class="rmbz-header onemz-artist-header">
            <div class="rmbz-header__user">
                <div class="rmbz-avatar" style="width:44px;height:44px;min-width:44px;max-width:44px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;font-weight:700;color:#000;background:var(--rmbz-brand,#f0b90b);box-sizing:border-box;"><?php echo esc_html( $user_initial ); ?></div>
                <div style="min-width:0;">
                    <h1 class="rmbz-header__greeting">
                        <?php
                        printf(
                            /* translators: %s = nome do utilizador */
                            esc_html__( 'Olá, %s 👋', '1mz-for-artists' ),
                            esc_html( $user->user_nome ?? '' )
                        );
                        ?>
                    </h1>
                    <div class="rmbz-header__meta">
                        <span class="rmbz-id-pill">
                            <span class="rmbz-id-pill__label">ID:</span>
                            <?php echo esc_html( $user_telemovel ?? '' ); ?>
                        </span>
                        <?php
                        echo rmbz_btn([
                            'label'   => __( 'Perfil', '1mz-for-artists' ),
                            'variant' => 'ghost',
                            'size'    => 'sm',
                            'icon'    => $icon_settings,
                            'attrs'   => [
                                'data-rmbz-modal-open' => 'profile-modal',
                            ],
                        ]);
                        ?>
                    </div>
                </div>
            </div>

            <div class="rmbz-header__actions">
                <div id="notif-bell-container" style="position:relative;">
                    <button type="button"
                            class="rmbz-bell"
                            onclick="toggleNotifications()"
                            aria-label="<?php esc_attr_e( 'Notificações', '1mz-for-artists' ); ?>"
                            aria-expanded="false"
                            aria-controls="notif-dropdown"
                            style="width:42px;height:42px;min-width:42px;max-width:42px;padding:0;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;flex-shrink:0;background-color:var(--rmbz-bg-input,#0e0e10);border:1px solid var(--rmbz-border-subtle,#26262b);color:var(--rmbz-text-secondary,#9a9a9a);cursor:pointer;background-image:none;">
                        <?php echo $icon_bell; ?>
                        <?php if ( $unread_count > 0 ): ?>
                            <span id="notif-badge" class="rmbz-bell__badge"><?php echo intval( $unread_count ); ?></span>
                        <?php endif; ?>
                    </button>

                    <div id="notif-dropdown" class="rmbz-notif-dropdown" hidden role="region" aria-label="<?php esc_attr_e( 'Lista de notificações', '1mz-for-artists' ); ?>">
                        <div class="rmbz-notif-dropdown__header">
                            <h4 class="rmbz-notif-dropdown__title"><?php esc_html_e( 'Avisos &amp; Mensagens', '1mz-for-artists' ); ?></h4>
                            <?php if ( count( $notificacoes ) > 0 ): ?>
                                <button type="button"
                                        class="rmbz-notif-dropdown__clear"
                                        onclick="clearAllNotifications('<?php echo esc_js( $user->user_email ); ?>')">
                                    <?php esc_html_e( 'Limpar Tudo', '1mz-for-artists' ); ?>
                                </button>
                            <?php endif; ?>
                        </div>

                        <div class="rmbz-notif-dropdown__list">
                            <?php if ( count( $notificacoes ) === 0 ): ?>
                                <div class="rmbz-notif-dropdown__empty">
                                    <span class="rmbz-notif-dropdown__empty-icon" aria-hidden="true"><?php echo $icon_inbox_empty; ?></span>
                                    <?php esc_html_e( 'Caixa limpa! Não tem notificações.', '1mz-for-artists' ); ?>
                                </div>
                            <?php else: ?>
                                <?php foreach ( $notificacoes as $notif ):
                                    $is_unread = empty( $notif->is_read );
                                    // [1.5.400] Se o body gravado for o EMAIL completo, fica só o conteúdo.
                                    $raw_body   = function_exists('rmbz_bell_body_clean') ? rmbz_bell_body_clean( $notif->body ) : $notif->body;
                                    $clean_body = preg_replace('/<style\b[^>]*>(.*?)<\/style>/is', '', $raw_body);
                                    $snippet = wp_trim_words( strip_tags( $clean_body ), 12, '…' );
                                ?>
                                    <button type="button"
                                            id="notif-item-<?php echo intval( $notif->id ); ?>"
                                            class="rmbz-notif-item<?php echo $is_unread ? ' is-unread' : ''; ?>"
                                            onclick="openNotification(<?php echo intval( $notif->id ); ?>)">
                                        <span id="notif-dot-<?php echo intval( $notif->id ); ?>" class="rmbz-notif-item__indicator" aria-hidden="true"></span>
                                        <div class="rmbz-notif-item__content">
                                            <h5 class="rmbz-notif-item__subject"><?php echo esc_html( $notif->subject ); ?></h5>
                                            <p class="rmbz-notif-item__snippet"><?php echo esc_html( $snippet ); ?></p>
                                            <span class="rmbz-notif-item__date">
                                                <?php echo esc_html( date( 'd/m/Y \à\s H:i', strtotime( $notif->sent_date ) ) ); ?>
                                            </span>
                                        </div>
                                    </button>
                                <?php endforeach; ?>
                            <?php endif; ?>
                        </div>
                    </div>
                </div>

                <?php
                // Modais de cada notificação — agora via rmbz_modal() do design system
                if ( count( $notificacoes ) > 0 && function_exists( 'rmbz_modal' ) ):
                    foreach ( $notificacoes as $notif ):
                        // [1.5.400] Sino nunca renderiza o tema do email — só o conteúdo.
                        $raw_body   = function_exists('rmbz_bell_body_clean') ? rmbz_bell_body_clean( $notif->body ) : $notif->body;
                        $clean_body = preg_replace('/<style\b[^>]*>(.*?)<\/style>/is', '', $raw_body);
                        $body_html = '<div style="color:var(--rmbz-text-secondary);font-size:var(--rmbz-text-sm);line-height:1.7;background:var(--rmbz-bg-input);padding:var(--rmbz-space-4);border-radius:var(--rmbz-radius-sm);border:1px solid var(--rmbz-border-subtle);max-height:300px;overflow-y:auto;">'
                                   . ( ( strpos( $clean_body, '<' ) !== false ) ? wp_kses_post( $clean_body ) : nl2br( esc_html( $clean_body ) ) )
                                   . '</div>';

                        $footer_html = rmbz_btn([
                            'label'   => __( 'Entendido', '1mz-for-artists' ),
                            'variant' => 'primary',
                            'full'    => true,
                            'attrs'   => [ 'data-rmbz-action' => 'close' ],
                        ]);

                        echo rmbz_modal([
                            'id'     => 'notif-modal-' . intval( $notif->id ),
                            'title'  => $notif->subject,
                            'body'   => $body_html,
                            'footer' => $footer_html,
                        ]);
                    endforeach;
                endif;
                ?>

                <?php
                echo rmbz_btn([
                    'label'   => __( 'Sair', '1mz-for-artists' ),
                    'variant' => 'ghost',
                    'size'    => 'sm',
                    'icon'    => $icon_logout,
                    'href'    => wp_nonce_url( admin_url('admin-post.php?action=rmbz_logout'), 'rmbz_logout_nonce' ),
                ]);
                ?>
            </div>
        </header>

        <script>
        // [DS 1.5.42] Handlers do header.
        // toggleNotifications/openNotification/closeNotification/clearAllNotifications
        // são funções globais (chamadas inline via onclick=). Mantemos a API
        // para não partir compatibilidade — apenas mudamos a implementação.

        function toggleNotifications() {
            const dropdown = document.getElementById('notif-dropdown');
            const bellBtn = document.querySelector('#notif-bell-container .rmbz-bell');
            if (!dropdown) return;

            const isHidden = dropdown.hasAttribute('hidden');
            if (isHidden) {
                dropdown.removeAttribute('hidden');
                if (bellBtn) {
                    bellBtn.classList.add('is-open');
                    bellBtn.setAttribute('aria-expanded', 'true');
                }
            } else {
                dropdown.setAttribute('hidden', '');
                if (bellBtn) {
                    bellBtn.classList.remove('is-open');
                    bellBtn.setAttribute('aria-expanded', 'false');
                }
            }
        }

        // Click outside fecha o dropdown
        document.addEventListener('click', function(event) {
            const dropdown = document.getElementById('notif-dropdown');
            const bellWrap = document.getElementById('notif-bell-container');
            if (!dropdown || dropdown.hasAttribute('hidden')) return;
            if (bellWrap && !bellWrap.contains(event.target)) {
                toggleNotifications();
            }
        });

        // Escape fecha o dropdown
        document.addEventListener('keydown', function(event) {
            if (event.key === 'Escape') {
                const dropdown = document.getElementById('notif-dropdown');
                if (dropdown && !dropdown.hasAttribute('hidden')) {
                    toggleNotifications();
                }
            }
        });

        function openNotification(id) {
            // Fechar o dropdown
            const dropdown = document.getElementById('notif-dropdown');
            if (dropdown && !dropdown.hasAttribute('hidden')) {
                toggleNotifications();
            }

            // Abrir o modal — via API do design system
            if (window.rmbz && window.rmbz.modal && typeof window.rmbz.modal.open === 'function') {
                window.rmbz.modal.open('notif-modal-' + id);
            } else {
                // Fallback se o DS ainda não carregou
                const modal = document.getElementById('notif-modal-' + id);
                if (modal) modal.style.display = 'flex';
            }

            // Marcar como lida (UI + AJAX)
            const dot = document.getElementById('notif-dot-' + id);
            const item = document.getElementById('notif-item-' + id);
            if (dot && getComputedStyle(dot).visibility !== 'hidden') {
                if (item) item.classList.remove('is-unread');

                const badge = document.getElementById('notif-badge');
                if (badge) {
                    const count = parseInt(badge.innerText, 10) - 1;
                    if (count > 0) {
                        badge.innerText = count;
                    } else {
                        badge.style.display = 'none';
                    }
                }

                const formData = new FormData();
                formData.append('action', 'rmbz_mark_notif_read');
                formData.append('notif_id', id);
                // [SEC-MA*] nonce obrigatório.
                formData.append('nonce', '<?php echo esc_js( wp_create_nonce("rmbz_notif_nonce") ); ?>');
                fetch('<?php echo esc_url( admin_url("admin-ajax.php") ); ?>', { method: 'POST', body: formData, credentials: 'same-origin' });
            }
        }

        function closeNotification(id) {
            // Mantida para compat — alguns sítios podem chamar directamente.
            if (window.rmbz && window.rmbz.modal && typeof window.rmbz.modal.close === 'function') {
                window.rmbz.modal.close('notif-modal-' + id);
            } else {
                const modal = document.getElementById('notif-modal-' + id);
                if (modal) modal.style.display = 'none';
            }
        }

        function clearAllNotifications(email) {
            if (!confirm('<?php echo esc_js( __( 'Tem a certeza que deseja limpar todo o seu histórico de avisos?', '1mz-for-artists' ) ); ?>')) return;
            const formData = new FormData();
            formData.append('action', 'rmbz_clear_notifs');
            // [SEC-MA*] handler já não confia em user_email do POST — usa o da
            // sessão. Mantemos o parâmetro por compatibilidade mas é ignorado.
            formData.append('nonce', '<?php echo esc_js( wp_create_nonce("rmbz_notif_nonce") ); ?>');
            fetch('<?php echo esc_url( admin_url("admin-ajax.php") ); ?>', { method: 'POST', body: formData, credentials: 'same-origin' })
                .then(() => location.reload());
        }

        // Botão "Perfil" — opener via data-attribute do design system.
        // Usa display='flex' directo porque o profile-modal ainda é
        // markup antigo (definido em user-perfil.php). Quando esse for
        // modernizado, este handler pode passar a usar rmbz.modal.open().
        document.addEventListener('DOMContentLoaded', function() {
            document.querySelectorAll('[data-rmbz-modal-open]').forEach(function(btn) {
                btn.addEventListener('click', function(e) {
                    e.preventDefault();
                    const modalId = btn.getAttribute('data-rmbz-modal-open');
                    const modal = document.getElementById(modalId);
                    if (!modal) return;

                    // Detecta se é markup do design system (tem [data-rmbz-modal])
                    // ou markup antigo (tem inline style com display:none)
                    if (modal.hasAttribute('data-rmbz-modal') && window.rmbz && window.rmbz.modal) {
                        window.rmbz.modal.open(modalId);
                    } else {
                        modal.style.display = 'flex';
                    }
                });
            });
        });
        </script>
        
        <?php
        // [DS 1.5.39] Ícone SVG para Cupão (ticket)
        $icon_coupon = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">'
                     . '<path d="M3 9V7a2 2 0 012-2h14a2 2 0 012 2v2a2 2 0 100 4v2a2 2 0 01-2 2H5a2 2 0 01-2-2v-2a2 2 0 100-4z" stroke="currentColor" stroke-width="1.8"/>'
                     . '<path d="M9 9v6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-dasharray="2 2"/>'
                     . '</svg>';
        ?>
        <div class="rmbz-feature-card rmbz-feature-card--brand">
            <div class="rmbz-feature-card__body">
                <div class="rmbz-feature-card__head">
                    <span class="rmbz-feature-card__icon"><?php echo $icon_coupon; ?></span>
                    <div>
                        <h3 class="rmbz-feature-card__title"><?php esc_html_e( 'Tem um Cupão Promocional?', '1mz-for-artists' ); ?></h3>
                        <p class="rmbz-feature-card__subtitle"><?php esc_html_e( 'Insira o código para resgatar saldo na carteira ou dias VIP.', '1mz-for-artists' ); ?></p>
                    </div>
                </div>

                <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" class="rmbz-feature-card__form">
                    <input type="hidden" name="action" value="rmbz_apply_coupon">
                    <?php wp_nonce_field('rmbz_apply_coupon_nonce'); ?>

                    <input type="text"
                           name="coupon_code"
                           placeholder="CÓDIGO AQUI"
                           required
                           maxlength="20"
                           class="rmbz-input"
                           style="text-transform:uppercase;font-weight:600;letter-spacing:0.15em;text-align:center;font-family:var(--rmbz-font-mono);">

                    <?php
                    echo rmbz_btn([
                        'label'   => __( 'Resgatar', '1mz-for-artists' ),
                        'variant' => 'primary',
                        'type'    => 'submit',
                    ]);
                    ?>
                </form>
            </div>
        </div>
        
        <?php 
        if ($has_subscription): 
            $w_extra = !empty($user->extra_data) ? json_decode($user->extra_data, true) : [];
            $perms = $w_extra['vip_permissions'] ?? ['distribute' => 1, 'site' => 1, 'social' => 1, 'video' => 1];

            // [DS 1.5.40] Ícones SVG para VIP activo
            $icon_diamond = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">'
                          . '<path d="M6 3h12l3 6-9 12L3 9l3-6z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>'
                          . '<path d="M3 9h18M9 3l3 6 3-6M12 9l-3 12m3-12l3 12" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>'
                          . '</svg>';
            $icon_plus = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                       . '<path d="M10 4v12M4 10h12" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>'
                       . '</svg>';

            // Lista de permissões: array unificado em vez de 8 blocos if/else
            $perm_labels = [
                'distribute' => __( 'Distribuir Músicas', '1mz-for-artists' ),
                'site'       => __( 'Publicar no Site', '1mz-for-artists' ),
                'social'     => __( 'Redes Sociais', '1mz-for-artists' ),
                'video'      => __( 'Candidatura a Vídeo', '1mz-for-artists' ),
                'ai'         => __( 'Assistente IA', '1mz-for-artists' ),
            ];
        ?>
            <?php
            // [1.6.380] Multa pendente (congelada) — renovou o VIP mas ficou
            // multa por atraso por pagar. A equipa só continua depois de paga.
            $rmbz_ovf = function_exists('rmbz_project_overdue_info') ? rmbz_project_overdue_info($user_telemovel) : ['overdue'=>false];
            if ( ! empty($rmbz_ovf['frozen']) && ! empty($rmbz_ovf['enabled']) && (float)($rmbz_ovf['amount'] ?? 0) > 0 ):
                $rmbz_ovf_unit_h = ( ($rmbz_ovf['unit'] ?? 'day') === 'hour' );
            ?>
                <div style="background:linear-gradient(160deg,rgba(217,48,37,.12),rgba(217,48,37,.04));border:1px solid rgba(217,48,37,.45);border-radius:14px;padding:16px 18px;margin:0 0 16px;color:#ffd9d4;font-size:14px;line-height:1.5;text-align:center;">
                    💸 <strong style="color:#fff;">Tens uma multa pendente de <?php echo esc_html( number_format( (float)$rmbz_ovf['amount'], 2, ',', '.' ) ); ?> MT</strong> no teu videoclipe.
                    <div style="margin-top:6px;color:#f3c7c2;">
                        Renovaste o VIP, mas esta multa por atraso ficou por pagar (<?php echo (int)$rmbz_ovf['units']; ?> <?php echo $rmbz_ovf_unit_h ? 'hora(s)' : 'dia(s)'; ?> × <?php echo esc_html( number_format( (float)$rmbz_ovf['rate'], 2, ',', '.' ) ); ?> MT/<?php echo $rmbz_ovf_unit_h ? 'hora' : 'dia'; ?>).
                        <strong style="color:#fff;">A equipa só continua a produção depois de a multa ser resolvida</strong> — paga a multa no teu projeto (em "Produção Vídeos").
                    </div>
                    <div style="margin-top:12px;text-align:center;">
                        <a href="#" onclick="document.getElementById('rmbz-fine-info').style.display='flex';return false;" style="display:inline-block;background:rgba(255,255,255,.16);color:#fff;font-weight:600;font-size:12px;padding:7px 16px;border-radius:8px;text-decoration:none;">ℹ️ Saiba mais</a>
                    </div>
                </div>
                <?php rmbz_render_fine_info_modal(); ?>
            <?php endif; ?>
            <div class="rmbz-feature-card rmbz-feature-card--success rmbz-feature-card--vip">
                <div class="rmbz-feature-card__body">
                    <div class="rmbz-feature-card__head">
                        <span class="rmbz-feature-card__icon"><?php echo $icon_diamond; ?></span>
                        <div>
                            <h3 class="rmbz-feature-card__title"><?php esc_html_e( 'Acesso Artista VIP Activo', '1mz-for-artists' ); ?></h3>
                            <p class="rmbz-feature-card__subtitle">
                                <?php
                                printf(
                                    /* translators: %s = número de dias restantes */
                                    esc_html__( 'Válido por mais %s.', '1mz-for-artists' ),
                                    '<strong style="color:var(--rmbz-text-primary);font-variant-numeric:tabular-nums;">'
                                    . esc_html( sprintf( _n( '%d dia', '%d dias', max(0, $days_left), '1mz-for-artists' ), max(0, $days_left) ) )
                                    . '</strong>'
                                );
                                ?>
                            </p>
                        </div>
                    </div>

                    <div class="rmbz-feature-card__action">
                        <?php
                        echo rmbz_btn([
                            'label'   => __( 'Novo Lançamento', '1mz-for-artists' ),
                            'variant' => 'success',
                            'icon'    => $icon_plus,
                            'href'    => home_url('/area-artista/'),
                        ]);
                        ?>
                    </div>
                </div>

                <?php
                // Divisor + lista de permissões inline
                ?>
                <div class="rmbz-feature-card__perms">
                    <h5 class="rmbz-feature-card__perms-heading">
                        <?php esc_html_e( 'O seu plano inclui:', '1mz-for-artists' ); ?>
                    </h5>
                    <ul class="rmbz-perm-list rmbz-perm-list--inline">
                        <?php foreach ( $perm_labels as $key => $label ): ?>
                            <li class="rmbz-perm-list__item<?php echo !empty($perms[$key]) ? ' is-active' : ''; ?>"
                                <?php if ( empty($perms[$key]) ): ?>title="<?php esc_attr_e( 'Não incluído no seu plano.', '1mz-for-artists' ); ?>"<?php endif; ?>>
                                <?php echo esc_html( $label ); ?>
                            </li>
                        <?php endforeach; ?>
                    </ul>
                </div>
            </div>
        <?php else:
            // [1.6.332] Aviso de multa por atraso — projeto de vídeo em curso
            // com a subscrição expirada. Mostrado no topo do ecrã de renovação.
            $rmbz_ov = function_exists('rmbz_project_overdue_info') ? rmbz_project_overdue_info($user_telemovel) : ['overdue'=>false];
            if ( ! empty($rmbz_ov['overdue']) ): ?>
                <div style="background:linear-gradient(135deg,rgba(217,48,37,.14),rgba(217,48,37,.04));border:1px solid rgba(217,48,37,.5);border-left:4px solid #d93025;border-radius:12px;padding:16px 18px;margin:0 0 20px;color:#ffd9d4;font-size:14px;line-height:1.5;">
                    🎬 <strong style="color:#fff;">O teu videoclipe está em produção, mas a tua subscrição expirou.</strong>
                    <div style="margin-top:6px;color:#f3c7c2;">A equipa só pode continuar com a subscrição ativa.
                    <?php if ( ! empty($rmbz_ov['enabled']) ):
                        $rmbz_ov_unit_h = ( $rmbz_ov['unit'] === 'hour' );
                        $rmbz_ov_rate_lbl = number_format( (float) $rmbz_ov['rate'], 2, ',', '.' ) . ' MT/' . ( $rmbz_ov_unit_h ? 'hora' : 'dia' );
                        $rmbz_ov_unit_lbl = $rmbz_ov_unit_h ? 'hora(s)' : 'dia(s)';
                    ?>
                        Multa de <strong style="color:#fff;"><?php echo esc_html( $rmbz_ov_rate_lbl ); ?></strong> —
                        já acumulou <strong style="color:#fff;"><?php echo esc_html( number_format( (float) $rmbz_ov['amount'], 2, ',', '.' ) ); ?> MT</strong>
                        (<?php echo (int) $rmbz_ov['units']; ?> <?php echo esc_html( $rmbz_ov_unit_lbl ); ?> de atraso).
                        <strong style="color:#fff;">Renova já para parar a multa</strong> e a equipa continuar.
                    <?php else: ?>
                        <strong style="color:#fff;">Renova já</strong> para a equipa continuar a produção.
                    <?php endif; ?>
                    </div>
                    <div style="margin-top:12px;">
                        <a href="#" onclick="document.getElementById('rmbz-fine-info').style.display='flex';return false;" style="display:inline-block;background:rgba(255,255,255,.16);color:#fff;font-weight:600;font-size:12px;padding:7px 16px;border-radius:8px;text-decoration:none;">ℹ️ Saiba mais</a>
                    </div>
                </div>
                <?php rmbz_render_fine_info_modal(); ?>
            <?php endif;
            $pacotes = get_option('rmbz_vip_packages', []);
            // [1.6.118.20] Filtrar pacotes 'app_only' — não devem aparecer no site
            $pacotes = array_values( array_filter( $pacotes, function( $p ) {
                $ch = isset($p['channel']) ? $p['channel'] : 'both';
                return $ch !== 'app_only';
            } ) );
            // Fallback de emergência caso o admin ainda não tenha criado nenhum pacote
            if (empty($pacotes)):
                $pacotes = [[
                    'id' => 'default', 'nome' => 'Acesso VIP', 'preco' => get_option('rmbz_sub_price', 1500), 'dias' => 30,
                    'perms' => ['distribute'=>1, 'site'=>1, 'social'=>1, 'video'=>1]
                ]];
            endif;

            // [DS 1.5.40] Ícones SVG para estado bloqueado + pacotes
            $icon_lock_big = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">'
                           . '<rect x="5" y="11" width="14" height="10" rx="1.8" stroke="currentColor" stroke-width="1.8"/>'
                           . '<path d="M8 11V7a4 4 0 018 0v4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>'
                           . '</svg>';
        ?>
            <div class="rmbz-feature-card rmbz-feature-card--danger">
                <div class="rmbz-feature-card__body">
                    <div class="rmbz-feature-card__head">
                        <span class="rmbz-feature-card__icon"><?php echo $icon_lock_big; ?></span>
                        <div>
                            <h3 class="rmbz-feature-card__title"><?php esc_html_e( 'Acesso aos Serviços Bloqueado', '1mz-for-artists' ); ?></h3>
                            <p class="rmbz-feature-card__subtitle">
                                <?php esc_html_e( 'Não tem subscrição activa. Active um dos pacotes abaixo para aceder à distribuição nas lojas, redes sociais, lançamentos e videoclipes.', '1mz-for-artists' ); ?>
                            </p>
                        </div>
                    </div>
                </div>
            </div>

            <?php
            // Grid de Pacotes VIP
            $pack_perm_labels = [
                'site'       => __( 'Músicas no Site', '1mz-for-artists' ),
                'social'     => __( 'Promoção nas Redes', '1mz-for-artists' ),
                'distribute' => __( 'Distribuição (Lojas)', '1mz-for-artists' ),
                'video'      => __( 'Candidatar a Videoclipe', '1mz-for-artists' ),
            ];
            ?>
            <div style="margin-bottom:var(--rmbz-space-8);">
                <div style="text-align:center;margin-bottom:var(--rmbz-space-5);">
                    <h3 style="margin:0 0 var(--rmbz-space-2) 0;font-family:var(--rmbz-font-display);font-size:var(--rmbz-text-2xl);font-weight:var(--rmbz-weight-bold);color:var(--rmbz-text-primary);letter-spacing:var(--rmbz-tracking-tight);">
                        <?php esc_html_e( 'Escolha o seu Plano', '1mz-for-artists' ); ?>
                    </h3>
                    <p style="margin:0;font-size:var(--rmbz-text-sm);color:var(--rmbz-text-muted);">
                        <?php esc_html_e( 'Seleccione o pacote que melhor se adapta aos objectivos da sua carreira.', '1mz-for-artists' ); ?>
                    </p>
                </div>

                <style>
                    .rmbz-dur-field{display:block;margin:0 0 10px;}
                    .rmbz-dur-label{display:block;font-size:var(--rmbz-text-xs,12px);font-weight:600;color:var(--rmbz-text-muted,#64748b);margin-bottom:4px;letter-spacing:.3px;}
                    .rmbz-dur-select{width:100%;padding:9px 12px;border-radius:12px;border:1px solid var(--rmbz-border,rgba(0,0,0,.12));background:var(--rmbz-surface,#fff);color:var(--rmbz-text-primary,#0f172a);font-size:14px;font-weight:500;cursor:pointer;}
                    .rmbz-dur-select:focus{outline:none;border-color:var(--rmbz-accent,#f0b90b);box-shadow:0 0 0 3px rgba(240,185,11,.18);}
                </style>
                <div class="rmbz-price-grid">
                    <?php foreach ( $pacotes as $pack ):
                        $p_perms = isset($pack['perms']) && is_array($pack['perms']) ? $pack['perms'] : [];
                        $is_popular = !empty($pack['popular']);  // futuro: admin pode marcar um como "popular"
                        $card_classes = 'rmbz-price-card' . ( $is_popular ? ' rmbz-price-card--popular' : '' );
                        // [1.5.291] Add-on do Assistente de IA.
                        $pack_ai_offered = ! empty( $pack['ai_offered'] );
                        $pack_ai_price   = isset( $pack['ai_price'] ) ? (float) $pack['ai_price'] : 0.0;
                        $pack_ai_price_fmt = number_format( $pack_ai_price, 2, ',', '.' );
                        // [1.5.372] Opções de duração (1/2/3/4/12 meses) com preços calculados.
                        $pack_durations = function_exists( 'rmbz_vip_package_duration_options' )
                            ? rmbz_vip_package_duration_options( $pack ) : [];
                    ?>
                        <div class="<?php echo esc_attr( $card_classes ); ?>"<?php echo $is_popular ? ' data-badge="' . esc_attr__( 'Mais Popular', '1mz-for-artists' ) . '"' : ''; ?>>
                            <div class="rmbz-price-card__header">
                                <h4 class="rmbz-price-card__name"><?php echo esc_html( $pack['nome'] ); ?></h4>
                                <div class="rmbz-price-card__price">
                                    <span class="rmbz-price-card__amount" data-role="amount"><?php echo esc_html( number_format( $pack['preco'], 2, ',', '.' ) ); ?></span>
                                    <span class="rmbz-price-card__unit">MT</span>
                                </div>
                                <span class="rmbz-price-card__period" data-role="period">
                                    <?php
                                    printf(
                                        /* translators: %d = número de dias */
                                        esc_html__( 'Válido por %d dias', '1mz-for-artists' ),
                                        intval( $pack['dias'] )
                                    );
                                    ?>
                                </span>
                            </div>

                            <div class="rmbz-price-card__body">
                                <ul class="rmbz-perm-list">
                                    <?php foreach ( $pack_perm_labels as $key => $label ): ?>
                                        <li class="rmbz-perm-list__item<?php echo !empty($p_perms[$key]) ? ' is-active' : ''; ?>">
                                            <?php echo esc_html( $label ); ?>
                                        </li>
                                    <?php endforeach; ?>
                                </ul>
                                <?php if ( $pack_ai_offered ): ?>
                                    <span class="rmbz-price-card__ai-badge">
                                        🤖 <?php esc_html_e( 'Assistente de IA disponível', '1mz-for-artists' ); ?> +<?php echo esc_html( $pack_ai_price_fmt ); ?> MT
                                    </span>
                                <?php endif; ?>
                            </div>

                            <div class="rmbz-price-card__footer">
                                <form method="post"
                                      action="<?php echo esc_url( admin_url('admin-post.php') ); ?>"
                                      onsubmit="return confirm('<?php echo esc_js(
                                          sprintf(
                                              __( 'Confirmar compra do plano %s? O total (duração + Assistente de IA, se marcado) será deduzido do seu saldo.', '1mz-for-artists' ),
                                              $pack['nome']
                                          )
                                      ); ?>');">
                                    <input type="hidden" name="action" value="rmbz_buy_vip_package">
                                    <input type="hidden" name="package_id" value="<?php echo esc_attr( $pack['id'] ); ?>">
                                    <?php wp_nonce_field('rmbz_buy_package_nonce'); ?>

                                    <?php // [1.5.372] Seletor de duração (1/2/3/4/12 meses). ?>
                                    <?php if ( ! empty( $pack_durations ) ): ?>
                                        <label class="rmbz-dur-field">
                                            <span class="rmbz-dur-label"><?php esc_html_e( 'Duração', '1mz-for-artists' ); ?></span>
                                            <select name="months" class="rmbz-dur-select" data-role="months">
                                                <?php foreach ( $pack_durations as $d ): ?>
                                                    <option value="<?php echo (int) $d['months']; ?>"
                                                            data-price="<?php echo esc_attr( $d['price'] ); ?>"
                                                            data-price-ai="<?php echo esc_attr( $d['price_with_ai'] ); ?>"
                                                            data-days="<?php echo (int) $d['days']; ?>">
                                                        <?php
                                                        echo esc_html( $d['label'] );
                                                        if ( (float) $d['discount_pct'] > 0 ) {
                                                            echo ' — ' . esc_html( rtrim( rtrim( number_format( (float) $d['discount_pct'], 1, ',', '.' ), '0' ), ',' ) ) . '% OFF';
                                                        }
                                                        ?>
                                                    </option>
                                                <?php endforeach; ?>
                                            </select>
                                        </label>
                                    <?php endif; ?>

                                    <?php if ( $pack_ai_offered ): ?>
                                        <label class="rmbz-price-card__ai-opt">
                                            <input type="checkbox" name="include_ai" value="1" data-role="ai" checked>
                                            <span>
                                                <span class="rmbz-ai-opt-title">🤖 <?php esc_html_e( 'Incluir Assistente de IA', '1mz-for-artists' ); ?> <span class="rmbz-ai-opt-price">+<?php echo esc_html( $pack_ai_price_fmt ); ?> MT</span></span>
                                                <span class="rmbz-ai-opt-desc"><?php esc_html_e( 'Insights, dicas, legendas, plano de lançamento e mais.', '1mz-for-artists' ); ?></span>
                                            </span>
                                        </label>
                                    <?php endif; ?>
                                    <?php
                                    echo rmbz_btn([
                                        'label'   => __( 'Comprar Plano', '1mz-for-artists' ),
                                        'variant' => $is_popular ? 'primary' : 'outline',
                                        'type'    => 'submit',
                                        'full'    => true,
                                    ]);
                                    ?>
                                </form>
                            </div>
                        </div>
                    <?php endforeach; ?>
                </div>
            </div>

            <?php // [1.5.372] Recalcular preço/dias ao mudar duração ou IA. ?>
            <script>
            (function(){
                function fmt(n){ return Number(n).toLocaleString('pt-PT', {minimumFractionDigits:2, maximumFractionDigits:2}); }
                document.querySelectorAll('.rmbz-price-card').forEach(function(card){
                    var sel = card.querySelector('[data-role="months"]');
                    var amount = card.querySelector('[data-role="amount"]');
                    var period = card.querySelector('[data-role="period"]');
                    var ai = card.querySelector('[data-role="ai"]');
                    if (!sel || !amount) return;
                    function recalc(){
                        var opt = sel.options[sel.selectedIndex];
                        if (!opt) return;
                        var useAi = ai && ai.checked;
                        var price = parseFloat(useAi ? opt.getAttribute('data-price-ai') : opt.getAttribute('data-price'));
                        var days = parseInt(opt.getAttribute('data-days'), 10);
                        if (!isNaN(price)) amount.textContent = fmt(price);
                        if (period && !isNaN(days)) period.textContent = 'Válido por ' + days + ' dias';
                    }
                    sel.addEventListener('change', recalc);
                    if (ai) ai.addEventListener('change', recalc);
                    recalc();
                });
            })();
            </script>
        <?php endif; ?>

        <?php
        // [DS 1.5.39] Ícone SVG para Distribuição (globo com ondas)
        $icon_distro = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">'
                     . '<circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="1.8"/>'
                     . '<path d="M3 12h18M12 3a14 14 0 010 18M12 3a14 14 0 000 18" stroke="currentColor" stroke-width="1.8"/>'
                     . '</svg>';
        $icon_arrow_right = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                          . '<path d="M5 10h10m0 0l-4-4m4 4l-4 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>'
                          . '</svg>';
        // [DS 1.5.58 → 1.5.59] Mini-ícones SVG para os 3 stat-pills.
        $icon_dollar = '<svg viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="rmbz-stat-pill__icon" aria-hidden="true">'
                     . '<path d="M7 1v12M10 4.5C10 3 8.66 2 7 2S4 3 4 4.5 5.34 7 7 7s3 1 3 2.5S8.66 12 7 12s-3-1-3-2.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/>'
                     . '</svg>';
        // Nota musical (releases publicados)
        $icon_note = '<svg viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="rmbz-stat-pill__icon" aria-hidden="true">'
                   . '<path d="M5 11V3l7-1v8M5 11a2 2 0 11-2-2 2 2 0 012 2zm7-3a2 2 0 11-2-2 2 2 0 012 2z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>'
                   . '</svg>';
        // Triângulo de aviso (atenções pendentes)
        $icon_warn = '<svg viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="rmbz-stat-pill__icon" aria-hidden="true">'
                   . '<path d="M7 2l6 10H1L7 2zM7 6v3M7 11v.01" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>'
                   . '</svg>';
        ?>
        <div class="rmbz-feature-card rmbz-feature-card--accent">
            <div class="rmbz-feature-card__body">
                <div class="rmbz-feature-card__head">
                    <span class="rmbz-feature-card__icon"><?php echo $icon_distro; ?></span>
                    <div>
                        <h3 class="rmbz-feature-card__title"><?php esc_html_e( 'Distribuição Digital', '1mz-for-artists' ); ?></h3>
                        <p class="rmbz-feature-card__subtitle">
                            <?php esc_html_e( 'Lance as suas músicas no Spotify, Apple Music, TikTok e 150+ lojas.', '1mz-for-artists' ); ?>
                        </p>
                        <?php
                        // [DS 1.5.59] Wrapper de stat-pills — só renderiza se houver
                        // pelo menos 1 métrica para mostrar (evita div vazio).
                        $has_any_stat = ( $distro_balance_usd > 0 )
                                     || ( $distro_live_count > 0 )
                                     || ( $distro_attention_count > 0 );
                        ?>
                        <?php if ( $has_any_stat ): ?>
                            <div class="rmbz-stat-pills">

                                <?php // PILL 1 — Ganhos (dourado), só se > 0 ?>
                                <?php if ( $distro_balance_usd > 0 ): ?>
                                    <span class="rmbz-stat-pill rmbz-stat-pill--brand"
                                          aria-label="<?php
                                          /* translators: %s = montante em USD */
                                          printf(
                                              esc_attr__( 'Ganhos: %s dólares', '1mz-for-artists' ),
                                              esc_attr( number_format( $distro_balance_usd, 2 ) )
                                          );
                                          ?>">
                                        <?php echo $icon_dollar; ?>
                                        <span class="rmbz-stat-pill__value"><?php echo esc_html( number_format( $distro_balance_usd, 2 ) ); ?></span>
                                        <span class="rmbz-stat-pill__label"><?php esc_html_e( 'ganhos', '1mz-for-artists' ); ?></span>
                                    </span>
                                <?php endif; ?>

                                <?php // PILL 2 — Músicas publicadas (azul), só se > 0 ?>
                                <?php if ( $distro_live_count > 0 ): ?>
                                    <span class="rmbz-stat-pill rmbz-stat-pill--accent"
                                          aria-label="<?php
                                          printf(
                                              esc_attr( _n( '%d música publicada nas lojas', '%d músicas publicadas nas lojas', $distro_live_count, '1mz-for-artists' ) ),
                                              $distro_live_count
                                          );
                                          ?>">
                                        <?php echo $icon_note; ?>
                                        <span class="rmbz-stat-pill__value"><?php echo esc_html( $distro_live_count ); ?></span>
                                        <span class="rmbz-stat-pill__label"><?php
                                            echo esc_html( _n( 'música', 'músicas', $distro_live_count, '1mz-for-artists' ) );
                                        ?></span>
                                    </span>
                                <?php endif; ?>

                                <?php // PILL 3 — Atenções pendentes (laranja com pulse), só se > 0 ?>
                                <?php if ( $distro_attention_count > 0 ): ?>
                                    <span class="rmbz-stat-pill rmbz-stat-pill--warning"
                                          aria-label="<?php
                                          printf(
                                              esc_attr( _n( '%d release devolvido para correcção — requer a sua atenção', '%d releases devolvidos para correcção — requerem a sua atenção', $distro_attention_count, '1mz-for-artists' ) ),
                                              $distro_attention_count
                                          );
                                          ?>">
                                        <?php echo $icon_warn; ?>
                                        <span class="rmbz-stat-pill__value"><?php echo esc_html( $distro_attention_count ); ?></span>
                                        <span class="rmbz-stat-pill__label"><?php
                                            echo esc_html( _n( 'atenção', 'atenções', $distro_attention_count, '1mz-for-artists' ) );
                                        ?></span>
                                    </span>
                                <?php endif; ?>

                            </div>
                        <?php endif; ?>
                    </div>
                </div>

                <div class="rmbz-feature-card__action">
                    <?php
                    echo rmbz_btn([
                        'label'   => __( 'Abrir Dashboard Digital', '1mz-for-artists' ),
                        'variant' => 'accent',
                        'icon'    => $icon_arrow_right,
                        'href'    => '/dashboard-digital',
                    ]);
                    ?>
                </div>
            </div>
        </div>

        <div class="rmbz-feature-card rmbz-feature-card--brand rmbz-feature-card--saldo m3-balance">
            <span class="m3-balance__label">
                <?php esc_html_e( 'Património Total (Carteira + Royalties)', '1mz-for-artists' ); ?>
            </span>
            <div class="m3-balance__value">
                <b><?php echo esc_html( number_format( $total_assets_mt, 2, ',', '.' ) ); ?></b>
                <span>MT</span>
            </div>

            <div class="m3-balance__split">
                <div class="m3-mini">
                    <div class="m3-mini__k"><?php esc_html_e( 'Carteira', '1mz-for-artists' ); ?></div>
                    <div class="m3-mini__v"><?php echo esc_html( number_format( $wallet_balance_mt, 2, ',', '.' ) ); ?> MT</div>
                </div>
                <div class="m3-mini">
                    <div class="m3-mini__k"><?php esc_html_e( 'Royalties', '1mz-for-artists' ); ?></div>
                    <div class="m3-mini__v">$<?php echo esc_html( number_format( $distro_balance_usd, 2 ) ); ?>
                        <span style="color:var(--rmbz-text-muted); font-weight:400; font-size:var(--rmbz-text-2xs);">(~<?php echo esc_html( number_format( $distro_balance_mt, 2, ',', '.' ) ); ?> MT)</span>
                    </div>
                </div>
            </div>

            <?php
                $w_extra = !empty($user->extra_data) ? json_decode($user->extra_data, true) : [];
                $bloq_deposito_user = !empty($w_extra['block_deposits']) ? true : false;
                $bloq_levantamento_user = !empty($w_extra['block_withdrawals']) ? true : false;

                // [1.6.47] Combinar com bloqueios globais (toda a plataforma)
                $bloq_deposito_global = function_exists('rmbz_is_globally_blocked')
                    ? rmbz_is_globally_blocked('deposits') : false;
                $bloq_levantamento_global = function_exists('rmbz_is_globally_blocked')
                    ? rmbz_is_globally_blocked('withdrawals') : false;

                $bloq_deposito = $bloq_deposito_user || $bloq_deposito_global;
                $bloq_levantamento = $bloq_levantamento_user || $bloq_levantamento_global;

                $tooltip_dep = $bloq_deposito_global
                    ? __( 'Depósitos temporariamente suspensos em toda a plataforma.', '1mz-for-artists' )
                    : __( 'Depósitos bloqueados pelo administrador.', '1mz-for-artists' );
                $tooltip_lev = $bloq_levantamento_global
                    ? __( 'Levantamentos temporariamente suspensos em toda a plataforma.', '1mz-for-artists' )
                    : __( 'Levantamentos bloqueados pelo administrador.', '1mz-for-artists' );
            ?>
            <div class="m3-balance__actions">
                <?php
                // ── DEPOSITAR ─────────────────────────────────────────────
                if ( $bloq_deposito ) {
                    echo '<button class="m3-btn m3-btn--tonal m3-btn--block" disabled style="opacity:0.5;cursor:not-allowed;" title="' . esc_attr( $tooltip_dep ) . '" aria-label="' . esc_attr( $tooltip_dep ) . '">'
                       . '<svg viewBox="0 0 20 20" width="18" height="18" fill="none"><rect x="4" y="9" width="12" height="9" rx="1.5" stroke="currentColor" stroke-width="1.8"/><path d="M7 9V6.5a3 3 0 016 0V9" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg> '
                       . esc_html__( 'Depositar', '1mz-for-artists' ) . '</button>';
                } else {
                    echo '<button id="rmbz-show-deposit-btn" class="m3-btn m3-btn--filled m3-btn--block">'
                       . '<svg viewBox="0 0 20 20" width="18" height="18" fill="none"><path d="M10 4v12m0-12l-4 4m4-4l4 4M4 17h12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> '
                       . esc_html__( 'Depositar', '1mz-for-artists' ) . '</button>';
                }

                // ── LEVANTAR ──────────────────────────────────────────────
                if ( $bloq_levantamento ) {
                    echo '<button class="m3-btn m3-btn--tonal m3-btn--block" disabled style="opacity:0.5;cursor:not-allowed;" title="' . esc_attr( $tooltip_lev ) . '" aria-label="' . esc_attr( $tooltip_lev ) . '">'
                       . '<svg viewBox="0 0 20 20" width="18" height="18" fill="none"><rect x="4" y="9" width="12" height="9" rx="1.5" stroke="currentColor" stroke-width="1.8"/><path d="M7 9V6.5a3 3 0 016 0V9" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg> '
                       . esc_html__( 'Levantar', '1mz-for-artists' ) . '</button>';
                } elseif ( $total_assets_mt >= RMBZ_MIN_WITHDRAWAL ) {
                    echo '<button id="rmbz-show-withdrawal-btn" class="m3-btn m3-btn--outlined m3-btn--block">'
                       . '<svg viewBox="0 0 20 20" width="18" height="18" fill="none"><path d="M10 16V4m0 12l-4-4m4 4l4-4M4 17h12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> '
                       . esc_html__( 'Levantar', '1mz-for-artists' ) . '</button>';
                }
                ?>
            </div>
        </div>
        
        <?php
        // [DS 1.5.39] Ícones SVG para cartão Referral
        $icon_gift = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">'
                   . '<rect x="3" y="8" width="18" height="13" rx="1.5" stroke="currentColor" stroke-width="1.8"/>'
                   . '<path d="M3 12h18M12 8v13" stroke="currentColor" stroke-width="1.8"/>'
                   . '<path d="M12 8s-3-5-6-3.5C3.5 5.5 5 8 8 8h4zm0 0s3-5 6-3.5C20.5 5.5 19 8 16 8h-4z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>'
                   . '</svg>';
        $icon_copy = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                   . '<rect x="7" y="7" width="10" height="10" rx="1.5" stroke="currentColor" stroke-width="1.8"/>'
                   . '<path d="M3 13V4.5A1.5 1.5 0 014.5 3H13" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>'
                   . '</svg>';
        ?>
        <?php
        // [1.5.131] Stats reais do referral. Se módulo não carregado (ex:
        // tabela em falta), usa valores zero — não falha.
        $ref_stats = function_exists('rmbz_referral_get_user_stats')
            ? rmbz_referral_get_user_stats( $user_telemovel )
            : ['count' => 0, 'mt_earned' => 0.0, 'days_earned' => 0, 'pending' => 0];

        $ref_type = get_option('rmbz_referral_type', 'mt');
        $ref_rate = (float) get_option('rmbz_referral_rate', 3.0);
        $ref_days = (int) get_option('rmbz_referral_days', 5);

        // Texto promocional consoante tipo
        if ( $ref_type === 'days' ) {
            $promo_text = sprintf(
                __( 'Partilhe o seu número. Ganha <strong>%d dia(s) VIP grátis</strong> quando o amigo fizer o 1º depósito + comprar plano.', '1mz-for-artists' ),
                $ref_days
            );
        } else {
            $promo_text = sprintf(
                __( 'Partilhe o seu número. Ganha <strong>%s%% em MT</strong> quando o amigo fizer o 1º depósito + comprar plano.', '1mz-for-artists' ),
                number_format($ref_rate, 1)
            );
        }

        // [1.5.134] Ícones SVG no mesmo formato que as stat-pills do card
        // Distribuição (viewBox 14×14, classe rmbz-stat-pill__icon).
        // [1.5.136] Removido `icon_mt` (era um SVG estilo cifrão `$` que
        // confundia a pill de MT). Para a pill MT usamos só texto "MT"
        // como prefixo (label antes do valor). Para dias VIP, novo
        // ícone de calendário.
        $icon_users = '<svg viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="rmbz-stat-pill__icon" aria-hidden="true">'
                    . '<circle cx="5" cy="5" r="2.2" stroke="currentColor" stroke-width="1.3"/>'
                    . '<path d="M1.5 12c0-1.9 1.6-3.4 3.5-3.4S8.5 10.1 8.5 12" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>'
                    . '<circle cx="10" cy="4" r="1.6" stroke="currentColor" stroke-width="1.3"/>'
                    . '<path d="M9 8.5c1.5 0 3 .9 3.5 2.5" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>'
                    . '</svg>';
        $icon_calendar = '<svg viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="rmbz-stat-pill__icon" aria-hidden="true">'
                       . '<rect x="2" y="3" width="10" height="9" rx="1.2" stroke="currentColor" stroke-width="1.3"/>'
                       . '<path d="M2 6h10M5 1.5v2.5M9 1.5v2.5" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>'
                       . '</svg>';
        $icon_clock = '<svg viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="rmbz-stat-pill__icon" aria-hidden="true">'
                    . '<circle cx="7" cy="7" r="5.5" stroke="currentColor" stroke-width="1.3"/>'
                    . '<path d="M7 4v3l2 1.5" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>'
                    . '</svg>';

        $has_any_ref_stat = ($ref_stats['count'] > 0) || ($ref_stats['pending'] > 0);
        ?>
        <div class="rmbz-feature-card rmbz-feature-card--success">
            <div class="rmbz-feature-card__body">
                <div class="rmbz-feature-card__head">
                    <span class="rmbz-feature-card__icon"><?php echo $icon_gift; ?></span>
                    <div>
                        <h3 class="rmbz-feature-card__title"><?php esc_html_e( 'Ganhe Saldo Extra', '1mz-for-artists' ); ?></h3>
                        <p class="rmbz-feature-card__subtitle">
                            <?php echo wp_kses( $promo_text, [ 'strong' => [] ] ); ?>
                        </p>

                        <?php /* [1.5.134] Stat-pills inline no MESMO padrão do card
                            Distribuição (rmbz-stat-pill com variantes --brand,
                            --accent, --warning). Cada pill aparece SÓ se tem valor
                            > 0 — assim o card fica vazio se não há atividade.
                            Variantes:
                              - --accent (verde-azul) : nº de convidados
                              - --brand (dourado)     : recompensa ganha (MT ou dias)
                              - --warning (laranja)   : convites pendentes
                        */ ?>
                        <?php if ( $has_any_ref_stat ): ?>
                            <div class="rmbz-stat-pills" style="margin-top:10px;">

                                <?php if ( $ref_stats['count'] > 0 ): ?>
                                    <span class="rmbz-stat-pill rmbz-stat-pill--accent"
                                          aria-label="<?php
                                          printf( esc_attr( _n( '%d amigo convidado com sucesso', '%d amigos convidados com sucesso', $ref_stats['count'], '1mz-for-artists' ) ), $ref_stats['count'] );
                                          ?>">
                                        <?php echo $icon_users; ?>
                                        <span class="rmbz-stat-pill__value"><?php echo (int) $ref_stats['count']; ?></span>
                                        <span class="rmbz-stat-pill__label"><?php
                                            echo esc_html( _n( 'amigo', 'amigos', $ref_stats['count'], '1mz-for-artists' ) );
                                        ?></span>
                                    </span>
                                <?php endif; ?>

                                <?php /* [1.5.136] Recompensa em MT — sem ícone SVG.
                                    "MT" aparece como label PREFIXO (antes do valor),
                                    leitura natural: "MT 15". O SVG anterior parecia
                                    um cifrão $ e baralhava o sentido (MZN, não USD).
                                    [1.5.137] Como o CSS de .rmbz-stat-pill__label aplica
                                    margin-LEFT (assumindo label DEPOIS do value), aqui
                                    invertemos com margin-right inline para haver espaço
                                    entre "MT" e "15". */ ?>
                                <?php if ( $ref_stats['mt_earned'] > 0 ): ?>
                                    <span class="rmbz-stat-pill rmbz-stat-pill--brand"
                                          aria-label="<?php printf( esc_attr__( '%s MT ganhos', '1mz-for-artists' ), esc_attr( number_format( $ref_stats['mt_earned'], 2 ) ) ); ?>">
                                        <span class="rmbz-stat-pill__label" style="margin-left:0;margin-right:var(--rmbz-space-2,8px);">MT</span>
                                        <span class="rmbz-stat-pill__value"><?php echo esc_html( number_format( $ref_stats['mt_earned'], 0, ',', '.' ) ); ?></span>
                                    </span>
                                <?php endif; ?>

                                <?php // Recompensa ganha (dias VIP) ?>
                                <?php if ( $ref_stats['days_earned'] > 0 ): ?>
                                    <span class="rmbz-stat-pill rmbz-stat-pill--brand"
                                          aria-label="<?php printf( esc_attr( _n( '%d dia VIP ganho', '%d dias VIP ganhos', $ref_stats['days_earned'], '1mz-for-artists' ) ), $ref_stats['days_earned'] ); ?>">
                                        <?php echo $icon_calendar; ?>
                                        <span class="rmbz-stat-pill__value"><?php echo (int) $ref_stats['days_earned']; ?></span>
                                        <span class="rmbz-stat-pill__label"><?php
                                            echo esc_html( _n( 'dia VIP', 'dias VIP', $ref_stats['days_earned'], '1mz-for-artists' ) );
                                        ?></span>
                                    </span>
                                <?php endif; ?>

                                <?php if ( $ref_stats['pending'] > 0 ): ?>
                                    <span class="rmbz-stat-pill rmbz-stat-pill--warning"
                                          aria-label="<?php printf( esc_attr( _n( '%d convite a aguardar 1º depósito + plano', '%d convites a aguardar 1º depósito + plano', $ref_stats['pending'], '1mz-for-artists' ) ), $ref_stats['pending'] ); ?>"
                                          title="<?php esc_attr_e( 'Aguardam o amigo fazer o 1º depósito + comprar plano', '1mz-for-artists' ); ?>">
                                        <?php echo $icon_clock; ?>
                                        <span class="rmbz-stat-pill__value"><?php echo (int) $ref_stats['pending']; ?></span>
                                        <span class="rmbz-stat-pill__label"><?php
                                            echo esc_html( _n( 'pendente', 'pendentes', $ref_stats['pending'], '1mz-for-artists' ) );
                                        ?></span>
                                    </span>
                                <?php endif; ?>

                            </div>
                        <?php endif; ?>
                    </div>
                </div>

                <div class="rmbz-feature-card__action">
                    <input type="text"
                           id="referral-code-input"
                           value="<?php echo esc_attr( $user_telemovel ?? '' ); ?>"
                           readonly
                           class="rmbz-input"
                           style="width:180px;text-align:center;font-family:var(--rmbz-font-mono);font-weight:600;letter-spacing:0.05em;">
                    <?php
                    echo rmbz_btn([
                        'label'   => __( 'Copiar', '1mz-for-artists' ),
                        'variant' => 'outline',
                        'icon'    => $icon_copy,
                        'attrs'   => [
                            'id' => 'copy-referral-code-btn',
                        ],
                    ]);
                    ?>
                </div>
            </div>
        </div>
        <?php
        // [DS 1.5.41] Tabs modernizadas — design system .rmbz-tabs.
        // Classes antigas (.account-tabs, .tab-link, data-tab) preservadas
        // para o JS de switching continuar a funcionar sem alterações.
        // Ícones SVG inline em vez de emoji (visual consistente em qualquer
        // browser). Estrutura semântica: role="tablist" + role="tab"
        // + aria-selected para acessibilidade.
        $tab_icon_inbox = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                        . '<path d="M3 10v5a2 2 0 002 2h10a2 2 0 002-2v-5M3 10l3-7h8l3 7M3 10h4l1 2h4l1-2h4" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>'
                        . '</svg>';
        $tab_icon_video = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                        . '<rect x="2.5" y="5" width="11" height="10" rx="1.5" stroke="currentColor" stroke-width="1.6"/>'
                        . '<path d="M14 8.5l4-2v7l-4-2v-3z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>'
                        . '</svg>';
        $tab_icon_music = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                        . '<path d="M8 16V4l9-1.5v12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>'
                        . '<circle cx="6" cy="16" r="2" stroke="currentColor" stroke-width="1.6"/>'
                        . '<circle cx="15" cy="14.5" r="2" stroke="currentColor" stroke-width="1.6"/>'
                        . '</svg>';
        $tab_icon_finance = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">'
                          . '<path d="M3 17V8m4 9V5m4 12v-7m4 7V3" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>'
                          . '</svg>';
        ?>
        <div class="rmbz-tabs account-tabs m3-tabs" role="tablist" aria-label="<?php esc_attr_e( 'Secções da minha conta', '1mz-for-artists' ); ?>">
            <button class="rmbz-tab tab-link m3-tab active"
                    data-tab="tab-submissions"
                    role="tab"
                    aria-selected="true"
                    aria-controls="tab-submissions"
                    type="button">
                <span class="rmbz-tab__icon"><?php echo $tab_icon_inbox; ?></span>
                <span class="rmbz-tab__label"><?php esc_html_e( 'Envios &amp; Promoções', '1mz-for-artists' ); ?></span>
            </button>
            <button class="rmbz-tab tab-link m3-tab"
                    data-tab="tab-contracts"
                    role="tab"
                    aria-selected="false"
                    aria-controls="tab-contracts"
                    type="button">
                <span class="rmbz-tab__icon"><?php echo $tab_icon_video; ?></span>
                <span class="rmbz-tab__label"><?php esc_html_e( 'Produção Vídeos', '1mz-for-artists' ); ?></span>
            </button>
            <button class="rmbz-tab tab-link m3-tab"
                    data-tab="tab-releases"
                    role="tab"
                    aria-selected="false"
                    aria-controls="tab-releases"
                    type="button">
                <span class="rmbz-tab__icon"><?php echo $tab_icon_music; ?></span>
                <span class="rmbz-tab__label"><?php esc_html_e( 'Meus Lançamentos', '1mz-for-artists' ); ?></span>
            </button>
            <button class="rmbz-tab tab-link m3-tab"
                    data-tab="tab-history"
                    role="tab"
                    aria-selected="false"
                    aria-controls="tab-history"
                    type="button">
                <span class="rmbz-tab__icon"><?php echo $tab_icon_finance; ?></span>
                <span class="rmbz-tab__label"><?php esc_html_e( 'Finanças', '1mz-for-artists' ); ?></span>
            </button>
        </div>
<style>
            .onemz-rotate-warning { display: none; }
            @media screen and (max-width: 768px) and (orientation: portrait) {
                .onemz-rotate-warning {
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    gap: 12px;
                    background: rgba(240, 185, 11, 0.1);
                    border: 1px solid #f0b90b;
                    border-left: 4px solid #f0b90b;
                    padding: 12px 15px;
                    border-radius: 6px;
                    margin: 20px 0 10px 0;
                    animation: pulseGlow 2s infinite;
                }
                .onemz-rotate-warning p {
                    margin: 0; color: #ccc; font-size: 12px; line-height: 1.4;
                }
                .onemz-rotate-warning strong { color: #f0b90b; }
            }
            @keyframes pulseGlow {
                0% { box-shadow: 0 0 0 0 rgba(240, 185, 11, 0.4); }
                70% { box-shadow: 0 0 0 6px rgba(240, 185, 11, 0); }
                100% { box-shadow: 0 0 0 0 rgba(240, 185, 11, 0); }
            }
        </style>

        <div class="onemz-rotate-warning">
            <span style="font-size: 24px;">📱🔄</span>
            <p><strong>Dica de Visualização:</strong> Para ler orçamentos e preencher contratos com facilidade, recomendamos que <strong>deite o seu telemóvel</strong> na horizontal.</p>
        </div>
        <div id="tab-submissions" class="account-tab-content active">
            <?php if ( empty($submissions) ) : echo '<p style="color:var(--rmbz-text-muted); text-align:center; padding:var(--rmbz-space-6);">Nenhum envio encontrado nesta página.</p>'; else: ?>
                <div class="m3-grid" style="margin-top:var(--rmbz-space-4);">
                    <?php foreach ($submissions as $sub) : 
                        $extra = !empty($sub->extra_data) ? json_decode($sub->extra_data, true) : [];
                        $img_src = ($sub->scenario_type === 'Publicação Site' && !empty($extra['cover_image'])) ? $extra['cover_image'] : (($sub->scenario_type === 'Redes Sociais' && !empty($extra['thumbnail_url'])) ? $extra['thumbnail_url'] : '');
                        
                        $st = $sub->review_status;
                        if($st == 'pendente') { $lbl = 'Em Análise'; $status_color = '#f0b90b'; $badge_bg = 'rgba(240,185,11,0.15)'; }
                        elseif($st == 'aprovado') { $lbl = 'Aprovado (Aguardando)'; $status_color = '#3498db'; $badge_bg = 'rgba(52,152,219,0.15)'; }
                        elseif($st == 'em_publicacao') { $lbl = 'Em Publicação'; $status_color = '#e67e22'; $badge_bg = 'rgba(230,126,34,0.15)'; }
                        elseif($st == 'finalizado') { $lbl = 'Finalizado (Postado)'; $status_color = '#2ecc71'; $badge_bg = 'rgba(46,204,113,0.15)'; }
                        elseif($st == 'correcao') { $lbl = 'Ação Necessária'; $status_color = '#e67e22'; $badge_bg = 'rgba(230,126,34,0.15)'; }
                        else { $lbl = 'Rejeitado'; $status_color = '#e74c3c'; $badge_bg = 'rgba(231,76,60,0.15)'; }

                        $is_album = isset($extra['is_album']) && $extra['is_album'] == true;
                    ?>
                    <div class="m3-card" style="padding:0; overflow:hidden;">
                        <?php if ($img_src): ?>
                            <div style="height:160px; background:url('<?php echo esc_url($img_src); ?>') center center/cover;"></div>
                        <?php else: ?>
                            <div style="height:110px; background:var(--rmbz-bg-elevated); display:flex; align-items:center; justify-content:center; color:var(--rmbz-text-disabled); font-size:30px;">🎵</div>
                        <?php endif; ?>
                        
                        <div style="padding:var(--rmbz-space-4);">
                            <h4 style="margin:0 0 var(--rmbz-space-2) 0; font-size:var(--rmbz-text-base); color:var(--rmbz-text-primary); font-family:var(--rmbz-font-display); font-weight:600;">
                                <?php echo esc_html($sub->music_title ?? ''); ?>
                                <?php if($is_album) echo '<span class="m3-badge" style="background:var(--rmbz-brand-soft); color:var(--rmbz-brand); margin-left:6px; vertical-align:middle;">ÁLBUM</span>'; ?>
                            </h4>
                            <span class="m3-badge" style="background:var(--rmbz-bg-elevated); color:var(--rmbz-text-secondary); text-transform:uppercase;"><?php echo esc_html($sub->scenario_type ?? ''); ?></span>
                            
                            <div style="margin-top:var(--rmbz-space-4); font-size:var(--rmbz-text-xs); color:var(--rmbz-text-muted); border-top:1px solid rgba(255,255,255,0.06); padding-top:var(--rmbz-space-3);">
                                <div style="display:flex; justify-content:space-between; margin-bottom:var(--rmbz-space-2);"><span>Data:</span> <strong style="color:var(--rmbz-text-secondary);"><?php echo date('d/m/y', strtotime($sub->submission_date)); ?></strong></div>
                                <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:var(--rmbz-space-3);"><span>Estado:</span> <span class="m3-badge" style="background:<?php echo $badge_bg; ?>; color:<?php echo $status_color; ?>;"><?php echo esc_html($lbl ?? ''); ?></span></div>
                                
                                <?php
                                // [1.6.118.128] Publicação agendada: se há data e ainda não chegou,
                                // mostra contagem decrescente e esconde os links. A data está em UTC.
                                $sched_raw = $extra['scheduled_publish_at'] ?? '';
                                $publish_ts = $sched_raw !== '' ? strtotime( $sched_raw . ' UTC' ) : 0;
                                $is_sched_pending = ( $publish_ts > 0 && $publish_ts > time() );
                                if ( $is_sched_pending ):
                                    $cd_id = 'rmbz-cd-' . (int) $sub->id;
                                ?>
                                    <div style="margin-top:var(--rmbz-space-3); background:linear-gradient(135deg,#1a1a1f,#23232b); border:1px solid var(--rmbz-brand,#f0b90b); border-radius:var(--rmbz-radius-lg,16px); padding:var(--rmbz-space-4); text-align:center;">
                                        <div style="font-size:22px;">🚀</div>
                                        <div style="color:var(--rmbz-brand,#f0b90b); font-weight:800; font-size:13px; margin:4px 0 2px; text-transform:uppercase; letter-spacing:0.5px;">Publicação agendada</div>
                                        <div style="color:#aaa; font-size:11px; margin-bottom:10px;">Os links ficam disponíveis quando o tempo terminar.</div>
                                        <div id="<?php echo $cd_id; ?>" data-target="<?php echo (int) $publish_ts; ?>" style="display:flex; justify-content:center; gap:8px;">
                                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="cd-d" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">dias</div></div>
                                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="cd-h" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">horas</div></div>
                                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="cd-m" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">min</div></div>
                                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="cd-s" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">seg</div></div>
                                        </div>
                                    </div>
                                    <script>
                                    (function(){
                                        var el = document.getElementById('<?php echo $cd_id; ?>');
                                        if(!el) return;
                                        var target = parseInt(el.getAttribute('data-target'),10) * 1000;
                                        function tick(){
                                            var diff = Math.floor((target - Date.now())/1000);
                                            if(diff <= 0){ location.reload(); return; }
                                            var d = Math.floor(diff/86400), h = Math.floor((diff%86400)/3600), m = Math.floor((diff%3600)/60), s = diff%60;
                                            el.querySelector('.cd-d').textContent = d;
                                            el.querySelector('.cd-h').textContent = h;
                                            el.querySelector('.cd-m').textContent = m;
                                            el.querySelector('.cd-s').textContent = s;
                                        }
                                        tick(); setInterval(tick, 1000);
                                    })();
                                    </script>
                                <?php endif; ?>

                                <?php
                                // Mostrar links se: finalizado (fluxo normal) OU o agendamento já passou.
                                $sched_done = ( $publish_ts > 0 && $publish_ts <= time() );
                                $mostrar_links = ( ($st === 'finalizado') || $sched_done ) && !$is_sched_pending;
                                if($mostrar_links): ?>
                                    <?php if($sub->scenario_type === 'Redes Sociais'): ?>
                                        <div style="display:flex; gap:10px; margin-top:10px;">
                                            <?php if(!empty($extra['facebook_url'])): ?>
                                                <a href="<?php echo esc_url($extra['facebook_url']); ?>" target="_blank" class="onemz-btn" style="background:#3b5998; color:#fff; flex:1; text-align:center; padding:8px; border-radius:4px; text-decoration:none; border:none; font-size:11px; font-weight:bold;">🔵 Facebook</a>
                                            <?php endif; ?>
                                            <?php if(!empty($extra['youtube_url'])): ?>
                                                <a href="<?php echo esc_url($extra['youtube_url']); ?>" target="_blank" class="onemz-btn" style="background:#ff0000; color:#fff; flex:1; text-align:center; padding:8px; border-radius:4px; text-decoration:none; border:none; font-size:11px; font-weight:bold;">🔴 YouTube</a>
                                            <?php endif; ?>
                                        </div>
                                    <?php elseif(!empty($extra['published_url'])): ?>
                                        <a href="<?php echo esc_url($extra['published_url']); ?>" target="_blank" class="onemz-btn" style="background:#2ecc71; color:#fff; display:block; text-align:center; padding:8px; border-radius:4px; text-decoration:none; margin-top:10px; border:none; font-size:11px; font-weight:bold;">🎧 Abrir Link Oficial</a>
                                    <?php endif; ?>
                                <?php endif; ?>
                                
                                <?php if($st === 'rejeitado'): ?>
                                    <button class="btn-outline rmbz-view-reason-btn m3-btn m3-btn--outlined m3-btn--block" data-reason="<?php echo esc_attr($sub->rejection_reason ?? ''); ?>" style="margin-top:var(--rmbz-space-3); color:#e74c3c; border-color:#e74c3c; min-height:40px; font-size:var(--rmbz-text-xs);">Ver Motivo da Rejeição</button>
                                <?php endif; ?>

                                <?php if($st === 'correcao'): ?>
                                    <button class="btn-outline rmbz-fix-submission-btn m3-btn m3-btn--block" 
                                            data-sub-id="<?php echo $sub->id; ?>" 
                                            data-reason="<?php echo esc_attr($sub->rejection_reason ?? ''); ?>" 
                                            data-audio="<?php echo !empty($extra['needs_audio_fix']) ? 1 : 0; ?>"
                                            data-cover="<?php echo !empty($extra['needs_cover_fix']) ? 1 : 0; ?>"
                                            data-link="<?php echo !empty($extra['needs_link_fix']) ? 1 : 0; ?>"
                                            style="margin-top:var(--rmbz-space-3); background:rgba(230, 126, 34, 0.12); color:#e67e22; border:1px solid #e67e22; min-height:40px; font-size:var(--rmbz-text-xs); font-weight:600;">
                                        ⚠️ Ver e Corrigir
                                    </button>
                                <?php endif; ?>

                                <?php
                                // [1.6.118.130] Botão "Ver detalhe" — abre modal M3 com info completa.
                                // Mensagem amigável por estado.
                                $st_msg = '';
                                if ($st == 'pendente') $st_msg = 'Estamos a rever a tua submissão. A nossa equipa vai avaliá-la com atenção — recebes aviso assim que houver novidades.';
                                elseif ($st == 'aprovado') $st_msg = 'Boa notícia! A tua submissão foi aprovada e está na fila para ser publicada.';
                                elseif ($st == 'em_publicacao') $st_msg = 'A tua submissão está a ser publicada. Os links oficiais aparecem aqui assim que estiverem prontos.';
                                elseif ($st == 'finalizado') $st_msg = 'Está publicada! Vê os links oficiais abaixo.';
                                elseif ($st == 'correcao') $st_msg = 'Há algo a ajustar antes de avançarmos. Usa o botão "Ver e Corrigir" para resolver.';
                                else $st_msg = 'Esta submissão não foi aceite desta vez. Vê o motivo para perceberes o que melhorar.';

                                // Links disponíveis (para passar ao modal) — só se mostrar_links
                                $det_fb = ($mostrar_links && !empty($extra['facebook_url'])) ? $extra['facebook_url'] : '';
                                $det_yt = ($mostrar_links && !empty($extra['youtube_url'])) ? $extra['youtube_url'] : '';
                                $det_pub = ($mostrar_links && !empty($extra['published_url'])) ? $extra['published_url'] : '';
                                ?>
                                <button type="button" class="rmbz-view-detail-btn m3-btn m3-btn--outlined m3-btn--block"
                                        data-title="<?php echo esc_attr($sub->music_title ?? ''); ?>"
                                        data-scenario="<?php echo esc_attr($sub->scenario_type ?? ''); ?>"
                                        data-status-label="<?php echo esc_attr($lbl ?? ''); ?>"
                                        data-status-color="<?php echo esc_attr($status_color); ?>"
                                        data-status-bg="<?php echo esc_attr($badge_bg); ?>"
                                        data-status-msg="<?php echo esc_attr($st_msg); ?>"
                                        data-date="<?php echo esc_attr(date('d/m/Y', strtotime($sub->submission_date))); ?>"
                                        data-img="<?php echo esc_attr($img_src); ?>"
                                        data-fb="<?php echo esc_attr($det_fb); ?>"
                                        data-yt="<?php echo esc_attr($det_yt); ?>"
                                        data-pub="<?php echo esc_attr($det_pub); ?>"
                                        data-sched="<?php echo $is_sched_pending ? (int) $publish_ts : 0; ?>"
                                        style="margin-top:var(--rmbz-space-3); min-height:40px; font-size:var(--rmbz-text-xs); font-weight:600;">
                                    👁️ Ver detalhe
                                </button>
                            </div>
                        </div>
                    </div>
                    <?php endforeach; ?>
                </div>

                <?php if ($total_pages > 1): ?>
                    <div class="rmbz-pagination" style="margin-top:var(--rmbz-space-6); text-align:center; border-top:1px solid rgba(255,255,255,0.06); padding-top:var(--rmbz-space-5);">
                        <span style="color:var(--rmbz-text-muted); font-size:var(--rmbz-text-sm); margin-right:10px;">Página <?php echo $paged; ?> de <?php echo $total_pages; ?>:</span>
                        <?php 
                        $base_url = home_url('/minha-conta/');
                        for ($i = 1; $i <= $total_pages; $i++) {
                            $active_style = ($i == $paged) ? 'background:var(--rmbz-brand); color:var(--rmbz-text-on-brand); font-weight:700;' : 'background:var(--rmbz-bg-elevated); color:var(--rmbz-text-secondary);';
                            echo '<a href="' . esc_url(add_query_arg('paged', $i, $base_url)) . '" style="display:inline-block; min-width:36px; padding:8px 12px; margin:0 3px; border:none; border-radius:var(--rmbz-radius-pill); text-decoration:none; font-size:var(--rmbz-text-sm); transition:0.2s; ' . $active_style . '">' . $i . '</a>';
                        }
                        ?>
                    </div>
                <?php endif; ?>

            <?php endif; ?>
        </div>

        <?php // [1.6.118.130] MODAL "Ver detalhe" da submissão — Material 3 ?>
        <div id="rmbz-subdetail-overlay" style="display:none; position:fixed; inset:0; background:rgba(0,0,0,0.65); z-index:99999; align-items:center; justify-content:center; padding:16px;">
            <div id="rmbz-subdetail-modal" style="background:var(--rmbz-bg-surface,#1c1c22); border:1px solid rgba(255,255,255,0.08); border-radius:var(--rmbz-radius-xl,24px); max-width:440px; width:100%; max-height:90vh; overflow-y:auto; box-shadow:0 24px 60px rgba(0,0,0,0.5);">
                <div id="rmbz-sd-cover" style="height:170px; background-size:cover; background-position:center; border-radius:var(--rmbz-radius-xl,24px) var(--rmbz-radius-xl,24px) 0 0;"></div>
                <div style="padding:var(--rmbz-space-5,20px);">
                    <div style="display:flex; justify-content:space-between; align-items:flex-start; gap:12px;">
                        <h3 id="rmbz-sd-title" style="margin:0; font-size:var(--rmbz-text-lg,18px); color:var(--rmbz-text-primary,#fff); font-family:var(--rmbz-font-display); font-weight:700;"></h3>
                        <button type="button" id="rmbz-sd-close" style="background:none; border:none; color:var(--rmbz-text-muted,#888); font-size:26px; line-height:1; cursor:pointer; padding:0;">&times;</button>
                    </div>
                    <span id="rmbz-sd-scenario" class="m3-badge" style="background:var(--rmbz-bg-elevated); color:var(--rmbz-text-secondary); text-transform:uppercase; margin-top:8px; display:inline-block;"></span>

                    <div style="margin-top:var(--rmbz-space-4,16px); display:flex; align-items:center; gap:10px;">
                        <span style="color:var(--rmbz-text-muted);">Estado:</span>
                        <span id="rmbz-sd-status" class="m3-badge"></span>
                    </div>

                    <div id="rmbz-sd-msg" style="margin-top:var(--rmbz-space-3,12px); background:var(--rmbz-bg-elevated,#26262e); border-radius:var(--rmbz-radius-md,12px); padding:var(--rmbz-space-4,16px); font-size:var(--rmbz-text-sm,14px); color:var(--rmbz-text-secondary,#ccc); line-height:1.5;"></div>

                    <div id="rmbz-sd-countdown-wrap" style="display:none; margin-top:var(--rmbz-space-3,12px); background:linear-gradient(135deg,#1a1a1f,#23232b); border:1px solid var(--rmbz-brand,#f0b90b); border-radius:var(--rmbz-radius-lg,16px); padding:var(--rmbz-space-4,16px); text-align:center;">
                        <div style="font-size:22px;">🚀</div>
                        <div style="color:var(--rmbz-brand,#f0b90b); font-weight:800; font-size:13px; margin:4px 0 2px; text-transform:uppercase; letter-spacing:0.5px;">Publicação agendada</div>
                        <div style="color:#aaa; font-size:11px; margin-bottom:10px;">Os links ficam disponíveis quando o tempo terminar.</div>
                        <div id="rmbz-sd-countdown" style="display:flex; justify-content:center; gap:8px;">
                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="sd-cd-d" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">dias</div></div>
                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="sd-cd-h" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">horas</div></div>
                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="sd-cd-m" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">min</div></div>
                            <div style="background:rgba(240,185,11,0.12); border-radius:8px; padding:8px 10px; min-width:48px;"><div class="sd-cd-s" style="font-size:20px; font-weight:800; color:#fff;">–</div><div style="font-size:9px; color:#aaa; text-transform:uppercase;">seg</div></div>
                        </div>
                    </div>

                    <div id="rmbz-sd-links" style="display:none; margin-top:var(--rmbz-space-4,16px);">
                        <div style="font-size:var(--rmbz-text-xs,12px); color:var(--rmbz-text-muted); text-transform:uppercase; letter-spacing:0.5px; margin-bottom:8px;">Links oficiais</div>
                        <div id="rmbz-sd-links-row" style="display:flex; flex-direction:column; gap:8px;"></div>
                    </div>

                    <div style="margin-top:var(--rmbz-space-4,16px); display:flex; justify-content:space-between; font-size:var(--rmbz-text-xs,12px); color:var(--rmbz-text-muted); border-top:1px solid rgba(255,255,255,0.06); padding-top:var(--rmbz-space-3,12px);">
                        <span>Data de envio:</span>
                        <strong id="rmbz-sd-date" style="color:var(--rmbz-text-secondary);"></strong>
                    </div>
                </div>
            </div>
        </div>
        <script>
        (function(){
            var overlay = document.getElementById('rmbz-subdetail-overlay');
            if(!overlay) return;
            var cdTimer = null;

            function closeModal(){
                overlay.style.display = 'none';
                if(cdTimer){ clearInterval(cdTimer); cdTimer = null; }
            }
            document.getElementById('rmbz-sd-close').addEventListener('click', closeModal);
            overlay.addEventListener('click', function(e){ if(e.target === overlay) closeModal(); });
            document.addEventListener('keydown', function(e){ if(e.key === 'Escape') closeModal(); });

            function startCountdown(targetTs){
                var wrap = document.getElementById('rmbz-sd-countdown-wrap');
                wrap.style.display = 'block';
                var cd = document.getElementById('rmbz-sd-countdown');
                function tick(){
                    var diff = Math.floor((targetTs*1000 - Date.now())/1000);
                    if(diff <= 0){ if(cdTimer) clearInterval(cdTimer); location.reload(); return; }
                    var d = Math.floor(diff/86400), h = Math.floor((diff%86400)/3600), m = Math.floor((diff%3600)/60), s = diff%60;
                    cd.querySelector('.sd-cd-d').textContent = d;
                    cd.querySelector('.sd-cd-h').textContent = ('0'+h).slice(-2);
                    cd.querySelector('.sd-cd-m').textContent = ('0'+m).slice(-2);
                    cd.querySelector('.sd-cd-s').textContent = ('0'+s).slice(-2);
                }
                tick(); cdTimer = setInterval(tick, 1000);
            }

            document.querySelectorAll('.rmbz-view-detail-btn').forEach(function(btn){
                btn.addEventListener('click', function(){
                    var d = btn.dataset;
                    // Capa
                    var cover = document.getElementById('rmbz-sd-cover');
                    if(d.img){ cover.style.backgroundImage = "url('"+d.img+"')"; cover.style.display='block'; cover.style.height='170px'; }
                    else { cover.style.display='none'; }
                    // Texto
                    document.getElementById('rmbz-sd-title').textContent = d.title || '';
                    document.getElementById('rmbz-sd-scenario').textContent = d.scenario || '';
                    var stEl = document.getElementById('rmbz-sd-status');
                    stEl.textContent = d.statusLabel || '';
                    stEl.style.background = d.statusBg || 'rgba(255,255,255,0.08)';
                    stEl.style.color = d.statusColor || '#fff';
                    document.getElementById('rmbz-sd-msg').textContent = d.statusMsg || '';
                    document.getElementById('rmbz-sd-date').textContent = d.date || '';

                    // Countdown (se agendado)
                    if(cdTimer){ clearInterval(cdTimer); cdTimer = null; }
                    var sched = parseInt(d.sched||'0', 10);
                    if(sched > 0){ startCountdown(sched); }
                    else { document.getElementById('rmbz-sd-countdown-wrap').style.display = 'none'; }

                    // Links
                    var linksWrap = document.getElementById('rmbz-sd-links');
                    var row = document.getElementById('rmbz-sd-links-row');
                    row.innerHTML = '';
                    var any = false;
                    function addLink(url, label, bg){
                        if(!url) return;
                        any = true;
                        var a = document.createElement('a');
                        a.href = url; a.target = '_blank'; a.rel = 'noopener';
                        a.textContent = label;
                        a.style.cssText = 'display:block; text-align:center; padding:10px; border-radius:8px; text-decoration:none; font-size:13px; font-weight:bold; color:#fff; background:'+bg+';';
                        row.appendChild(a);
                    }
                    addLink(d.fb, '🔵 Ver no Facebook', '#3b5998');
                    addLink(d.yt, '🔴 Ver no YouTube', '#ff0000');
                    addLink(d.pub, '🎧 Abrir Link Oficial', '#2ecc71');
                    linksWrap.style.display = any ? 'block' : 'none';

                    overlay.style.display = 'flex';
                });
            });
        })();
        </script>

        <div id="tab-contracts" class="account-tab-content">
            <?php 
            $active_contracts = array_filter($projects, function($p) { return $p->production_status !== 'done'; });
            if ( empty($active_contracts) ) : ?>
                <div class="m3-card" style="text-align:center; padding:var(--rmbz-space-10) var(--rmbz-space-5); color:var(--rmbz-text-muted);">
                    <span style="font-size:40px; display:block; margin-bottom:var(--rmbz-space-3);">🎥</span>
                    <p style="margin:0 0 var(--rmbz-space-3);">Nenhuma candidatura de videoclipe ativa.</p>
                    <a href="<?php echo home_url('/area-artista/'); ?>" class="m3-btn m3-btn--tonal" style="text-decoration:none;">Tentar Ganhar Videoclipe &rarr;</a>
                </div>
            <?php else :
                // [1.6.388] Multa por atraso (pertence a um projeto específico) —
                // mostrada DENTRO do cartão desse projeto.
                $rmbz_proj_fine = function_exists('rmbz_project_overdue_info')
                    ? rmbz_project_overdue_info($user_telemovel) : ['overdue'=>false];
            ?>
                <?php foreach ($active_contracts as $project) :
                    $custo_total = (float)$project->scenario_cost;
                    $ja_pago     = (float)$project->amount_paid;
                    if ($ja_pago == 0 && $project->is_paid == 1) $ja_pago = $custo_total;

                    // [1.6.118.36] Fase 3 — calcular valor verdadeiramente devido à 1MZ.
                    // É a soma dos items obrigatórios + items negociáveis que o artista
                    // NÃO assumiu. Items que ele assumiu não contam para "falta pagar".
                    $detalhes_calc = !empty($project->scenario_details) ? json_decode($project->scenario_details, true) : [];
                    $obligatory_cost = 0.0;
                    $checklist_total = 0.0;
                    $has_negotiables = false;
                    if ( is_array( $detalhes_calc ) ) {
                        foreach ( $detalhes_calc as $it_c ) {
                            $c  = (float) ( $it_c['cost'] ?? 0 );
                            $mp = isset( $it_c['must_pay'] ) ? (int) $it_c['must_pay'] : 1;
                            $aa = ! empty( $it_c['artist_assumes'] );
                            if ( $mp === 0 ) $has_negotiables = true;
                            if ( $mp === 1 || ! $aa ) {
                                $obligatory_cost += $c;
                            } else {
                                $checklist_total += $c;
                            }
                        }
                    }
                    // Fallback: items legados sem details → obligatory = scenario_cost (comportamento antigo)
                    if ( empty( $detalhes_calc ) ) $obligatory_cost = $custo_total;

                    $em_falta = round($obligatory_cost - $ja_pago, 2);
                    $totalmente_pago = ($em_falta <= 0);
                    
                    $is_pending = ($project->production_status === 'pending_review');
                    $status_raw   = (string) ($project->production_status ?? '');
                    // [1.6.118.54] Estados onde os orçamentos NÃO devem aparecer
                    // ao artista — admin ainda está a montar/avaliar a candidatura.
                    $budgets_locked = in_array( $status_raw, [ 'pending_review', 'rejected', 'correction' ], true );
                    // [1.6.380] Rótulos pt-PT do estado (sincronizado com admin/app).
                    $status_labels_site = [
                        'pending_review'            => 'Em Avaliação',
                        'pre-production'            => 'Aprovado',
                        'kyc_review'                => 'KYC Pendente',
                        'filming'                   => 'Filmagem',
                        'editing'                   => 'Edição',
                        'done'                      => 'Concluído',
                        'correction'                => 'Correção',
                        'rejected'                  => 'Rejeitado',
                        'cancelled_no_confirmation' => 'Cancelado por Prazo',
                    ];
                    $status_label = $is_pending
                        ? 'Em Avaliação ⏳'
                        : ( $status_labels_site[ $status_raw ] ?? strtoupper( str_replace('_',' ', $status_raw) ) );
                    $box_color = $is_pending ? '#f0b90b' : '#3498db';

                    // EXTRAIR DADOS DO CONTRATO
                    $extra_proj = !empty($project->extra_data) ? json_decode($project->extra_data, true) : [];
                    $contract_url = isset($extra_proj['contract_url']) ? $extra_proj['contract_url'] : '';
                    $contract_accepted = isset($extra_proj['contract_accepted']) ? $extra_proj['contract_accepted'] : false;
                ?>
                    <div class="project-card m3-card" style="border-left: 4px solid <?php echo $box_color; ?>; border-radius:var(--rmbz-radius-lg); padding:var(--rmbz-space-5); margin-bottom:var(--rmbz-space-4);">
                        <div style="display:flex; justify-content:space-between; flex-wrap:wrap; gap:var(--rmbz-space-2); align-items:center;">
                            <h3 style="margin:0; font-size:var(--rmbz-text-xl); color:var(--rmbz-text-primary); font-family:var(--rmbz-font-display); font-weight:600;"><?php echo esc_html($project->project_title ?? ''); ?></h3>
                            
                            <?php if ($is_pending): ?>
                                <span class="m3-badge" style="background:var(--rmbz-brand-soft); color:var(--rmbz-brand);">AGUARDANDO APROVAÇÃO</span>
                            <?php else: ?>
                                <?php if ($totalmente_pago): ?>
                                    <span class="m3-badge" style="background:rgba(46,204,113,0.15); color:#2ecc71;">TOTALMENTE PAGO ✅</span>
                                <?php else: ?>
                                    <span class="m3-badge" style="background:rgba(231,76,60,0.15); color:#e74c3c;">PAGAMENTO PENDENTE ⚠️</span>
                                <?php endif; ?>
                            <?php endif; ?>
                        </div>
                        
                        <p style="font-size:var(--rmbz-text-xs); color:var(--rmbz-text-muted); margin-top:var(--rmbz-space-2);">Nível: <strong style="color:var(--rmbz-text-secondary);"><?php echo esc_html(strtoupper((string)($project->scenario_type ?? ''))); ?></strong> | Estado Produção: <strong style="color:<?php echo $box_color; ?>;"><?php echo esc_html($status_label ?? ''); ?></strong></p>

                        <?php
                        // [1.5.409] BLOQUEIO POR TAXA DE VISTORIA — a filmagem acabou
                        // mas a taxa (pessoas externas pedidas pelo artista) está por
                        // pagar: a equipa não edita nem entrega até ser paga.
                        $rmbz_vs = function_exists('rmbz_team_vistoria_status') ? rmbz_team_vistoria_status( $project ) : [ 'blocked' => false ];
                        if ( ! empty( $rmbz_vs['blocked'] ) ) : ?>
                            <div style="background:linear-gradient(135deg,rgba(229,72,77,.18),rgba(229,72,77,.06)); border:1.5px solid rgba(229,72,77,.55); border-radius:14px; padding:16px; margin-top:12px;">
                                <div style="font-weight:800; font-size:15px; color:#ff6b6b;">🔒 Projeto bloqueado — taxa de vistoria por pagar</div>
                                <p style="font-size:13px; color:var(--rmbz-text-secondary,#d8c8c8); line-height:1.6; margin:8px 0 0;">
                                    A filmagem terminou 🎉, mas a <strong>taxa de vistoria</strong> das pessoas externas que pediste
                                    (<strong style="color:#ff6b6b;"><?php echo number_format( (float) $rmbz_vs['left'], 2, ',', '.' ); ?> MT</strong>)
                                    ainda não foi paga. Enquanto não for paga, a equipa <strong>não pode editar o vídeo nem entregar ficheiros</strong>
                                    e não consegues acompanhar o estado da produção.
                                    <?php if ( ! empty( $rmbz_vs['editor'] ) ) : ?>
                                        <br><br>⚠️ O teu vídeo vai ser editado por um <strong>EDITOR EXTERNO</strong>: os ficheiros
                                        <strong>não vão ser entregues ao editor</strong> sem esta taxa regularizada — paga para a equipa
                                        preparar os ficheiros e entregar ao editor.
                                    <?php endif; ?>
                                    <br><br>👉 Usa o botão de <strong>pagamento do projeto</strong> abaixo para pagar o valor em falta e desbloquear a edição.
                                </p>
                            </div>
                        <?php endif; ?>

                        <?php
                        // [1.5.411] ENTREGA AO EDITOR EXTERNO — depois de a taxa do editor
                        // ser paga: primeiro os ficheiros preparados (nº/GB/qualidade),
                        // depois a confirmação de que o editor já levou tudo.
                        $rmbz_ed = ( function_exists('rmbz_editor_delivery_get') && is_array($extra_proj) )
                            ? rmbz_editor_delivery_get( $extra_proj ) : null;
                        if ( $rmbz_ed && $rmbz_ed['files'] > 0 ) :
                            $rmbz_ed_gb = $rmbz_ed['size_gb'] > 0 ? number_format( (float) $rmbz_ed['size_gb'], 2, ',', '.' ) . ' GB' : '—';
                        ?>
                            <?php if ( ! empty( $rmbz_ed['delivered'] ) ) : ?>
                                <div style="background:linear-gradient(135deg,rgba(46,204,113,.16),rgba(46,204,113,.05)); border:1.5px solid rgba(46,204,113,.5); border-radius:14px; padding:14px 16px; margin-top:12px;">
                                    <div style="font-weight:800; font-size:14px; color:#2ecc71;">🚚 O editor externo já levou todos os ficheiros!</div>
                                    <p style="font-size:13px; color:var(--rmbz-text-secondary,#b8c8b8); line-height:1.6; margin:8px 0 0;">
                                        🎞️ <strong><?php echo (int) $rmbz_ed['files']; ?> ficheiro(s)</strong> ·
                                        💾 <strong><?php echo esc_html( $rmbz_ed_gb ); ?></strong> ·
                                        ✨ <strong><?php echo esc_html( $rmbz_ed['quality'] ); ?></strong>
                                        <br><br>A 1MZ agora só <strong>aguarda a edição</strong> para aprovar o vídeo final — assim que o editor entregar a versão editada, recebes novidades.
                                    </p>
                                </div>
                            <?php else : ?>
                                <div style="background:linear-gradient(135deg,rgba(123,91,214,.16),rgba(123,91,214,.05)); border:1.5px solid rgba(123,91,214,.5); border-radius:14px; padding:14px 16px; margin-top:12px;">
                                    <div style="font-weight:800; font-size:14px; color:#a68bf0;">📦 Ficheiros prontos para o editor externo</div>
                                    <p style="font-size:13px; color:var(--rmbz-text-secondary,#c0b8d8); line-height:1.6; margin:8px 0 0;">
                                        A equipa preparou os ficheiros do teu videoclipe:
                                        🎞️ <strong><?php echo (int) $rmbz_ed['files']; ?> ficheiro(s)</strong> ·
                                        💾 <strong><?php echo esc_html( $rmbz_ed_gb ); ?></strong> ·
                                        ✨ <strong><?php echo esc_html( $rmbz_ed['quality'] ); ?></strong>
                                        <br><br>Falta só a <strong>entrega ao editor</strong> — avisamos-te assim que ele levar os ficheiros.
                                    </p>
                                </div>
                            <?php endif; ?>
                        <?php endif; ?>

                        <?php
                        // [1.5.405] GRAVAÇÃO AO VIVO — o artista vê o cronómetro a contar
                        // quando a equipa inicia a filmagem, e o progresso entre dias.
                        $rmbz_fs_list = ( isset($extra_proj['filming_sessions']) && is_array($extra_proj['filming_sessions']) ) ? $extra_proj['filming_sessions'] : [];
                        $rmbz_fs_act = null; $rmbz_fs_days = 0; $rmbz_fs_next = '';
                        foreach ( $rmbz_fs_list as $rmbz_fs_s ) {
                            if ( ! is_array($rmbz_fs_s) ) continue;
                            if ( empty($rmbz_fs_s['ended_at']) ) { $rmbz_fs_act = $rmbz_fs_s; }
                            else { $rmbz_fs_days++; if ( ! empty($rmbz_fs_s['next_date']) ) $rmbz_fs_next = (string) $rmbz_fs_s['next_date']; }
                        }
                        $rmbz_fs_pleft = isset($extra_proj['filming_progress']['percent_left']) ? (int) $extra_proj['filming_progress']['percent_left'] : -1;
                        if ( $rmbz_fs_act ) : ?>
                            <div style="background:linear-gradient(135deg,rgba(229,72,77,.16),rgba(229,72,77,.05)); border:1.5px solid rgba(229,72,77,.5); border-radius:14px; padding:14px 16px; margin-top:12px; text-align:center;">
                                <div style="font-weight:800; font-size:14px; color:#ff6b6b;">
                                    <span class="rmbz-fs-rec" style="font-weight:900;">● REC</span>
                                    &nbsp;A gravação do teu videoclipe está a decorrer!
                                </div>
                                <div class="rmbz-fs-clock" data-started="<?php echo (int) ($rmbz_fs_act['started_ts'] ?? 0); ?>" data-servernow="<?php echo (int) current_time('timestamp', true); ?>"
                                     style="font-size:34px; font-weight:900; letter-spacing:2px; color:#fff; font-variant-numeric:tabular-nums; margin-top:4px;">--:--:--</div>
                                <div style="font-size:12px; color:var(--rmbz-text-secondary,#b8b8c0); margin-top:2px;">
                                    Dia <?php echo (int) ($rmbz_fs_act['day'] ?? 1); ?> de filmagem — a equipa 1MZ está no terreno 🎬
                                </div>
                            </div>
                            <script>
                            (function(){
                                var els = document.querySelectorAll('.rmbz-fs-clock');
                                var recs = document.querySelectorAll('.rmbz-fs-rec');
                                function tick(){
                                    els.forEach(function(el){
                                        var started = parseInt(el.getAttribute('data-started'),10)||0;
                                        var sn = parseInt(el.getAttribute('data-servernow'),10)||0;
                                        if (!el._off) el._off = sn>0 ? Math.floor(Date.now()/1000)-sn : 0;
                                        var s = Math.max(0, Math.floor(Date.now()/1000) - el._off - started);
                                        var p = function(n){return (n<10?'0':'')+n;};
                                        el.textContent = p(Math.floor(s/3600))+':'+p(Math.floor((s%3600)/60))+':'+p(s%60);
                                        recs.forEach(function(r){ r.style.opacity = (s%2===0)?'1':'0.3'; });
                                    });
                                }
                                if (els.length && !window._rmbzFsTimer) { window._rmbzFsTimer = setInterval(tick, 1000); tick(); }
                            })();
                            </script>
                        <?php elseif ( $rmbz_fs_pleft > 0 ) : ?>
                            <div style="background:rgba(240,185,11,.08); border:1px solid rgba(240,185,11,.3); border-radius:12px; padding:10px 14px; margin-top:12px; font-size:13px; color:var(--rmbz-text-secondary,#d8c896);">
                                🎬 <strong style="color:#f0b90b;">Filmagem em curso:</strong> falta <strong><?php echo (int) $rmbz_fs_pleft; ?>%</strong>
                                <?php if ( $rmbz_fs_next !== '' ) : ?> — continua no dia <strong><?php echo esc_html( date_i18n('d/m/Y', strtotime($rmbz_fs_next . ' 12:00:00')) ); ?></strong><?php endif; ?>
                                (<?php echo (int) $rmbz_fs_days; ?> dia(s) já filmado(s)).
                            </div>
                        <?php elseif ( $rmbz_fs_pleft === 0 && $rmbz_fs_days > 0 ) : ?>
                            <div style="background:rgba(46,204,113,.08); border:1px solid rgba(46,204,113,.3); border-radius:12px; padding:10px 14px; margin-top:12px; font-size:13px; color:#7fd8a8;">
                                🎉 Filmagens 100% concluídas em <?php echo (int) $rmbz_fs_days; ?> dia(s) — o vídeo está em edição.
                            </div>
                        <?php endif; ?>

                        <?php
                        // [1.5.398] Pedido de transferência do projeto — o artista aceita/recusa.
                        $rmbz_tr_req = isset($extra_proj['transfer_request']) && is_array($extra_proj['transfer_request']) ? $extra_proj['transfer_request'] : null;
                        if ( $rmbz_tr_req && ($rmbz_tr_req['status'] ?? '') === 'pending' ) : ?>
                            <div style="background:linear-gradient(135deg,#fff8e6,#fffdf7); border:1.5px solid #e8c56a; border-radius:14px; padding:16px; margin-top:12px;">
                                <div style="font-weight:800; font-size:15px; color:#5b3e00;">🔁 A 1MZ pediu a transferência deste projeto</div>
                                <p style="font-size:13px; color:#6b5320; margin:8px 0;">
                                    A equipa detetou que este projeto deve pertencer a outra conta.
                                    <?php if ( ! empty($rmbz_tr_req['reason']) ) : ?><br><strong>Motivo:</strong> <?php echo esc_html($rmbz_tr_req['reason']); ?><?php endif; ?>
                                    <br>Se aceitares, o projeto sai da tua conta e a equipa nomeia o novo dono.
                                </p>
                                <div style="display:flex; gap:10px; flex-wrap:wrap;">
                                    <button type="button" onclick="document.getElementById('rmbz-tr-terms-<?php echo (int) $project->id; ?>').style.display='flex';"
                                        style="background:#1a8a4a;color:#fff;border:0;border-radius:10px;padding:10px 18px;font-weight:700;font-size:13px;cursor:pointer;">✅ Aceitar transferência</button>
                                    <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
                                        <input type="hidden" name="action" value="rmbz_project_transfer_respond">
                                        <input type="hidden" name="project_id" value="<?php echo (int) $project->id; ?>">
                                        <input type="hidden" name="decision" value="reject">
                                        <?php wp_nonce_field('rmbz_transfer_respond_nonce'); ?>
                                        <button type="submit" style="background:#fdecea;color:#b3261e;border:0;border-radius:10px;padding:10px 18px;font-weight:700;font-size:13px;cursor:pointer;">Recusar</button>
                                    </form>
                                </div>
                            </div>

                            <?php /* [1.5.398] Modal: TERMOS DA TRANSFERÊNCIA — o artista tem de concordar antes de aceitar. */ ?>
                            <div id="rmbz-tr-terms-<?php echo (int) $project->id; ?>" style="display:none; position:fixed; inset:0; z-index:99999; background:rgba(20,16,40,0.55); align-items:center; justify-content:center; padding:16px;">
                                <div style="background:#fff; border-radius:20px; max-width:560px; width:100%; max-height:88vh; overflow-y:auto; padding:24px 22px; box-shadow:0 30px 60px -20px rgba(0,0,0,0.5);">
                                    <div style="font-size:18px; font-weight:800; color:#1a1a20;">📜 Termos da Transferência de Projeto — 1MZ For Artists</div>
                                    <p style="font-size:13px; color:#56535f; margin:8px 0 12px;">Lê com atenção antes de aceitar a transferência do projeto <strong>"<?php echo esc_html($project->project_title ?? ''); ?>"</strong>:</p>
                                    <ol style="font-size:13px; color:#3a3744; line-height:1.65; padding-left:20px; margin:0 0 14px;">
                                        <li><strong>Definitiva e irreversível</strong> — depois de concluída pela equipa 1MZ, a transferência não pode ser revertida.</li>
                                        <li><strong>Perda total de acesso</strong> — o projeto, o chat, os ficheiros e o histórico deixam de estar disponíveis na tua conta.</li>
                                        <li><strong>Novo dono</strong> — a equipa 1MZ nomeia a conta de destino; a transferência só se conclui após confirmação da equipa.</li>
                                        <li><strong>Valores pagos</strong> — os pagamentos já feitos ficam associados ao projeto e não são devolvidos à tua carteira, salvo decisão expressa da equipa 1MZ.</li>
                                        <li><strong>Obrigações futuras</strong> — multas, prazos e obrigações do projeto passam a ser da responsabilidade do novo dono a partir da conclusão.</li>
                                        <li><strong>Contrato e KYC</strong> — o contrato e a verificação de identidade atuais são anulados; o novo dono assina novo contrato.</li>
                                        <li><strong>Notificações</strong> — receberás confirmação (em todos os canais) quando a transferência for concluída, ou aviso se não for possível.</li>
                                        <li><strong>Declaração</strong> — ao aceitar, declaras que o fazes de forma voluntária e que compreendes estes termos.</li>
                                    </ol>
                                    <div style="background:#f4f2fb; border-radius:12px; padding:12px; margin-bottom:12px;">
                                        <div style="font-size:13px; font-weight:700; color:#1a1a20; margin-bottom:8px;">👤 Para quem deve ir o projeto? (a equipa vai confirmar)</div>
                                        <input type="text" id="rmbz-tr-sname-<?php echo (int) $project->id; ?>" placeholder="Nome do artista dono da música"
                                               style="width:100%; margin-bottom:8px; padding:10px; border:1px solid #d9d2f5; border-radius:10px; font-size:13px;">
                                        <input type="tel" id="rmbz-tr-stel-<?php echo (int) $project->id; ?>" placeholder="Número (telemóvel) da conta dele"
                                               style="width:100%; padding:10px; border:1px solid #d9d2f5; border-radius:10px; font-size:13px;">
                                    </div>
                                    <label style="display:flex; gap:8px; align-items:flex-start; font-size:13px; color:#1a1a20; font-weight:600; background:#f4f2fb; border-radius:10px; padding:10px 12px; cursor:pointer;">
                                        <input type="checkbox" id="rmbz-tr-agree-<?php echo (int) $project->id; ?>" style="margin-top:2px;">
                                        <span>Li e concordo com os Termos da Transferência de Projeto da 1MZ For Artists.</span>
                                    </label>
                                    <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" style="display:flex; gap:10px; margin-top:14px;"
                                          onsubmit="var pid=<?php echo (int) $project->id; ?>; this.suggested_name.value=document.getElementById('rmbz-tr-sname-'+pid).value; this.suggested_tel.value=document.getElementById('rmbz-tr-stel-'+pid).value; return true;">
                                        <input type="hidden" name="action" value="rmbz_project_transfer_respond">
                                        <input type="hidden" name="project_id" value="<?php echo (int) $project->id; ?>">
                                        <input type="hidden" name="decision" value="accept">
                                        <input type="hidden" name="terms_accepted" value="1">
                                        <input type="hidden" name="suggested_name" value="">
                                        <input type="hidden" name="suggested_tel" value="">
                                        <?php wp_nonce_field('rmbz_transfer_respond_nonce'); ?>
                                        <button type="button" onclick="document.getElementById('rmbz-tr-terms-<?php echo (int) $project->id; ?>').style.display='none';"
                                            style="flex:1; background:#eeebf7; color:#1a1a20; border:0; border-radius:12px; padding:12px; font-weight:700; font-size:13px; cursor:pointer;">Cancelar</button>
                                        <button type="submit" id="rmbz-tr-accept-btn-<?php echo (int) $project->id; ?>" disabled
                                            style="flex:1.4; background:#1a8a4a; color:#fff; border:0; border-radius:12px; padding:12px; font-weight:700; font-size:13px; cursor:pointer;">✅ Concordo — aceitar</button>
                                    </form>
                                    <script>
                                    (function(){
                                        var pid = <?php echo (int) $project->id; ?>;
                                        var btn = document.getElementById('rmbz-tr-accept-btn-' + pid);
                                        var chk = document.getElementById('rmbz-tr-agree-' + pid);
                                        var nm  = document.getElementById('rmbz-tr-sname-' + pid);
                                        var tl  = document.getElementById('rmbz-tr-stel-' + pid);
                                        function upd(){
                                            var telDigits = (tl.value || '').replace(/[^0-9+]/g, '');
                                            btn.disabled = !(chk.checked && (nm.value || '').trim().length >= 2 && telDigits.length >= 7);
                                        }
                                        chk.addEventListener('change', upd);
                                        nm.addEventListener('input', upd);
                                        tl.addEventListener('input', upd);
                                    })();
                                    </script>
                                </div>
                            </div>
                        <?php elseif ( $rmbz_tr_req && ($rmbz_tr_req['status'] ?? '') === 'accepted' ) : ?>
                            <div style="background:#eaf7f0; border:1px solid #bfe5cf; border-radius:12px; padding:12px 14px; margin-top:12px; font-size:13px; color:#0d5c34;">
                                ✅ Aceitaste a transferência deste projeto — a equipa 1MZ está a concluir o processo.
                            </div>
                        <?php endif; ?>

                        <?php
                        // [1.6.390] Multa por atraso DESTE projeto → projeto TRANCADO:
                        // mostra só o bloco de pagamento; o resto do projeto fica oculto
                        // até a multa ser paga.
                        if ( ! empty($rmbz_proj_fine['overdue']) && (int)($rmbz_proj_fine['project_id'] ?? 0) === (int)$project->id
                             && ! empty($rmbz_proj_fine['enabled']) && (float)($rmbz_proj_fine['amount'] ?? 0) > 0 ):
                            $rmbz_pf_unit_h = ( ($rmbz_proj_fine['unit'] ?? 'day') === 'hour' );
                            $rmbz_pf_amt    = number_format( (float)$rmbz_proj_fine['amount'], 2, ',', '.' );
                            $rmbz_pf_frozen = ! empty($rmbz_proj_fine['frozen']);
                        ?>
                            <div style="background:linear-gradient(160deg,rgba(217,48,37,.14),rgba(217,48,37,.05));border:1px solid rgba(217,48,37,.5);border-radius:16px;padding:22px 20px;margin-top:16px;text-align:center;color:#ffd9d4;">
                                <div style="font-size:34px;line-height:1;margin-bottom:8px;">🔒</div>
                                <h3 style="margin:0 0 6px;color:#fff;font-size:18px;font-weight:800;">Projeto trancado por multa</h3>
                                <p style="margin:0 auto;max-width:440px;font-size:13.5px;line-height:1.55;color:#f3c7c2;">
                                    <?php if ($rmbz_pf_frozen): ?>
                                        Renovaste o VIP, mas ficou uma multa por atraso por pagar. A equipa só continua a produção depois de a multa ser paga.
                                    <?php else: ?>
                                        A subscrição (com o serviço Ganhar Vídeo) expirou durante a produção. A equipa só continua depois de a multa ser paga.
                                    <?php endif; ?>
                                </p>
                                <div style="background:#fff;border-radius:12px;padding:14px;margin:16px auto 0;max-width:320px;">
                                    <div style="font-size:11px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#d93025;"><?php echo $rmbz_pf_frozen ? 'Multa pendente' : 'Multa acumulada'; ?></div>
                                    <div style="font-size:30px;font-weight:900;color:#d93025;line-height:1.1;"><?php echo esc_html( $rmbz_pf_amt ); ?> MT</div>
                                    <div style="font-size:11px;color:#9a564f;">
                                        <?php echo (int)$rmbz_proj_fine['units']; ?> <?php echo $rmbz_pf_unit_h ? 'hora(s)' : 'dia(s)'; ?> ×
                                        <?php echo esc_html( number_format( (float)$rmbz_proj_fine['rate'], 2, ',', '.' ) ); ?> MT/<?php echo $rmbz_pf_unit_h ? 'hora' : 'dia'; ?><?php echo $rmbz_pf_frozen ? ' · congelada' : ''; ?>
                                    </div>
                                </div>
                                <div style="margin-top:16px;display:flex;gap:10px;justify-content:center;flex-wrap:wrap;">
                                    <button type="button" onclick="document.getElementById('rmbz-fine-pay').style.display='flex';" style="background:#1a8a4a;color:#fff;border:0;border-radius:10px;padding:12px 22px;font-weight:700;font-size:14px;cursor:pointer;">💳 Pagar multa (<?php echo esc_html( $rmbz_pf_amt ); ?> MT)</button>
                                    <a href="#" onclick="document.getElementById('rmbz-fine-info').style.display='flex';return false;" style="display:inline-flex;align-items:center;background:rgba(255,255,255,.16);color:#fff;font-weight:600;font-size:13px;padding:0 18px;border-radius:10px;text-decoration:none;">ℹ️ Saiba mais</a>
                                </div>
                            </div>
                            <?php
                            rmbz_render_fine_pay_modal( (float) $rmbz_proj_fine['amount'] );
                            rmbz_render_fine_info_modal();
                            ?>
                        </div><!-- /.project-card (trancado) -->
                        <?php continue; // bloqueia o resto do projeto até a multa ser paga ?>
                        <?php endif; ?>

                        <?php if ( $status_raw === 'cancelled_no_confirmation' ): ?>
                            <?php
                            $cancel_reason_raw = remove_accents( strtolower( (string) ( $extra_proj['cancelled_reason'] ?? '' ) ) );
                            $cancel_reason_artist = strpos( $cancel_reason_raw, 'localizacao' ) !== false
                                ? 'Não escolheste uma localização dentro do prazo.'
                                : 'Não confirmaste ou propuseste novas datas dentro do prazo.';
                            ?>
                            <div style="background:rgba(231,76,60,0.12); border:1px solid #e74c3c; border-radius:10px; padding:16px; margin-top:14px;">
                                <h4 style="color:#e74c3c; margin:0 0 8px;">⏱ Projeto cancelado por falta de confirmação</h4>
                                <p style="color:var(--rmbz-text-secondary); font-size:13px; line-height:1.5; margin:0;">
                                    <?php echo esc_html( $cancel_reason_artist ); ?> Este projeto foi cancelado e esta mesma música não poderá ser reenviada.
                                </p>
                            </div>
                        </div>
                        <?php continue; endif; ?>

                        <?php
                        // [1.6.118.77] Bloqueio: abrir/ver o detalhe de um projecto de
                        // vídeo exige VIP activo. Sem VIP, mostramos só o cabeçalho +
                        // aviso com botão para subscrever, e fechamos o card.
                        if ( ! $has_subscription ):
                        ?>
                            <div style="background:var(--rmbz-brand-soft); border:1px solid var(--rmbz-brand); border-radius:var(--rmbz-radius-lg); padding:var(--rmbz-space-6); margin-top:var(--rmbz-space-4); text-align:center;">
                                <div style="font-size:40px; margin-bottom:var(--rmbz-space-3);">🔒</div>
                                <h4 style="color:var(--rmbz-brand); margin:0 0 var(--rmbz-space-2) 0; font-size:var(--rmbz-text-lg);">Precisas de VIP</h4>
                                <p style="color:var(--rmbz-text-secondary); font-size:var(--rmbz-text-xs); margin:0 auto var(--rmbz-space-4); line-height:1.5; max-width:420px;">
                                    Para abrir e acompanhar os teus projectos de vídeo, precisas de uma subscrição VIP activa. Subscreve para desbloquear o acesso.
                                </p>
                                <a href="<?php echo esc_url( home_url('/area-artista/') ); ?>" class="m3-btn m3-btn--filled" style="text-decoration:none;">⭐ Ver planos VIP</a>
                            </div>
                        </div>
                        <?php continue; endif; ?>

                        <?php if ($is_pending): ?>
                            <p style="background:var(--rmbz-bg-elevated); padding:var(--rmbz-space-4); border-radius:var(--rmbz-radius-md); font-size:var(--rmbz-text-xs); color:var(--rmbz-text-secondary); border:1px solid rgba(255,255,255,0.06); margin-top:var(--rmbz-space-3);">A sua música está a ser avaliada pela equipa. Se for aprovada, receberá aqui o orçamento detalhado da produção.</p>
                            <?php // [1.6.118.117] Botão "Ver as regras" — prazos que podem cancelar o projecto (paridade com o app) ?>
                            <button type="button" onclick="rmbzOpenRules()" class="m3-btn m3-btn--outlined m3-btn--block" style="margin-top:var(--rmbz-space-3); color:var(--rmbz-warning, #e67e22); border-color:var(--rmbz-warning, #e67e22);">⚠️ Ver as regras (importante)</button>
                            <div id="rmbz-rules-modal" style="display:none; position:fixed; inset:0; z-index:99999; background:rgba(0,0,0,0.7); align-items:center; justify-content:center; padding:20px;">
                                <div style="background:var(--rmbz-bg-surface, #1e1e1e); max-width:460px; width:100%; border-radius:var(--rmbz-radius-xl, 24px); overflow:hidden; max-height:85vh; overflow-y:auto;">
                                    <div style="background:linear-gradient(135deg,#e67e22,#d9821e); padding:20px; text-align:center;">
                                        <div style="font-size:32px;">📋</div>
                                        <div style="color:#fff; font-size:16px; font-weight:800; margin-top:6px;">Regras importantes do projecto</div>
                                    </div>
                                    <div style="padding:20px;">
                                        <p style="font-size:13px; line-height:1.6; color:var(--rmbz-text-secondary, #ccc); margin:0 0 16px;">Para a tua produção avançar sem problemas, há prazos que precisas de cumprir. Se não cumprires, o projecto pode ser cancelado e a mesma música ficará bloqueada para reenvio.</p>
                                        <?php
                                        $rmbz_rules = [
                                            ['📍', 'Escolher a localização — 2 dias', 'Depois de o projecto ser aprovado, tens 2 dias para escolher onde queres gravar. Avisamos-te 1 dia antes. Se não escolheres, o projecto é cancelado.'],
                                            ['📅', 'Confirmar as datas de gravação', 'Quando a equipa marcar as datas, precisas de as confirmar antes do dia de início. Avisamos-te 1 dia antes. Se não confirmares, o projecto é cancelado.'],
                                            ['💰', 'Devolução do que pagaste', 'Se o projecto for cancelado por um destes prazos e já tiveres pago algo, o valor é devolvido à tua carteira.'],
                                            ['🔔', 'Fica atento aos avisos', 'Vais ser avisado por email, notificação e aqui na plataforma. Mantém as notificações ligadas para não perderes nada.'],
                                        ];
                                        foreach ($rmbz_rules as $r): ?>
                                            <div style="display:flex; gap:10px; margin-bottom:14px;">
                                                <span style="font-size:18px; width:26px;"><?php echo $r[0]; ?></span>
                                                <div style="flex:1;">
                                                    <div style="font-size:13px; font-weight:700; color:var(--rmbz-text-primary, #fff);"><?php echo esc_html($r[1]); ?></div>
                                                    <div style="font-size:12px; line-height:1.5; color:var(--rmbz-text-muted, #aaa); margin-top:2px;"><?php echo esc_html($r[2]); ?></div>
                                                </div>
                                            </div>
                                        <?php endforeach; ?>
                                        <button type="button" onclick="rmbzCloseRules()" class="m3-btn m3-btn--filled m3-btn--block" style="margin-top:6px;">Compreendi</button>
                                    </div>
                                </div>
                            </div>
                            <script>
                            function rmbzOpenRules(){ var m=document.getElementById('rmbz-rules-modal'); if(m){ m.style.display='flex'; } }
                            function rmbzCloseRules(){ var m=document.getElementById('rmbz-rules-modal'); if(m){ m.style.display='none'; } }
                            </script>
                        <?php else: ?>
                            <?php $budget_items = !empty($project->scenario_details) ? json_decode($project->scenario_details, true) : []; ?>
                            <div style="background:#1a1a1a; padding:15px; border-radius:6px; margin-top:15px;">
                                
                                <?php if ($status_raw === 'rejected'): ?>
                                    <div style="background:rgba(231,76,60,0.1); border:1px solid #e74c3c; padding:20px; border-radius:8px; text-align:center;">
                                        <h4 style="color:#e74c3c; margin:0 0 10px 0; font-size:18px;">❌ Projeto Bloqueado pela Administração</h4>
                                        <p style="color:#ccc; font-size:14px; margin:0 0 15px 0;">Devido a não concordância com os termos do contrato, este projeto foi travado.</p>
                                        <div style="background:#111; border-left:3px solid #e74c3c; padding:10px; font-size:13px; color:#fff; text-align:left;">
                                            <strong>Motivo Oficial:</strong> <em><?php echo esc_html($extra_proj['admin_rejection_reason'] ?? 'Incompatibilidade nos termos.'); ?></em>
                                        </div>
                                    </div>
                                <?php else: ?>
                                
                                    <?php 
                                    $proposed_budgets = $extra_proj['proposed_budgets'] ?? [];
                                    $budget_accepted_loc = $extra_proj['budget_accepted_location'] ?? '';
                                    ?>

                                    <?php
                                    // [1.6.118.119] Card de PARABÉNS quando o projecto é aprovado.
                                    // Mantém o troféu 🏆 fixo e "PARABÉNS!"; só a MENSAGEM varia por
                                    // nível (tom de conquista, sem dizer "nível X"). Igual ao app.
                                    $nivel_raw = strtolower( (string) ( $project->scenario_type ?? '' ) );
                                    $musica_cg = $project->project_title ?? 'o teu videoclipe';
                                    $celebrar = ! in_array( $project->production_status, [ 'done', 'rejected' ], true );
                                    if ( $celebrar ) {
                                        if ( strpos( $nivel_raw, 'cinema' ) !== false || strpos( $nivel_raw, 'premium' ) !== false ) {
                                            $cg_titulo = 'Conseguiste algo que poucos alcançam. 🎬';
                                            $cg_msg = 'Foste escolhido para uma produção ao mais alto nível. Isto não acontece todos os dias — só os artistas que mostram visão chegam aqui. Prepara-te para ver "' . esc_html( $musica_cg ) . '" ganhar vida como cinema. ✨';
                                        } elseif ( strpos( $nivel_raw, 'profission' ) !== false || strpos( $nivel_raw, 'professional' ) !== false || strpos( $nivel_raw, 'pro' ) !== false ) {
                                            $cg_titulo = 'Entraste para um grupo restrito. ⭐';
                                            $cg_msg = 'A equipa 1MZ não escolhe qualquer um — e escolheu-te. "' . esc_html( $musica_cg ) . '" vai ganhar uma produção profissional, com qualidade de estúdio. Mostra ao mundo de que és capaz. 🎥';
                                        } elseif ( strpos( $nivel_raw, 'básic' ) !== false || strpos( $nivel_raw, 'basic' ) !== false ) {
                                            $cg_titulo = 'Este é o início de algo grande. 🚀';
                                            $cg_msg = 'De muitos que se candidatam, poucos avançam — e tu avançaste. Todo o grande artista começou exactamente aqui. Dá tudo neste videoclipe, porque é o teu primeiro passo. 💪';
                                        } else {
                                            $cg_titulo = 'Conseguiste! E não foi por acaso. 🎉';
                                            $cg_msg = 'A nossa curadoria avaliou "' . esc_html( $musica_cg ) . '" e ficou impressionada. Poucos chegam até aqui — és um(a) artista com potencial, não esqueças isso. ✨';
                                        }
                                    ?>
                                    <?php // [1.5.412] Card de parabéns M3 Expressive: troféu em círculo tonal + sombra suave. ?>
                                    <div style="background:linear-gradient(150deg, #fff8e1, #fffdf5 60%, #fdf3d7); border:1.5px solid rgba(240,185,11,.55); border-radius:28px; padding:34px 24px 30px; margin-bottom:var(--rmbz-space-5); text-align:center; box-shadow:0 18px 40px -22px rgba(240,185,11,.45);">
                                        <div style="width:78px; height:78px; margin:0 auto; border-radius:50%; background:radial-gradient(circle at 30% 25%, #ffe9a8, #f6d569); display:flex; align-items:center; justify-content:center; font-size:40px; box-shadow:0 10px 24px -10px rgba(180,83,9,.5);">🏆</div>
                                        <h3 style="color:#b45309; margin:16px 0 4px; font-size:var(--rmbz-text-2xl, 22px); font-family:var(--rmbz-font-display); font-weight:900; letter-spacing:1.5px;">PARABÉNS!</h3>
                                        <p style="color:#1d2327; font-size:var(--rmbz-text-base); font-weight:700; margin:0 0 10px;"><?php echo esc_html( $cg_titulo ); ?></p>
                                        <p style="color:#3c4043; font-size:var(--rmbz-text-sm); line-height:1.65; margin:0 auto; max-width:460px;"><?php echo esc_html( $cg_msg ); ?></p>
                                    </div>
                                    <?php } ?>
                                    
                                    <?php if (!empty($proposed_budgets) && empty($budget_accepted_loc) && !$budgets_locked): ?>
                                        <div style="background: rgba(240, 185, 11, 0.05); border: 1px solid #f0b90b; padding: 15px; border-radius: 8px; margin-bottom: 25px; box-sizing: border-box; width: 100%; overflow: hidden;">
                                            <h4 style="margin:0 0 10px 0; font-size:16px; color:#f0b90b;">🌍 Escolha o Local de Gravação</h4>
                                            <p style="color:#ccc; font-size:13px; margin-bottom:15px; line-height:1.5;">A nossa equipa preparou diferentes orçamentos com base na localização. Avalie os custos e selecione onde quer gravar o seu videoclipe.</p>
                                            
                                            <div style="display:grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap:15px; box-sizing: border-box; width: 100%;">
                                                <?php foreach ($proposed_budgets as $loc_name => $loc_data): ?>
                                                    <div style="background:#111; border:1px solid #333; border-radius:8px; padding:15px; position:relative; box-shadow: 0 4px 10px rgba(0,0,0,0.3); box-sizing: border-box; width: 100%; overflow: hidden;">
                                                        <h5 style="color:#fff; margin:0 0 15px 0; font-size:16px; border-bottom:1px solid #222; padding-bottom:10px; text-transform:uppercase;"><?php echo esc_html($loc_name); ?></h5>
                                                        
                                                        <?php 
                                                        $grouped_items = [];
                                                        foreach($loc_data['items'] as $item) {
                                                            $cat = !empty($item['cat']) ? $item['cat'] : 'Geral';
                                                            $grouped_items[$cat][] = $item;
                                                        }
                                                        ?>
                                                        <table style="width:100%; color:#aaa; font-size:12px; margin-bottom:15px; border-collapse: collapse;">
                                                            <?php foreach($grouped_items as $cat_name => $cat_items): ?>
                                                                <?php if($cat_name !== 'Geral'): ?>
                                                                    <tr><td colspan="2" style="padding:8px 0 4px 0; font-weight:bold; color:#f0b90b; border-bottom:1px solid #444; font-size:10px; text-transform:uppercase; letter-spacing:1px;"><?php echo esc_html($cat_name); ?></td></tr>
                                                                <?php endif; ?>
                                                                <?php foreach($cat_items as $item): ?>
                                                                    <tr>
                                                                        <td style="padding:6px 0; border-bottom:1px dashed #333; word-break: break-word; <?php echo ($cat_name !== 'Geral') ? 'padding-left:10px;' : ''; ?>"><?php echo ($cat_name !== 'Geral') ? '↳ ' : ''; ?><?php echo esc_html($item['desc']); ?></td>
                                                                        <td style="text-align:right; border-bottom:1px dashed #333; color:#ddd; min-width: 80px;"><?php echo number_format($item['cost'], 2, ',', '.'); ?> MT</td>
                                                                    </tr>
                                                                <?php endforeach; ?>
                                                            <?php endforeach; ?>
                                                        </table>
                                                        
                                                        <div style="font-size:20px; font-weight:900; color:#2ecc71; text-align:center; margin-bottom:20px;">
                                                            <?php echo number_format($loc_data['total'], 2, ',', '.'); ?> <span style="font-size:11px; color:#777;">MT</span>
                                                        </div>
                                                        
                                                        <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" onsubmit="return confirm('Tem a certeza que deseja gravar em <?php echo esc_html($loc_name); ?>? Os outros orçamentos serão descartados.');">
                                                            <input type="hidden" name="action" value="onemz_artist_choose_budget">
                                                            <input type="hidden" name="project_id" value="<?php echo $project->id; ?>">
                                                            <input type="hidden" name="chosen_location" value="<?php echo esc_attr($loc_name); ?>">
                                                            <?php wp_nonce_field('onemz_choose_budget_nonce'); ?>
                                                            <button type="submit" class="m3-btn m3-btn--filled m3-btn--block">Selecionar <?php echo esc_html($loc_name); ?></button>
                                                        </form>
                                                    </div>
                                                <?php endforeach; ?>
                                            </div>
                                        </div>
                                    <?php else: ?>
                                        <?php
                                        // [1.6.118.44] Detectar items NEGOCIÁVEIS NÃO DECIDIDOS — adicionados pelo
                                        // admin após o artista aceitar contrato. Mini-prompt para o artista decidir
                                        // sem re-fazer todo o ritual de KYC.
                                        $undecided_items = [];
                                        if ( ! empty( $budget_items ) && is_array( $budget_items ) && $contract_accepted ) {
                                            foreach ( $budget_items as $idx => $bit ) {
                                                $mp   = isset( $bit['must_pay'] ) ? (int) $bit['must_pay'] : 1;
                                                $dec  = isset( $bit['decided'] )  ? (int) $bit['decided']  : 1; // legado = decidido
                                                if ( $mp === 0 && $dec === 0 ) {
                                                    $undecided_items[ $idx ] = $bit;
                                                }
                                            }
                                        }
                                        ?>

                                        <?php if ( ! empty( $undecided_items ) ): ?>
                                            <div style="background: linear-gradient(135deg, rgba(240,185,11,0.10), rgba(240,185,11,0.02));
                                                        border: 2px solid #f0b90b; border-radius: 12px;
                                                        padding: 20px; margin-bottom: 20px;">
                                                <h4 style="color:#f0b90b; margin:0 0 6px 0; font-size:15px; display:flex; align-items:center; gap:8px;">
                                                    🆕 <span>Novos items adicionados pela equipa</span>
                                                </h4>
                                                <p style="color:#ddd; font-size:12px; margin:0 0 16px 0; line-height:1.5;">
                                                    A equipa 1MZ adicionou os items abaixo ao teu orçamento depois de teres assinado o contrato. Para cada item, escolhe quem trata.
                                                </p>

                                                <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
                                                    <input type="hidden" name="action" value="onemz_decide_pending_items">
                                                    <input type="hidden" name="project_id" value="<?php echo (int) $project->id; ?>">
                                                    <?php wp_nonce_field( 'onemz_decide_pending_nonce' ); ?>

                                                    <?php foreach ( $undecided_items as $idx => $bit ):
                                                        $cost_str = number_format( (float) ( $bit['cost'] ?? 0 ), 2, ',', '.' );
                                                        $desc     = esc_html( $bit['desc'] ?? '' );
                                                        $cat      = ( ! empty( $bit['cat'] ) && $bit['cat'] !== 'Geral' ) ? ' · ' . esc_html( $bit['cat'] ) : '';
                                                        $uid = 'pend-' . (int) $project->id . '-' . (int) $idx;
                                                    ?>
                                                        <div style="background:#1a1a1a; border-radius:8px; padding:12px; margin-bottom:10px;">
                                                            <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; gap:10px;">
                                                                <span style="color:#fff; font-size:13px; font-weight:600;">
                                                                    <?php echo $desc; ?>
                                                                    <span style="color:#666; font-size:10px; font-weight:400;"><?php echo $cat; ?></span>
                                                                </span>
                                                                <span style="color:#f0b90b; font-weight:700; white-space:nowrap; font-size:13px;"><?php echo $cost_str; ?> MT</span>
                                                            </div>

                                                            <label style="display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; margin-bottom:6px; background:rgba(52, 152, 219, 0.07); border:1px solid rgba(52, 152, 219, 0.2);" for="<?php echo esc_attr( $uid ); ?>-pay">
                                                                <input type="radio" id="<?php echo esc_attr( $uid ); ?>-pay" name="item_assumes[<?php echo (int) $idx; ?>]" value="0" checked required style="margin:0;">
                                                                <span style="color:#3498db; font-size:12px;"><strong>💰 1MZ paga:</strong> a equipa organiza</span>
                                                            </label>

                                                            <label style="display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; background:rgba(46, 204, 113, 0.07); border:1px solid rgba(46, 204, 113, 0.2);" for="<?php echo esc_attr( $uid ); ?>-assume">
                                                                <input type="radio" id="<?php echo esc_attr( $uid ); ?>-assume" name="item_assumes[<?php echo (int) $idx; ?>]" value="1" required style="margin:0;">
                                                                <span style="color:#2ecc71; font-size:12px;"><strong>✋ Eu assumo:</strong> arranjo eu próprio</span>
                                                            </label>
                                                        </div>
                                                    <?php endforeach; ?>

                                                    <button type="submit" class="m3-btn m3-btn--filled m3-btn--block" style="margin-top:var(--rmbz-space-2);">
                                                        ✓ Confirmar Escolhas
                                                    </button>
                                                </form>
                                            </div>
                                        <?php endif; ?>

                                        <h4 style="margin:0 0 10px 0; font-size:14px; color:#ccc;">Orçamento de Produção <?php echo !empty($budget_accepted_loc) ? '<span style="color:#f0b90b; font-weight:bold;">(Local Selecionado: '.esc_html($budget_accepted_loc).')</span>' : ''; ?></h4>
                                        
                                        <?php
                                        // [1.6.118.36] Fase 3 — Tabela única substituída por DUAS secções:
                                        //   1. "A Pagar à 1MZ" → items obrigatórios + items negociáveis NÃO assumidos
                                        //   2. "Checklist" (você arranja) → items que artista assumiu
                                        //
                                        // Items legados sem 'must_pay' default = obrigatório (back-compat).
                                        $items_pagar     = [];
                                        $items_checklist = [];
                                        foreach ( $budget_items as $item ) {
                                            $mp = isset( $item['must_pay'] ) ? (int) $item['must_pay'] : 1;
                                            $aa = ! empty( $item['artist_assumes'] );
                                            if ( $mp === 1 || ! $aa ) {
                                                $items_pagar[] = $item;
                                            } else {
                                                $items_checklist[] = $item;
                                            }
                                        }
                                        // Agrupar por categoria mantendo a estrutura visual original
                                        $grouped_pagar     = [];
                                        $grouped_checklist = [];
                                        foreach ( $items_pagar as $item ) {
                                            $cat = !empty($item['cat']) ? $item['cat'] : 'Geral';
                                            $grouped_pagar[ $cat ][] = $item;
                                        }
                                        foreach ( $items_checklist as $item ) {
                                            $cat = !empty($item['cat']) ? $item['cat'] : 'Geral';
                                            $grouped_checklist[ $cat ][] = $item;
                                        }
                                        ?>

                                        <?php // ===== SECÇÃO 1: A PAGAR À 1MZ ===== ?>
                                        <?php if ( ! empty( $grouped_pagar ) ): ?>
                                            <table class="budget-table" style="width:100%; color:#ddd; margin-bottom:20px; border-collapse: collapse;">
                                                <?php foreach($grouped_pagar as $cat_name => $cat_items): ?>
                                                    <?php if($cat_name !== 'Geral'): ?>
                                                        <tr><td colspan="2" style="padding:10px 0 5px 0; font-weight:bold; color:#f0b90b; border-bottom:1px solid #444; font-size:11px; text-transform:uppercase; letter-spacing:1px;"><?php echo esc_html($cat_name); ?></td></tr>
                                                    <?php endif; ?>
                                                    <?php foreach($cat_items as $item): ?>
                                                        <tr>
                                                            <td style="font-size:12px; border-bottom:1px solid #333; padding:6px 0; <?php echo ($cat_name !== 'Geral') ? 'padding-left:10px;' : ''; ?>"><?php echo ($cat_name !== 'Geral') ? '↳ ' : ''; ?><?php echo esc_html($item['desc'] ?? ''); ?></td>
                                                            <td style="text-align:right; font-size:12px; border-bottom:1px solid #333;"><?php echo number_format((float)($item['cost'] ?? 0), 2, ',', '.'); ?> MT</td>
                                                        </tr>
                                                    <?php endforeach; ?>
                                                <?php endforeach; ?>
                                                <tr class="total-row"><td style="padding-top:10px;">Total a pagar à 1MZ</td><td style="text-align:right; padding-top:10px;"><?php echo number_format($obligatory_cost, 2, ',', '.'); ?> MT</td></tr>
                                                <?php if ($ja_pago > 0 && !$totalmente_pago): ?><tr><td style="color:#2ecc71;">Já Pago</td><td style="text-align:right; color:#2ecc71;">- <?php echo number_format($ja_pago, 2, ',', '.'); ?> MT</td></tr><?php endif; ?>
                                                <tr class="total-row"><td style="color:#fff; font-weight:bold; padding-top:10px;">FALTA PAGAR</td><td style="text-align:right; color:#f0b90b; font-weight:bold; font-size:18px; padding-top:10px;"><?php echo number_format(max(0, $em_falta), 2, ',', '.'); ?> MT</td></tr>
                                            </table>

                                            <?php
                                            // [1.6.118.28] Aviso de cobrança adicional (mantido da Fase 0)
                                            $advanced_states = [ 'filming', 'editing', 'done' ];
                                            $is_advanced_phase = in_array( $status_raw, $advanced_states, true );
                                            $had_previous_payment = ( $ja_pago > 0 );
                                            if ( $is_advanced_phase && $em_falta > 0 && $had_previous_payment ):
                                            ?>
                                                <div style="background: linear-gradient(135deg, rgba(240,185,11,0.08), rgba(240,185,11,0.02)); border-left: 3px solid #f0b90b; border-radius: 6px; padding: 12px 14px; margin-top: 10px; margin-bottom: 15px;">
                                                    <p style="color: #f0b90b; font-size: 12px; font-weight: bold; margin: 0 0 4px 0; text-transform: uppercase; letter-spacing: 0.5px;">
                                                        💡 Cobrança adicional durante a produção
                                                    </p>
                                                    <p style="color: #ccc; font-size: 12px; margin: 0; line-height: 1.5;">
                                                        Surgiram custos extra durante a fase de <strong style="color:#fff;"><?php echo esc_html( ucfirst( $status_raw ) ); ?></strong> (ex: equipamento adicional, localização extra, ajustes pedidos). O valor inicial já foi pago — este é apenas um complemento.
                                                    </p>
                                                </div>
                                            <?php endif; ?>
                                        <?php endif; ?>

                                        <?php // ===== SECÇÃO 2: CHECKLIST DO ARTISTA ===== ?>
                                        <?php if ( ! empty( $grouped_checklist ) ): ?>
                                            <div style="background: rgba(46, 204, 113, 0.05); border: 1px solid #2ecc71; padding: 15px; border-radius: 8px; margin-bottom: 25px;">
                                                <h4 style="color:#2ecc71; margin-top:0; font-size:16px;">📋 A Sua Lista de Tarefas (Checklist)</h4>
                                                <p style="font-size:12px; color:#ccc; margin-bottom:15px; line-height:1.5;">Você assumiu a responsabilidade de arranjar estes itens para a gravação. À medida que conseguir cada um, envie as provas no chat abaixo para a administração colocar um visto (✅).</p>

                                                <table style="width:100%; color:#ddd; border-collapse: collapse;">
                                                    <?php foreach($grouped_checklist as $cat_name => $cat_items): ?>
                                                        <tr><td colspan="3" style="padding:15px 0 5px 0; font-weight:bold; color:#2ecc71; border-bottom:1px solid #444; font-size:11px; text-transform:uppercase; letter-spacing:1px;"><?php echo esc_html($cat_name); ?></td></tr>
                                                        <?php foreach($cat_items as $item): 
                                                            $is_checked = !empty($item['checked']) ? true : false;
                                                        ?>
                                                            <tr style="<?php echo $is_checked ? 'opacity:0.5;' : ''; ?>">
                                                                <td style="font-size:13px; border-bottom:1px dashed #333; padding:10px 0; <?php echo ($cat_name !== 'Geral') ? 'padding-left:10px;' : ''; ?> <?php echo $is_checked ? 'text-decoration:line-through; color:#777;' : ''; ?>">
                                                                    <?php echo ($cat_name !== 'Geral') ? '↳ ' : ''; ?><?php echo esc_html($item['desc'] ?? ''); ?>
                                                                </td>
                                                                <td style="text-align:right; font-size:11px; color:#888; border-bottom:1px dashed #333; padding:10px 6px;">
                                                                    <?php echo number_format( (float) ( $item['cost'] ?? 0 ), 2, ',', '.' ); ?> MT
                                                                </td>
                                                                <td style="text-align:right; font-size:16px; border-bottom:1px dashed #333; width: 50px;">
                                                                    <?php echo $is_checked ? '✅' : '⏳'; ?>
                                                                </td>
                                                            </tr>
                                                        <?php endforeach; ?>
                                                    <?php endforeach; ?>
                                                </table>

                                                <?php if ( $checklist_total > 0 ): ?>
                                                    <p style="color:#2ecc71; font-size:11px; margin-top:12px; padding-top:10px; border-top:1px solid rgba(46, 204, 113, 0.2); text-align:right;">
                                                        Valor que está a poupar arranjando você: <strong><?php echo number_format( $checklist_total, 2, ',', '.' ); ?> MT</strong>
                                                    </p>
                                                <?php endif; ?>
                                            </div>
                                        <?php endif; ?>

                                    <?php endif; ?>

                                    <?php
                                    // [1.6.118.64] DATAS DE GRAVAÇÃO — bloco visível ao artista quando o
                                    // admin já definiu datas E o projecto está aprovado. Artista pode
                                    // confirmar ou propor outras datas.
                                    $f_start_a = ! empty( $extra_proj['filming_start'] ) ? (string) $extra_proj['filming_start'] : '';
                                    $f_end_a   = ! empty( $extra_proj['filming_end'] )   ? (string) $extra_proj['filming_end']   : '';
                                    $f_conf_a  = ! empty( $extra_proj['filming_confirmed_by_artist'] );
                                    $f_prop_a  = ! empty( $extra_proj['filming_proposed_by_artist'] ) && is_array( $extra_proj['filming_proposed_by_artist'] )
                                        ? $extra_proj['filming_proposed_by_artist'] : null;
                                    $f_show    = ( $f_start_a !== '' || $f_end_a !== '' )
                                                 && ! in_array( $status_raw, [ 'pending_review', 'rejected', 'correction' ], true );
                                    if ( $f_show ):
                                    ?>
                                        <div style="background:rgba(240,185,11,0.06); border:1px solid #f0b90b; border-radius:8px; padding:18px; margin-bottom:25px;">
                                            <h4 style="color:#f0b90b; margin:0 0 12px 0; font-size:16px;">📅 Datas de Gravação</h4>

                                            <div style="display:flex; gap:20px; flex-wrap:wrap; margin-bottom:12px;">
                                                <div>
                                                    <div style="font-size:11px; color:#888; text-transform:uppercase; letter-spacing:1px;">Início</div>
                                                    <div style="font-size:18px; color:#fff; font-weight:bold;"><?php echo $f_start_a !== '' ? esc_html( date_i18n( 'd/m/Y', strtotime( $f_start_a ) ) ) : '—'; ?></div>
                                                </div>
                                                <div>
                                                    <div style="font-size:11px; color:#888; text-transform:uppercase; letter-spacing:1px;">Fim</div>
                                                    <div style="font-size:18px; color:#fff; font-weight:bold;"><?php echo $f_end_a !== '' ? esc_html( date_i18n( 'd/m/Y', strtotime( $f_end_a ) ) ) : '—'; ?></div>
                                                </div>
                                            </div>

                                            <?php if ( $f_conf_a ): ?>
                                                <div style="background:rgba(46,204,113,0.12); border-radius:6px; padding:10px 12px; font-size:13px; color:#2ecc71;">
                                                    ✅ Confirmaste estas datas. A equipa está informada.
                                                </div>
                                                <?php
                                                // [1.6.118.73] Barra de progresso + countdown — só quando confirmado.
                                                // Cálculo inicial em PHP; o JS actualiza o countdown a cada segundo.
                                                if ( $f_start_a !== '' && $f_end_a !== '' ):
                                                    $fp_uid       = 'filming-' . (int) $project->id;
                                                    $fp_start_ts  = strtotime( $f_start_a . ' 00:00:00' );
                                                    // Fim = fim do dia da data de fim (conta o dia inteiro)
                                                    $fp_end_ts    = strtotime( $f_end_a . ' 00:00:00' ) + DAY_IN_SECONDS;
                                                    $fp_now_ts    = current_time( 'timestamp' );
                                                    $fp_total     = max( 1, $fp_end_ts - $fp_start_ts );
                                                    // Intervalo inclusivo em dias (igual ao app)
                                                    $fp_total_days = max( 1, (int) round( ( strtotime( $f_end_a ) - strtotime( $f_start_a ) ) / DAY_IN_SECONDS ) + 1 );

                                                    // [1.5.412] A filmagem pode acabar ANTES da data-fim (a equipa
                                                    // marca 100%): quando o projeto já saiu de FILMAGEM (edição,
                                                    // concluído…), o cartão não pode continuar "a decorrer" com o
                                                    // countdown a contar — mostra logo "concluídas".
                                                    $fp_done_early = in_array( $status_raw, [ 'editing', 'done' ], true );
                                                    $fp_days_used  = 0;
                                                    if ( isset( $extra_proj['filming_sessions'] ) && is_array( $extra_proj['filming_sessions'] ) ) {
                                                        foreach ( $extra_proj['filming_sessions'] as $fp_s ) {
                                                            if ( is_array( $fp_s ) && ! empty( $fp_s['ended_at'] ) ) $fp_days_used++;
                                                        }
                                                    }

                                                    if ( $fp_done_early || $fp_now_ts >= $fp_end_ts ) {
                                                        $fp_label = $fp_days_used > 0
                                                            ? "Filmagens 100% concluídas em {$fp_days_used} dia(s) 🎬"
                                                            : 'Filmagens concluídas 🎬';
                                                        $fp_pct   = 100;
                                                        $fp_color = '#2ecc71';
                                                        $fp_over  = true;
                                                    } elseif ( $fp_now_ts < $fp_start_ts ) {
                                                        $fp_days_until = (int) ceil( ( $fp_start_ts - $fp_now_ts ) / DAY_IN_SECONDS );
                                                        $fp_label = $fp_days_until <= 0 ? 'Começa hoje!' : ( $fp_days_until === 1 ? 'Falta 1 dia para começar' : "Faltam {$fp_days_until} dias para começar" );
                                                        $fp_pct   = 5;
                                                        $fp_color = '#f0b90b';
                                                        $fp_over  = false;
                                                    } else {
                                                        $fp_day_num = (int) floor( ( $fp_now_ts - $fp_start_ts ) / DAY_IN_SECONDS ) + 1;
                                                        $fp_pct     = min( 100, max( 0, (int) round( ( $fp_day_num / $fp_total_days ) * 100 ) ) );
                                                        $fp_label   = "Dia {$fp_day_num} de {$fp_total_days} — filmagens a decorrer";
                                                        $fp_color   = '#2ecc71';
                                                        $fp_over    = false;
                                                    }
                                                ?>
                                                <div style="margin-top:16px;">
                                                    <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:8px;">
                                                        <span style="font-size:12px; font-weight:500; color:<?php echo esc_attr( $fp_color ); ?>;"><?php echo esc_html( $fp_label ); ?></span>
                                                        <span id="<?php echo esc_attr( $fp_uid ); ?>-pct" style="font-size:13px; font-weight:bold; color:<?php echo esc_attr( $fp_color ); ?>;"><?php echo (int) $fp_pct; ?>%</span>
                                                    </div>
                                                    <!-- Barra de progresso com brilho animado (estilo M3) -->
                                                    <div style="position:relative; height:10px; border-radius:5px; background:<?php echo esc_attr( $fp_color ); ?>2e; overflow:hidden;">
                                                        <div id="<?php echo esc_attr( $fp_uid ); ?>-bar"
                                                             style="position:absolute; left:0; top:0; bottom:0; width:<?php echo (int) $fp_pct; ?>%; border-radius:5px;
                                                                    background:<?php echo esc_attr( $fp_color ); ?>;
                                                                    background-image:linear-gradient(90deg, <?php echo esc_attr( $fp_color ); ?>cc 25%, <?php echo esc_attr( $fp_color ); ?> 50%, <?php echo esc_attr( $fp_color ); ?>cc 75%);
                                                                    background-size:20px 100%;
                                                                    animation:rmbzWave 1s linear infinite;">
                                                        </div>
                                                    </div>

                                                    <?php if ( ! $fp_over ): ?>
                                                    <!-- Countdown D:H:M:S -->
                                                    <div style="margin-top:16px;">
                                                        <div style="font-size:10px; font-weight:600; color:#888; letter-spacing:1px; text-transform:uppercase; margin-bottom:8px;">Tempo até ao fim</div>
                                                        <div style="display:flex; gap:8px;" id="<?php echo esc_attr( $fp_uid ); ?>-cd"
                                                             data-end="<?php echo (int) ( $fp_end_ts * 1000 ); ?>"
                                                             data-now="<?php echo (int) ( $fp_now_ts * 1000 ); ?>"
                                                             data-accent="<?php echo esc_attr( $fp_color ); ?>">
                                                            <?php
                                                            $fp_rem  = max( 0, $fp_end_ts - $fp_now_ts );
                                                            $fp_d    = floor( $fp_rem / 86400 );
                                                            $fp_h    = floor( ( $fp_rem % 86400 ) / 3600 );
                                                            $fp_m    = floor( ( $fp_rem % 3600 ) / 60 );
                                                            $fp_s    = $fp_rem % 60;
                                                            $fp_units = [ [ 'd', 'DIAS', $fp_d ], [ 'h', 'HORAS', $fp_h ], [ 'm', 'MIN', $fp_m ], [ 's', 'SEG', $fp_s ] ];
                                                            foreach ( $fp_units as $u ):
                                                            ?>
                                                                <div style="flex:1; background:<?php echo esc_attr( $fp_color ); ?>1a; border-radius:14px; padding:12px 0; text-align:center;">
                                                                    <div id="<?php echo esc_attr( $fp_uid . '-' . $u[0] ); ?>" style="font-size:22px; font-weight:bold; color:<?php echo esc_attr( $fp_color ); ?>;"><?php echo str_pad( (string) $u[2], 2, '0', STR_PAD_LEFT ); ?></div>
                                                                    <div style="font-size:9px; font-weight:500; color:#888; letter-spacing:0.5px;"><?php echo esc_html( $u[1] ); ?></div>
                                                                </div>
                                                            <?php endforeach; ?>
                                                        </div>
                                                    </div>
                                                    <?php endif; ?>
                                                </div>
                                                <style>@keyframes rmbzWave { from { background-position-x: 0; } to { background-position-x: 24px; } }</style>
                                                <script>
                                                (function(){
                                                    var el = document.getElementById('<?php echo esc_js( $fp_uid ); ?>-cd');
                                                    if (!el || el.dataset.rmbzInit) return;
                                                    el.dataset.rmbzInit = '1';
                                                    var endMs = parseInt(el.dataset.end, 10);
                                                    // Offset entre o relógio do servidor e o do browser, para
                                                    // contar corretamente mesmo se o relógio local estiver torto.
                                                    var serverNow = parseInt(el.dataset.now, 10);
                                                    var clientStart = Date.now();
                                                    var pad = function(n){ return (n < 10 ? '0' : '') + n; };
                                                    var ids = {
                                                        d: document.getElementById('<?php echo esc_js( $fp_uid ); ?>-d'),
                                                        h: document.getElementById('<?php echo esc_js( $fp_uid ); ?>-h'),
                                                        m: document.getElementById('<?php echo esc_js( $fp_uid ); ?>-m'),
                                                        s: document.getElementById('<?php echo esc_js( $fp_uid ); ?>-s')
                                                    };
                                                    function tick(){
                                                        var now = serverNow + (Date.now() - clientStart);
                                                        var rem = Math.max(0, Math.floor((endMs - now) / 1000));
                                                        var d = Math.floor(rem / 86400);
                                                        var h = Math.floor((rem % 86400) / 3600);
                                                        var m = Math.floor((rem % 3600) / 60);
                                                        var s = rem % 60;
                                                        if (ids.d) ids.d.textContent = pad(d);
                                                        if (ids.h) ids.h.textContent = pad(h);
                                                        if (ids.m) ids.m.textContent = pad(m);
                                                        if (ids.s) ids.s.textContent = pad(s);
                                                        if (rem <= 0) { clearInterval(timer); }
                                                    }
                                                    tick();
                                                    var timer = setInterval(tick, 1000);
                                                })();
                                                </script>
                                                <?php endif; /* tem datas start+end */ ?>
                                            <?php elseif ( $f_prop_a ): ?>
                                                <div style="background:rgba(240,185,11,0.1); border-radius:6px; padding:10px 12px; font-size:13px; color:#f0b90b; margin-bottom:12px;">
                                                    📅 Propuseste: <strong><?php echo esc_html( date_i18n( 'd/m/Y', strtotime( $f_prop_a['start'] ?? '' ) ) ); ?></strong> a <strong><?php echo esc_html( date_i18n( 'd/m/Y', strtotime( $f_prop_a['end'] ?? '' ) ) ); ?></strong>. Aguarda resposta da equipa.
                                                </div>
                                            <?php else: ?>
                                                <p style="color:#ccc; font-size:13px; margin:0 0 14px 0; line-height:1.5;">Confirma se estas datas te servem, ou propõe outras se precisares.</p>

                                                <div style="display:flex; gap:10px; flex-wrap:wrap;">
                                                    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" style="margin:0;">
                                                        <input type="hidden" name="action" value="onemz_confirm_filming_dates">
                                                        <input type="hidden" name="project_id" value="<?php echo (int) $project->id; ?>">
                                                        <?php wp_nonce_field('onemz_filming_nonce'); ?>
                                                        <button type="submit" class="m3-btn" style="background:#2ecc71; color:#04250f;">✅ Confirmar datas</button>
                                                    </form>

                                                    <button type="button" onclick="document.getElementById('rmbz-propose-<?php echo (int) $project->id; ?>').style.display='block'; this.style.display='none';" class="m3-btn m3-btn--outlined">📅 Propor outras datas</button>
                                                </div>

                                                <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" id="rmbz-propose-<?php echo (int) $project->id; ?>" style="display:none; margin-top:var(--rmbz-space-4); background:var(--rmbz-bg-elevated); padding:var(--rmbz-space-4); border-radius:var(--rmbz-radius-md);">
                                                    <input type="hidden" name="action" value="onemz_propose_filming_dates">
                                                    <input type="hidden" name="project_id" value="<?php echo (int) $project->id; ?>">
                                                    <?php wp_nonce_field('onemz_filming_nonce'); ?>
                                                    <div style="display:flex; gap:10px; flex-wrap:wrap; margin-bottom:var(--rmbz-space-3);">
                                                        <div style="flex:1; min-width:130px;">
                                                            <label style="font-size:var(--rmbz-text-2xs); color:var(--rmbz-text-muted); display:block; margin-bottom:4px;">Novo início</label>
                                                            <input type="date" name="propose_start" required style="width:100%; padding:10px; background:var(--rmbz-bg-input); border:1px solid rgba(255,255,255,0.1); color:var(--rmbz-text-primary); border-radius:var(--rmbz-radius-sm);">
                                                        </div>
                                                        <div style="flex:1; min-width:130px;">
                                                            <label style="font-size:var(--rmbz-text-2xs); color:var(--rmbz-text-muted); display:block; margin-bottom:4px;">Novo fim</label>
                                                            <input type="date" name="propose_end" required style="width:100%; padding:10px; background:var(--rmbz-bg-input); border:1px solid rgba(255,255,255,0.1); color:var(--rmbz-text-primary); border-radius:var(--rmbz-radius-sm);">
                                                        </div>
                                                    </div>
                                                    <button type="submit" class="m3-btn m3-btn--filled m3-btn--block">Enviar proposta</button>
                                                </form>
                                            <?php endif; ?>
                                        </div>
                                    <?php endif; ?>

                                    <?php 
                                    // VARIÁVEIS DE ESTADO
                                    $kyc_status = $extra_proj['kyc_status'] ?? '';
                                    $is_contract_sent = !empty($contract_url);
                                    $is_kyc_approved = ($contract_accepted && $kyc_status === 'approved');
                                    $contract_rejected = isset($extra_proj['contract_rejected']) ? $extra_proj['contract_rejected'] : false;
                                    // [1.6.118.32] Garantir $payment_choice sempre definido (fallback seguro).
                                    // Antes só era definido dentro do branch de "budget_items".
                                    if ( ! isset( $payment_choice ) ) {
                                        $payment_choice = $extra_proj['payment_choice'] ?? 'pay_producer';
                                    }
                                    ?>

                                    <?php
                                    // [1.5.412] Stepper M3 Expressive: passos concluídos com ✓, ativo
                                    // maior e a pulsar suave, ligados por uma linha com progresso.
                                    $rmbz_steps = [
                                        [ 'done' => (bool) $is_contract_sent,  'label' => 'Contrato & Assinatura', 'icon' => '📜' ],
                                        [ 'done' => (bool) $is_kyc_approved,   'label' => 'Validação Equipa',      'icon' => '🛡️' ],
                                        [ 'done' => (bool) $totalmente_pago,   'label' => 'Pagamento & Gravação',  'icon' => '🎬' ],
                                    ];
                                    $rmbz_done_n = count( array_filter( $rmbz_steps, fn( $s ) => $s['done'] ) );
                                    // Progresso da linha: 0 feitos = 0%, 1 = 50%, 2+ = 100% (entre 3 passos)
                                    $rmbz_line_pct = min( 100, (int) round( ( max( 0, $rmbz_done_n - 0 ) / 2 ) * 100 ) );
                                    $rmbz_active_i = min( 2, $rmbz_done_n ); // primeiro passo por concluir
                                    ?>
                                    <div style="display:flex; justify-content:space-between; margin:26px 0 28px; position:relative; z-index:1;">
                                        <div style="position:absolute; top:19px; left:12%; right:12%; height:4px; border-radius:99px; background:rgba(255,255,255,.08); z-index:-1; overflow:hidden;">
                                            <div style="height:100%; width:<?php echo (int) $rmbz_line_pct; ?>%; border-radius:99px; background:linear-gradient(90deg,#f0b90b,#2ecc71);"></div>
                                        </div>
                                        <?php foreach ( $rmbz_steps as $si => $s ):
                                            $is_active = ( ! $s['done'] && $si === $rmbz_active_i );
                                            if ( $s['done'] ) {
                                                $circ = 'background:linear-gradient(135deg,#2ecc71,#27ae60); color:#04250f; box-shadow:0 6px 16px -6px rgba(46,204,113,.6);';
                                                $lbl_c = '#2ecc71';
                                            } elseif ( $is_active ) {
                                                $circ = 'background:linear-gradient(135deg,#f6d569,#f0b90b); color:#3d2c00; box-shadow:0 0 0 6px rgba(240,185,11,.14), 0 6px 16px -6px rgba(240,185,11,.6);';
                                                $lbl_c = '#f0b90b';
                                            } else {
                                                $circ = 'background:rgba(255,255,255,.07); color:#8a8698; border:1.5px solid rgba(255,255,255,.12);';
                                                $lbl_c = '#8a8698';
                                            }
                                        ?>
                                            <div style="text-align:center; flex:1;">
                                                <div style="width:38px; height:38px; border-radius:50%; margin:0 auto 10px; display:flex; align-items:center; justify-content:center; font-weight:900; font-size:14px; <?php echo $circ; ?>">
                                                    <?php echo $s['done'] ? '✓' : (int) ( $si + 1 ); ?>
                                                </div>
                                                <span style="font-size:11px; font-weight:700; color:<?php echo esc_attr( $lbl_c ); ?>;"><?php echo esc_html( $s['icon'] . ' ' . $s['label'] ); ?></span>
                                            </div>
                                        <?php endforeach; ?>
                                    </div>

                                    <div style="background:rgba(255,255,255,.045); border:1px solid rgba(255,255,255,.10); padding:22px; border-radius:20px;">
                                        
                                        <?php if (!$is_contract_sent): ?>
                                            <div style="text-align:center;">
                                                <div style="font-size:30px; margin-bottom:10px;">⏳</div>
                                                <h4 style="color:#f0b90b; margin:0 0 5px 0;">A criar contrato</h4>
                                                <p style="color:#aaa; font-size:12px; margin:0;">A nossa equipa está a elaborar o contrato oficial. Irá recebê-lo aqui em breve.</p>
                                            </div>
                                        
                                        <?php elseif ($contract_rejected): ?>
                                            <div style="text-align:center;">
                                                <h4 style="color:#e74c3c; margin:0 0 5px 0;">❌ Contrato Recusado</h4>
                                                <p style="color:#aaa; font-size:12px;">Enviou uma objeção. Aguarde o novo documento retificado.</p>
                                                <div style="background:#111; padding:8px; border-radius:4px; font-size:12px; color:#e74c3c; border-left:3px solid #e74c3c; margin-top:10px; text-align:left;">O seu motivo: <em><?php echo esc_html($extra_proj['contract_rejected_reason'] ?? ''); ?></em></div>
                                            </div>

                                        <?php elseif ($kyc_status === 'pending_admin_review'): ?>
                                            <div style="text-align:center;">
                                                <div style="font-size:30px; margin-bottom:10px;">🛡️</div>
                                                <h4 style="color:#3498db; margin:0 0 5px 0;">Identidade em Análise</h4>
                                                <p style="color:#ccc; font-size:13px; line-height:1.5; margin:0;">Recebemos a sua foto com o BI. A equipa de segurança da 1MZ está a validar a sua identidade. Assim que for aprovada, o pagamento do clipe será desbloqueado.</p>
                                            </div>
                                        
                                        <?php elseif ($kyc_status === 'rejected'): ?>
                                            <div style="text-align:center; border:1px solid #e74c3c; padding:15px; border-radius:6px; background:rgba(231, 76, 60, 0.1); margin-bottom:15px;">
                                                <h4 style="color:#e74c3c; margin:0 0 5px 0;">❌ Foto Rejeitada pela Segurança</h4>
                                                <p style="color:#ccc; font-size:12px;">A sua foto com o BI foi recusada pelo seguinte motivo: <strong><?php echo esc_html($extra_proj['kyc_rejection_reason'] ?? ''); ?></strong></p>
                                                <p style="color:#f0b90b; font-size:12px; margin-top:10px;">Por favor, preencha novamente o formulário abaixo com uma foto mais nítida.</p>
                                            </div>
                                            <?php elseif ($is_kyc_approved): ?>
                                            <?php // [1.5.412] "Tudo Certo!" M3 + o contrato abre num MODAL (não navega para a URL). ?>
                                            <div style="text-align:center;">
                                                <div style="width:58px; height:58px; margin:0 auto 10px; border-radius:50%; background:rgba(46,204,113,.14); border:1.5px solid rgba(46,204,113,.45); display:flex; align-items:center; justify-content:center; font-size:26px;">✅</div>
                                                <h4 style="color:#2ecc71; margin:0 0 5px 0; font-size:18px; font-weight:900;">Tudo Certo!</h4>
                                                <p style="color:#b8b2cc; font-size:12.5px; margin:0;">Identidade validada e contrato legalmente ativo em nome de: <strong style="color:#e8e4f4;"><?php echo esc_html($extra_proj['contract_real_name'] ?? ''); ?></strong>.</p>
                                                <?php if ( ! empty( $contract_url ) ): ?>
                                                    <button type="button"
                                                            onclick="rmbzOpenContractModal('<?php echo (int) $project->id; ?>')"
                                                            style="display:inline-flex; align-items:center; gap:8px; margin-top:14px; background:rgba(52,152,219,.14); border:1.5px solid rgba(52,152,219,.5); color:#5dade2; font-size:12px; font-weight:800; border-radius:99px; padding:10px 22px; cursor:pointer;">
                                                        📜 Ver Cópia do Contrato Original
                                                    </button>
                                                <?php endif; ?>
                                            </div>

                                        <?php endif; ?>

                                        <?php if ( ! empty( $contract_url ) ): ?>
                                            <!-- [1.5.412] MODAL do contrato: visualiza dentro do site (PDF/imagem
                                                 embebido), com opções de abrir noutro separador / descarregar. -->
                                            <div id="rmbz-cmodal-<?php echo (int) $project->id; ?>"
                                                 style="display:none; position:fixed; inset:0; z-index:999999; background:rgba(5,4,10,.82); backdrop-filter:blur(5px); padding:16px; align-items:center; justify-content:center;"
                                                 onclick="if(event.target===this) rmbzCloseContractModal('<?php echo (int) $project->id; ?>');">
                                                <div style="background:#15141c; border:1px solid rgba(255,255,255,.13); border-radius:24px; width:min(880px,100%); height:min(88vh,940px); display:flex; flex-direction:column; overflow:hidden; box-shadow:0 30px 80px -20px rgba(0,0,0,.8);">
                                                    <div style="display:flex; align-items:center; gap:10px; padding:14px 18px; border-bottom:1px solid rgba(255,255,255,.09);">
                                                        <span style="font-size:20px;">📜</span>
                                                        <div style="flex:1; min-width:0;">
                                                            <div style="font-size:14px; font-weight:900; color:#fff;">Contrato Original</div>
                                                            <div style="font-size:11px; color:#8a8698;">Documento legalmente ativo — só leitura</div>
                                                        </div>
                                                        <a href="<?php echo esc_url( $contract_url ); ?>" target="_blank" rel="noopener"
                                                           style="display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:800; color:#b8b2cc; text-decoration:none; border:1px solid rgba(255,255,255,.16); border-radius:99px; padding:8px 14px; white-space:nowrap; line-height:1; flex-shrink:0;">⬇️ Descarregar</a>
                                                        <?php /* [1.5.412] appearance/padding/min-width forçados — o CSS
                                                                 de botões do tema esticava o ✕ numa "pílula" oval. */ ?>
                                                        <button type="button" onclick="rmbzCloseContractModal('<?php echo (int) $project->id; ?>')"
                                                                aria-label="Fechar"
                                                                style="appearance:none; -webkit-appearance:none; box-sizing:border-box; width:34px; height:34px; min-width:34px; max-width:34px; padding:0; margin:0; border-radius:50%; border:0; background:rgba(255,255,255,.09); color:#fff; font-size:14px; font-weight:900; line-height:1; cursor:pointer; flex-shrink:0; display:inline-flex; align-items:center; justify-content:center;">✕</button>
                                                    </div>
                                                    <div style="flex:1; min-height:0; background:#0d0c12;">
                                                        <?php
                                                        $rmbz_c_ext = strtolower( (string) pathinfo( (string) parse_url( $contract_url, PHP_URL_PATH ), PATHINFO_EXTENSION ) );
                                                        if ( in_array( $rmbz_c_ext, [ 'jpg', 'jpeg', 'png', 'gif', 'webp' ], true ) ):
                                                        ?>
                                                            <div style="height:100%; overflow:auto; text-align:center; padding:16px;">
                                                                <img src="<?php echo esc_url( $contract_url ); ?>" alt="Contrato" style="max-width:100%; border-radius:12px;">
                                                            </div>
                                                        <?php else: ?>
                                                            <object data="<?php echo esc_url( $contract_url ); ?>#toolbar=0" type="application/pdf" style="width:100%; height:100%;">
                                                                <div style="display:flex; flex-direction:column; align-items:center; justify-content:center; height:100%; gap:12px; padding:24px; text-align:center;">
                                                                    <div style="font-size:40px;">📄</div>
                                                                    <p style="color:#b8b2cc; font-size:13px; margin:0; max-width:320px;">O teu navegador não consegue mostrar o PDF aqui dentro — abre ou descarrega o contrato:</p>
                                                                    <a href="<?php echo esc_url( $contract_url ); ?>" target="_blank" rel="noopener"
                                                                       style="background:#f0b90b; color:#3d2c00; font-size:12px; font-weight:900; border-radius:99px; padding:11px 24px; text-decoration:none;">📄 Abrir o contrato</a>
                                                                </div>
                                                            </object>
                                                        <?php endif; ?>
                                                    </div>
                                                </div>
                                            </div>
                                            <script>
                                            function rmbzOpenContractModal(id){
                                                var m = document.getElementById('rmbz-cmodal-' + id);
                                                if (m) { m.style.display = 'flex'; document.body.style.overflow = 'hidden'; }
                                            }
                                            function rmbzCloseContractModal(id){
                                                var m = document.getElementById('rmbz-cmodal-' + id);
                                                if (m) { m.style.display = 'none'; document.body.style.overflow = ''; }
                                            }
                                            </script>
                                        <?php endif; ?>

                                        <?php if ($is_contract_sent && (!$contract_accepted || $kyc_status === 'rejected') && !$contract_rejected): ?>
                                            
                                            <?php 
                                            // LÓGICA DO CRONÓMETRO (Verifica se falta 1 dia ou menos)
                                            $deadline = !empty($extra_proj['contract_deadline']) ? $extra_proj['contract_deadline'] : (!empty($extra_proj['contract_sent_date']) ? $extra_proj['contract_sent_date'] + 259200 : 0);
                                            $time_left = $deadline > 0 ? ($deadline - time()) : 0;
                                            
                                            if ($time_left <= 86400 && $deadline > 0): // 86400 segundos = 24 horas
                                            ?>
                                                <style>@keyframes alertPulse { 0% {box-shadow: 0 0 0 0 rgba(231,76,60,0.4);} 70% {box-shadow: 0 0 0 10px rgba(231,76,60,0);} 100% {box-shadow: 0 0 0 0 rgba(231,76,60,0);} }</style>
                                                <div id="countdown-box-<?php echo $project->id; ?>" style="background: rgba(231,76,60,0.08); border: 1px solid #e74c3c; padding: 15px; border-radius: 8px; margin-bottom: 20px; text-align: center; <?php echo ($time_left > 0) ? 'animation: alertPulse 2s infinite;' : ''; ?>">
                                                    <div style="font-size:24px; margin-bottom:5px;">⏳</div>
                                                    <strong style="color: #e74c3c; display: block; margin-bottom: 5px; font-size: 14px; text-transform:uppercase;">
                                                        <?php echo ($time_left > 0) ? 'O Prazo Termina em Breve!' : 'TEMPO ESGOTADO!'; ?>
                                                    </strong>
                                                    
                                                    <?php if ($time_left > 0): ?>
                                                        <p style="color: #ccc; font-size: 12px; margin: 0 0 10px 0;">Se não aceitar, o projeto será cancelado em:</p>
                                                        <div id="timer-<?php echo $project->id; ?>" style="font-size: 28px; font-weight: 900; color: #e74c3c; letter-spacing: 2px; font-family: monospace;">--:--:--</div>
                                                        <script>
                                                            (function(){
                                                                let timeLeft = <?php echo $time_left; ?>;
                                                                let timerEl = document.getElementById('timer-<?php echo $project->id; ?>');
                                                                
                                                                let interval = setInterval(function(){
                                                                    if(timeLeft <= 0) {
                                                                        clearInterval(interval);
                                                                        timerEl.innerHTML = "00h 00m 00s";
                                                                        setTimeout(() => location.reload(), 2000); // Recarrega a página para o robô atuar
                                                                        return;
                                                                    }
                                                                    timeLeft--;
                                                                    let h = Math.floor(timeLeft / 3600);
                                                                    let m = Math.floor((timeLeft % 3600) / 60);
                                                                    let s = timeLeft % 60;
                                                                    timerEl.innerHTML = (h < 10 ? "0"+h : h) + "h " + (m < 10 ? "0"+m : m) + "m " + (s < 10 ? "0"+s : s) + "s";
                                                                }, 1000);
                                                            })();
                                                        </script>
                                                    <?php else: ?>
                                                        <p style="color: #ccc; font-size: 12px; margin: 0;">A nossa equipa está a processar o cancelamento do contrato e a fechar o orçamento.</p>
                                                    <?php endif; ?>
                                                </div>
                                            <?php endif; ?>

                                            <p style="color: #ccc; font-size: 13px; margin-bottom: 10px; text-align:center;">A administração enviou o contrato oficial com os termos de gravação. Lê atentamente antes de aceitar.</p>
                                            <?php // [1.5.412] Ver no modal + descarregar — pills M3. ?>
                                            <div style="display:flex; gap:10px; justify-content:center; flex-wrap:wrap; margin-bottom:20px;">
                                                <button type="button" onclick="rmbzOpenContractModal('<?php echo (int) $project->id; ?>')"
                                                        style="display:inline-flex; align-items:center; gap:8px; background:#f0b90b; color:#3d2c00; font-size:13px; font-weight:900; border-radius:99px; padding:11px 24px; border:0; cursor:pointer;">
                                                    📜 Ler o Contrato
                                                </button>
                                                <a href="<?php echo esc_url($contract_url); ?>" target="_blank" rel="noopener"
                                                   style="display:inline-flex; align-items:center; gap:8px; background:rgba(255,255,255,.08); color:#e8e4f4; font-size:13px; font-weight:800; border-radius:99px; padding:11px 24px; text-decoration:none; border:1px solid rgba(255,255,255,.16);">
                                                    ⬇️ Descarregar PDF
                                                </a>
                                            </div>
                                            
                                            <?php if (!empty($extra_proj['script_url'])): ?>
                                                <div style="background: rgba(46, 204, 113, 0.1); border: 1px solid #2ecc71; border-left: 4px solid #2ecc71; padding: 15px; border-radius: 6px; margin-bottom: 20px; text-align: center;">
                                                    <h4 style="color:#2ecc71; margin:0 0 10px 0;">🎬 Guião do Videoclipe</h4>
                                                    <p style="color:#ccc; font-size:12px; margin-bottom:15px;">Leia o guião cuidadosamente para entender a história, os cenários e o que será necessário no dia da gravação.</p>
                                                    <a href="<?php echo esc_url($extra_proj['script_url']); ?>" target="_blank" class="onemz-btn" style="background:#2ecc71; color:#000; padding:8px 15px; border-radius:4px; font-weight:bold; font-size:12px; text-decoration:none; display:inline-block;">📥 Abrir / Descarregar Guião</a>
                                                </div>
                                            <?php endif; ?>

                                            <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" enctype="multipart/form-data" style="background:#111; padding:20px; border-radius:8px; border:1px dashed #f0b90b; margin-bottom:15px;">
                                                <input type="hidden" name="action" value="onemz_accept_contract">
                                                <input type="hidden" name="project_id" value="<?php echo $project->id; ?>">
                                                <?php wp_nonce_field('onemz_accept_contract_nonce'); ?>
                                                
                                                <h4 style="color:#f0b90b; font-size:14px; margin:0 0 10px 0;">📸 Validação de Identidade Oficial</h4>
                                                <ul style="color:#aaa; font-size:12px; padding-left:15px; margin-bottom:20px; line-height:1.6;">
                                                    <li>Segure o seu <strong>Bilhete de Identidade (BI)</strong> na mão ao lado do rosto.</li>
                                                    <li>Segure um papel escrito <strong>"Aceito o Contrato 1MZ"</strong> com a <strong>Data</strong> de hoje.</li>
                                                    <li>A foto tem de ser nítida. O nome e rosto no documento têm de ser legíveis.</li>
                                                </ul>

                                                <?php
                                                // [1.6.118.35] Fase 2 — Decisão per-item de items negociáveis.
                                                // Substitui a antiga escolha global 'pay_producer' vs 'assume_costs'.
                                                //
                                                // Lógica:
                                                //  - Items must_pay=1 → mostrar como "obrigatório" (artista paga sempre, sem decisão)
                                                //  - Items must_pay=0 → radio per-item: "💰 1MZ paga" (default) vs "✋ Eu assumo"
                                                //
                                                // Retrocompat: items legados sem must_pay têm default 1 (obrigatório) — feed da
                                                // normalização da API. Se nenhum item é negociável, este bloco não aparece.
                                                $obrigatorios = [];
                                                $negociaveis  = [];
                                                if ( ! empty( $budget_items ) && is_array( $budget_items ) ) {
                                                    foreach ( $budget_items as $idx => $it ) {
                                                        $mp = isset( $it['must_pay'] ) ? (int) $it['must_pay'] : 1;
                                                        if ( $mp === 1 ) {
                                                            $obrigatorios[ $idx ] = $it;
                                                        } else {
                                                            $negociaveis[ $idx ] = $it;
                                                        }
                                                    }
                                                }
                                                ?>

                                                <?php if ( ! empty( $obrigatorios ) ): ?>
                                                    <div style="background:#1a1a1a; padding:15px; border:1px solid #333; border-radius:6px; margin-bottom:14px; border-left:4px solid #3498db;">
                                                        <h5 style="color:#fff; margin:0 0 8px 0; font-size:13px;">💰 Items obrigatórios (pagas à 1MZ)</h5>
                                                        <p style="color:#888; font-size:11px; margin:0 0 12px 0; line-height:1.4;">
                                                            Estes itens são essenciais para a produção e a 1MZ trata de tudo. Pagas o valor à carteira da 1MZ.
                                                        </p>
                                                        <table style="width:100%; color:#ddd; font-size:12px; border-collapse:collapse;">
                                                            <?php $sum_obrig = 0; foreach ( $obrigatorios as $it ): $sum_obrig += (float) ( $it['cost'] ?? 0 ); ?>
                                                                <tr>
                                                                    <td style="padding:6px 0; border-bottom:1px dashed #2a2a2a;">
                                                                        <?php echo esc_html( $it['desc'] ?? '' ); ?>
                                                                        <?php if ( ! empty( $it['cat'] ) && $it['cat'] !== 'Geral' ): ?>
                                                                            <span style="color:#666; font-size:10px;"> · <?php echo esc_html( $it['cat'] ); ?></span>
                                                                        <?php endif; ?>
                                                                    </td>
                                                                    <td style="padding:6px 0; border-bottom:1px dashed #2a2a2a; text-align:right; color:#3498db; font-weight:600; white-space:nowrap;">
                                                                        <?php echo number_format( (float) ( $it['cost'] ?? 0 ), 2, ',', '.' ); ?> MT
                                                                    </td>
                                                                </tr>
                                                            <?php endforeach; ?>
                                                            <tr>
                                                                <td style="padding-top:8px; font-weight:bold; color:#fff;">Sub-total obrigatório</td>
                                                                <td style="padding-top:8px; text-align:right; color:#3498db; font-weight:900; font-size:14px;"><?php echo number_format( $sum_obrig, 2, ',', '.' ); ?> MT</td>
                                                            </tr>
                                                        </table>
                                                    </div>
                                                <?php endif; ?>

                                                <?php if ( ! empty( $negociaveis ) ): ?>
                                                    <div style="background:#1a1a1a; padding:15px; border:1px solid #333; border-radius:6px; margin-bottom:20px; border-left:4px solid #f0b90b;">
                                                        <h5 style="color:#fff; margin:0 0 8px 0; font-size:13px;">🤝 Items negociáveis (decisão tua)</h5>
                                                        <p style="color:#888; font-size:11px; margin:0 0 12px 0; line-height:1.4;">
                                                            Para cada item abaixo, escolhe: pagar à 1MZ (ela trata) ou assumir e arranjar tu próprio.
                                                        </p>

                                                        <?php foreach ( $negociaveis as $idx => $it ):
                                                            $assumed_default = ! empty( $it['artist_assumes'] ) ? '1' : '0';
                                                            $cost_str = number_format( (float) ( $it['cost'] ?? 0 ), 2, ',', '.' );
                                                            $desc     = esc_html( $it['desc'] ?? '' );
                                                            $cat      = ( ! empty( $it['cat'] ) && $it['cat'] !== 'Geral' ) ? ' · ' . esc_html( $it['cat'] ) : '';
                                                            $uid = 'neg-' . (int) $project->id . '-' . (int) $idx;
                                                        ?>
                                                            <div style="background:#222; border-radius:6px; padding:12px; margin-bottom:10px;">
                                                                <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; gap:10px;">
                                                                    <span style="color:#fff; font-size:13px; font-weight:600;">
                                                                        <?php echo $desc; ?>
                                                                        <span style="color:#666; font-size:10px; font-weight:400;"><?php echo $cat; ?></span>
                                                                    </span>
                                                                    <span style="color:#f0b90b; font-weight:700; white-space:nowrap; font-size:13px;"><?php echo $cost_str; ?> MT</span>
                                                                </div>

                                                                <label style="display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; margin-bottom:6px; background:rgba(52, 152, 219, 0.07); border:1px solid rgba(52, 152, 219, 0.2);" for="<?php echo esc_attr( $uid ); ?>-pay">
                                                                    <input type="radio" id="<?php echo esc_attr( $uid ); ?>-pay" name="item_assumes[<?php echo (int) $idx; ?>]" value="0" <?php checked( $assumed_default, '0' ); ?> style="margin:0;">
                                                                    <span style="color:#3498db; font-size:12px;"><strong>💰 1MZ paga:</strong> a equipa organiza</span>
                                                                </label>

                                                                <label style="display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; background:rgba(46, 204, 113, 0.07); border:1px solid rgba(46, 204, 113, 0.2);" for="<?php echo esc_attr( $uid ); ?>-assume">
                                                                    <input type="radio" id="<?php echo esc_attr( $uid ); ?>-assume" name="item_assumes[<?php echo (int) $idx; ?>]" value="1" <?php checked( $assumed_default, '1' ); ?> style="margin:0;">
                                                                    <span style="color:#2ecc71; font-size:12px;"><strong>✋ Eu assumo:</strong> arranjo eu próprio</span>
                                                                </label>
                                                            </div>
                                                        <?php endforeach; ?>
                                                    </div>
                                                <?php endif; ?>

                                                <?php // [1.6.118.35] Mantém compat com form-handler antigo enquanto Fase 3 não chega:
                                                      // se houve uma escolha do utilizador no campo legacy payment_choice no admin,
                                                      // continua a gravar como pay_producer (default seguro). Form-handler
                                                      // vai aprender item_assumes[] na Fase 3.
                                                ?>
                                                <input type="hidden" name="payment_choice" value="pay_producer">

                                                <label style="color:#ccc; font-size:12px; display:block; margin-bottom:5px;">1. Fazer Upload da Foto (Rosto + BI + Papel): *</label>
                                                <input type="file" name="kyc_signature_photo" required accept="image/jpeg, image/png" style="width:100%; padding:10px; background:#222; border:1px solid #444; border-radius:4px; color:#fff; margin-bottom:20px; font-size:12px;">
                                                
                                                <label style="color:#ccc; font-size:12px; display:block; margin-bottom:5px;">2. A Sua Assinatura Digital (Nome Completo igual ao BI): *</label>
                                                <input type="text" name="kyc_real_name" required placeholder="Ex: João Miguel Silva..." style="width:100%; padding:12px; border-radius:4px; border:1px solid #444; background:#222; color:#fff; font-size:14px; margin-bottom:20px;">

                                                <button type="submit" class="onemz-btn" style="background: #2ecc71; color: #000; width: 100%; padding: 14px; border: none; font-weight: 900; border-radius: 6px; cursor: pointer; text-transform:uppercase;" onclick="return confirm('Confirmo que li o contrato, concordo com os termos e os dados da foto são verdadeiros.');">Concordar e Enviar Identidade ✅</button>
                                            </form>
                                            
                                            <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" style="margin-top:15px; text-align:center;">
                                                <input type="hidden" name="action" value="onemz_reject_contract">
                                                <input type="hidden" name="project_id" value="<?php echo $project->id; ?>">
                                                <?php wp_nonce_field('onemz_reject_contract_nonce'); ?>
                                                <p style="color: #888; font-size: 11px; margin-bottom: 5px;">Se não concorda com alguma alínea, indique o motivo abaixo:</p>
                                                <div style="display:flex; gap:5px; max-width: 100%;">
                                                    <input type="text" name="rejection_reason" required placeholder="Escreva o que quer alterar..." style="width:100%; padding:10px; border-radius:4px; border:1px solid #e74c3c; background:#111; color:#fff; font-size:12px;">
                                                    <button type="submit" class="onemz-btn" style="background: #e74c3c; color: #fff; padding: 10px 15px; border: none; font-weight: bold; border-radius: 4px; cursor: pointer;" onclick="return confirm('Aviso: Ao recusar, o projeto ficará parado até nova análise. Continuar?');">Recusar Contrato</button>
                                                </div>
                                            </form>
                                        <?php endif; ?>
                                        
                                    </div> <?php
                                    // [1.6.118.36] Fase 3 — botão de pagamento usa $em_falta (que agora é baseado
                                    // em obligatory_cost). Se artista assumiu TUDO (raro), $obligatory_cost=0 e
                                    // $em_falta=0 → botão não aparece. Sem necessidade de checar payment_choice.
                                    if (!$totalmente_pago && $em_falta > 0): ?>
                                        <?php if (empty($contract_url)): ?>
                                            <p style="color: #f0b90b; font-size: 12px; margin-top: 15px; text-align: right; background: #222; padding: 10px; border-radius: 4px;"><em>⚠️ Aguardando a administração enviar o Contrato de Produção.</em></p>
                                        <?php elseif (!$is_kyc_approved): ?>
                                            <p style="color: #e74c3c; font-size: 12px; margin-top: 15px; text-align: right; background: #222; padding: 10px; border-radius: 4px;"><em>* O pagamento será desbloqueado após a aprovação da sua identidade pela equipa.</em></p>
                                        <?php else: ?>
                                            <form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post" onsubmit="return confirm('Pagar <?php echo number_format($em_falta, 2, ',', '.'); ?> MT do seu saldo?');" style="margin-top:var(--rmbz-space-4);">
                                                <input type="hidden" name="action" value="onemz_pay_project_cost">
                                                <input type="hidden" name="project_id" value="<?php echo $project->id; ?>">
                                                <?php wp_nonce_field('onemz_pay_project_nonce'); ?>
                                                <button type="submit" class="onemz-btn btn-primary m3-btn m3-btn--filled m3-btn--block">💳 Pagar Com Saldo da Carteira</button>
                                            </form>
                                        <?php endif; ?>
                                    <?php endif; ?>

                                    <?php
                                    // [1.6.118.36] Caso especial: artista assumiu TUDO (sem items obrigatórios E
                                    // negociáveis todos assumidos) → mostrar info verde em vez do botão.
                                    // Acontece quando obligatory_cost=0 + há items na checklist.
                                    if ( $obligatory_cost <= 0 && ! empty( $items_checklist ) && ! empty( $contract_url ) && $is_kyc_approved ):
                                    ?>
                                        <div style="background: rgba(46, 204, 113, 0.06); border: 1px solid rgba(46, 204, 113, 0.3); border-left: 4px solid #2ecc71; padding: 12px 14px; margin-top: 15px; border-radius: 6px;">
                                            <p style="color: #2ecc71; font-size: 12px; font-weight: bold; margin: 0 0 4px 0; text-transform: uppercase; letter-spacing: 0.5px;">
                                                ✅ Sem pagamentos pendentes à 1MZ
                                            </p>
                                            <p style="color: #ccc; font-size: 12px; margin: 0; line-height: 1.5;">
                                                Você assumiu todos os items. Não há valor a pagar à 1MZ — vá enviando provas no chat à medida que arranja cada item da checklist.
                                            </p>
                                        </div>
                                    <?php endif; ?>

                                <?php endif; /* Fim do if block status rejected */ ?>
                            </div>
                        <?php endif; ?>
                        
                        <div style="margin-top:20px;">
                            <?php
                            // [1.6.118.30] Pitch da Produção — visível apenas se admin escreveu
                            // E projeto está em fase >= pre-production (já aprovado).
                            $production_pitch = $extra_proj['production_pitch'] ?? '';
                            $allowed_pitch_states = [ 'pre-production', 'kyc_review', 'filming', 'editing', 'done' ];
                            $show_pitch = ( $production_pitch !== '' && in_array( $status_raw, $allowed_pitch_states, true ) );
                            if ( $show_pitch ):
                                $pitch_modal_id = 'pitch-modal-' . (int) $project->id;
                            ?>
                                <div style="background: linear-gradient(135deg, rgba(240,185,11,0.10), rgba(240,185,11,0.02));
                                            border: 1px solid rgba(240,185,11,0.4); border-radius: 12px;
                                            padding: 18px 20px; margin-bottom: 15px; cursor: pointer; transition: 0.2s;"
                                     onclick="document.getElementById('<?php echo esc_attr( $pitch_modal_id ); ?>').style.display='flex';"
                                     onmouseover="this.style.borderColor='#f0b90b';" onmouseout="this.style.borderColor='rgba(240,185,11,0.4)';">
                                    <div style="display:flex; gap:14px; align-items:center;">
                                        <div style="font-size:32px; flex-shrink:0;">💡</div>
                                        <div style="flex:1; min-width:0;">
                                            <h4 style="color:#f0b90b; margin:0 0 4px 0; font-size:14px; font-weight:700; letter-spacing:0.3px;">
                                                Pitch da Produção disponível
                                            </h4>
                                            <p style="color:#ccc; font-size:12px; margin:0; line-height:1.4;">
                                                A equipa 1MZ partilhou a sua visão criativa para o teu videoclipe. Toca para ler.
                                            </p>
                                        </div>
                                        <div style="color:#f0b90b; font-size:22px; flex-shrink:0;">→</div>
                                    </div>
                                </div>

                                <!-- Modal do Pitch -->
                                <div id="<?php echo esc_attr( $pitch_modal_id ); ?>"
                                     style="display:none; position:fixed; top:0; left:0; right:0; bottom:0;
                                            background:rgba(0,0,0,0.85); z-index:99999; align-items:center; justify-content:center;
                                            padding:20px; backdrop-filter:blur(4px);"
                                     onclick="if(event.target===this){this.style.display='none';}">
                                    <div style="background:#1a1a1a; border:1px solid #f0b90b; border-radius:16px;
                                                max-width:600px; width:100%; max-height:80vh; overflow:auto;
                                                padding:28px 28px 24px; position:relative;">
                                        <button onclick="document.getElementById('<?php echo esc_attr( $pitch_modal_id ); ?>').style.display='none';"
                                                style="position:absolute; top:12px; right:12px; background:transparent;
                                                       border:none; color:#aaa; font-size:24px; cursor:pointer; line-height:1;
                                                       padding:6px 10px; border-radius:6px;"
                                                onmouseover="this.style.background='#333';this.style.color='#fff';"
                                                onmouseout="this.style.background='transparent';this.style.color='#aaa';">×</button>
                                        <div style="display:flex; align-items:center; gap:12px; margin-bottom:18px; padding-bottom:14px; border-bottom:1px solid #333;">
                                            <div style="font-size:36px;">💡</div>
                                            <div>
                                                <h3 style="color:#f0b90b; margin:0; font-size:18px; letter-spacing:0.3px;">Pitch da Produção</h3>
                                                <p style="color:#888; font-size:11px; margin:2px 0 0 0;">Visão da equipa 1MZ para o teu videoclipe</p>
                                            </div>
                                        </div>
                                        <div style="color:#e8e8e8; font-size:14px; line-height:1.7; white-space:pre-wrap; word-wrap:break-word;"><?php
                                            // [1.6.118.31] Não usar nl2br aqui — o `white-space: pre-wrap`
                                            // do CSS já respeita \n. Combinar os dois duplica espaçamento.
                                            echo esc_html( $production_pitch );
                                        ?></div>
                                        <?php if ( ! empty( $extra_proj['production_pitch_updated_at'] ) ): ?>
                                            <p style="color:#666; font-size:11px; margin-top:18px; padding-top:12px; border-top:1px solid #333; text-align:right;">
                                                Atualizado em <?php echo esc_html( date( 'd/m/Y H:i', strtotime( $extra_proj['production_pitch_updated_at'] ) ) ); ?>
                                            </p>
                                        <?php endif; ?>
                                    </div>
                                </div>
                            <?php endif; ?>

                            <?php if(!empty($project->script_content)): ?>
                                <h4 style="font-size:14px; color:#ccc;">Roteiro / Plano:</h4>
                                <div style="background:#111; padding:15px; border:1px solid #333; color:#ddd; font-family:monospace; font-size:13px; max-height:150px; overflow-y:auto; border-radius:4px; margin-bottom:15px;"><?php echo nl2br(esc_html($project->script_content ?? '')); ?></div>
                            <?php endif; ?>
                            
                            <?php if ($status_raw !== 'rejected'): ?>
                                <form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post">
                                    <input type="hidden" name="action" value="onemz_update_feedback">
                                    <?php wp_nonce_field('onemz_update_feedback_nonce'); ?>
                                    <input type="hidden" name="project_id" value="<?php echo $project->id; ?>">
                                    <label style="font-size:11px; font-weight:800; color:#b8b2cc; letter-spacing:.7px; text-transform:uppercase;">💬 Enviar mensagem para a equipa</label>
                                    <div style="display:flex; gap:10px; margin-top:8px;">
                                        <input type="text" name="artist_feedback" required placeholder="Escreve aqui…"
                                               style="background:rgba(255,255,255,.06); border:1.5px solid rgba(255,255,255,.14); color:#fff; padding:12px 18px; border-radius:99px; width:100%; font-size:13px; outline:none;"
                                               onfocus="this.style.borderColor='#f0b90b'; this.style.boxShadow='0 0 0 3px rgba(240,185,11,.18)';"
                                               onblur="this.style.borderColor='rgba(255,255,255,.14)'; this.style.boxShadow='none';">
                                        <button type="submit"
                                                style="background:#f0b90b; color:#3d2c00; border:0; border-radius:99px; padding:0 26px; font-size:13px; font-weight:900; cursor:pointer; white-space:nowrap;">➤ Enviar</button>
                                    </div>
                                </form>
                            <?php else: ?>
                                <p style="color:#e74c3c; font-size:12px; padding:10px; background:#222; border-radius:4px; text-align:center; border:1px solid rgba(231,76,60,0.3);">
                                    <em>O envio de mensagens está desativado porque este projeto foi bloqueado ou rejeitado de forma definitiva.</em>
                                </p>
                            <?php endif; ?>

                            <?php if(!empty($project->artist_feedback)): ?>
                                <div style="margin-top:15px;">
                                    <p style="font-size:11px; font-weight:800; color:#b8b2cc; letter-spacing:.7px; text-transform:uppercase; margin-bottom:10px;">🗂️ Histórico de mensagens</p>
                                    <div style="background:rgba(255,255,255,.035); border:1px solid rgba(255,255,255,.09); border-radius:20px; padding:20px; max-height:400px; overflow-y:auto; display:flex; flex-direction:column; gap:15px;">
                                        <?php
                                        // [1.6.118.29] Helper: detecta URLs no texto e separa em
                                        // partes para renderizar anexos como thumbnail/botão.
                                        // Retorna array com 'text' e 'attachments' (array de URLs).
                                        if ( ! function_exists( 'rmbz_chat_extract_attachments' ) ) {
                                            function rmbz_chat_extract_attachments( $text ) {
                                                $attachments = [];
                                                // Captura URLs http(s) — termina em espaço, fim de linha, ou tag HTML
                                                $clean_text = preg_replace_callback(
                                                    '#https?://[^\s<>"\']+#i',
                                                    function( $m ) use ( &$attachments ) {
                                                        $url = $m[0];
                                                        // Tira pontuação final (.,;) que possa ter ficado colada
                                                        $url = rtrim( $url, '.,;!?' );
                                                        $ext = strtolower( pathinfo( parse_url( $url, PHP_URL_PATH ), PATHINFO_EXTENSION ) );
                                                        $attachments[] = [
                                                            'url'  => $url,
                                                            'ext'  => $ext,
                                                            'name' => basename( parse_url( $url, PHP_URL_PATH ) ),
                                                            'is_image' => in_array( $ext, [ 'jpg', 'jpeg', 'png', 'gif', 'webp' ], true ),
                                                        ];
                                                        return ''; // remove URL do texto inline
                                                    },
                                                    $text
                                                );
                                                // Limpa eventuais traços/símbolos órfãos do prefixo "Pode ver 📎 X.jpg —"
                                                $clean_text = preg_replace( '/[—\-]\s*$/u', '', trim( $clean_text ) );
                                                // Se sobrou apenas texto vazio ou só "Pode ver" sem contexto, deixa vazio
                                                if ( preg_match( '/^(pode ver|veja|see|view)\s*[📎🔗]*\s*$/iu', trim( $clean_text ) ) ) {
                                                    $clean_text = '';
                                                }
                                                return [
                                                    'text'        => trim( $clean_text ),
                                                    'attachments' => $attachments,
                                                ];
                                            }
                                        }

                                        $lines = explode("\n\n", trim($project->artist_feedback));
                                        foreach ($lines as $line) {
                                            if (empty(trim($line))) continue;

                                            // Verifica de quem é a mensagem
                                            $is_admin = (strpos($line, 'Admin:') !== false || strpos($line, '1MZ:') !== false || strpos($line, 'Equipa:') !== false);

                                            // Extrai a data
                                            $date_str = '';
                                            if (preg_match('/^\[(.*?)\]/', $line, $matches)) {
                                                $date_str = $matches[1];
                                                $line = str_replace($matches[0], '', $line);
                                            }

                                            // Limpa as tags de nome e HTML para ficar só o texto limpo
                                            $line_clean = preg_replace('/<(strong|b)>.*?<\/(strong|b)>:?/', '', $line);
                                            $line_clean = preg_replace('/Artista:|Admin:|1MZ:|Equipa:/i', '', $line_clean);
                                            $line_clean = ltrim(trim($line_clean), ': ');

                                            // Verifica se a mensagem foi editada
                                            $is_edited = false;
                                            if (strpos($line_clean, '(Editado)') !== false) {
                                                $is_edited = true;
                                                $line_clean = str_replace('<em style="font-size:9px; color:#ccc;">(Editado)</em>', '', $line_clean);
                                                $line_clean = str_replace('(Editado)', '', $line_clean);
                                            }

                                            // [1.6.118.29] Extrai anexos (URLs) do corpo da mensagem
                                            $parsed = rmbz_chat_extract_attachments( $line_clean );
                                            $body_text   = $parsed['text'];
                                            $attachments = $parsed['attachments'];

                                            // Helper inline para renderizar attachments
                                            $render_attachments = function() use ( $attachments, $is_admin ) {
                                                if ( empty( $attachments ) ) return;
                                                echo '<div style="display:flex; flex-direction:column; gap:8px; margin-top:8px;">';
                                                foreach ( $attachments as $att ) {
                                                    $url  = esc_url( $att['url'] );
                                                    $name = esc_html( $att['name'] );
                                                    if ( $att['is_image'] ) {
                                                        // Thumbnail clicável (abre original em nova tab)
                                                        echo '<a href="' . $url . '" target="_blank" rel="noopener" style="display:block; border-radius:8px; overflow:hidden; max-width:240px; border:1px solid ' . ( $is_admin ? '#444' : 'rgba(0,0,0,0.15)' ) . ';">';
                                                        echo '<img src="' . $url . '" alt="' . $name . '" loading="lazy" style="display:block; width:100%; height:auto; max-height:200px; object-fit:cover; background:#0f0f0f;">';
                                                        echo '</a>';
                                                    } else {
                                                        // Botão estilizado "Abrir anexo"
                                                        $btn_bg   = $is_admin ? '#1a1a1a' : 'rgba(0,0,0,0.12)';
                                                        $btn_brd  = $is_admin ? '#444'    : 'rgba(0,0,0,0.2)';
                                                        $btn_col  = $is_admin ? '#f0b90b' : '#000';
                                                        echo '<a href="' . $url . '" target="_blank" rel="noopener" style="display:inline-flex; align-items:center; gap:8px; padding:8px 12px; background:' . $btn_bg . '; border:1px solid ' . $btn_brd . '; border-radius:8px; color:' . $btn_col . '; text-decoration:none; font-size:12px; font-weight:600; max-width:240px;">';
                                                        echo '<span>📎</span><span style="overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">' . $name . '</span>';
                                                        echo '</a>';
                                                    }
                                                }
                                                echo '</div>';
                                            };

                                            if ($is_admin) {
                                                // BOLHA DA EQUIPA 1MZ (Esquerda - Escura)
                                                echo '<div style="align-self: flex-start; background: #252525; border: 1px solid #444; padding: 12px 18px; border-radius: 0 15px 15px 15px; max-width: 85%;">';
                                                echo '<div style="font-size: 10px; color: #f0b90b; margin-bottom: 5px; font-weight: bold; text-transform: uppercase;">Equipa 1MZ <span style="color:#777; font-weight:normal; text-transform:none;">• ' . esc_html($date_str) . '</span></div>';
                                                if ( $body_text !== '' ) {
                                                    echo '<div style="color: #ddd; font-size: 13px; line-height: 1.5;">' . wp_kses_post(trim($body_text)) . '</div>';
                                                }
                                                $render_attachments();
                                                if ($is_edited) echo '<div style="font-size: 9px; color: #777; text-align: right; margin-top: 5px; font-style:italic;">Editado</div>';
                                                echo '</div>';
                                            } else {
                                                // BOLHA DO ARTISTA (Direita - Dourada)
                                                echo '<div style="align-self: flex-end; background: linear-gradient(135deg, #f0b90b, #d4a000); color: #000; padding: 12px 18px; border-radius: 15px 0 15px 15px; max-width: 85%; box-shadow: 0 4px 10px rgba(240, 185, 11, 0.2);">';
                                                echo '<div style="font-size: 10px; color: #000; opacity: 0.6; margin-bottom: 5px; font-weight: bold; text-transform: uppercase;">Você <span style="font-weight:normal; text-transform:none;">• ' . esc_html($date_str) . '</span></div>';
                                                if ( $body_text !== '' ) {
                                                    echo '<div style="font-size: 13px; line-height: 1.5; font-weight: 600;">' . wp_kses_post(trim($body_text)) . '</div>';
                                                }
                                                $render_attachments();
                                                echo '</div>';
                                            }
                                        }
                                        ?>
                                    </div>
                                </div>
                            <?php endif; ?>
                        </div>
                    </div>
                <?php endforeach; ?>
            <?php endif; ?>
        </div>

        <div id="tab-releases" class="account-tab-content">
            <?php 
            $lancamentos = array_filter($projects, function($p) { return $p->production_status === 'done'; });
            if ( empty($lancamentos) ) : ?>
                <div class="m3-card" style="text-align:center; padding:var(--rmbz-space-10) var(--rmbz-space-5); color:var(--rmbz-text-muted);">
                    <span style="font-size:30px;">🎬</span>
                    <p style="margin:var(--rmbz-space-2) 0 var(--rmbz-space-1);">Ainda não tem videoclipes finalizados.</p>
                    <small style="color:var(--rmbz-text-disabled);">Assim que a produção terminar, os links de download aparecerão aqui.</small>
                </div>
            <?php else : ?>
                <?php foreach ($lancamentos as $l) : 
                    $data_release = $l->release_date ? date('d/m/Y \à\s H:i', strtotime($l->release_date)) : 'Data a definir';
                ?>
                    <div class="m3-card" style="border:1px solid var(--rmbz-brand); border-radius:var(--rmbz-radius-lg); padding:var(--rmbz-space-5); margin-bottom:var(--rmbz-space-4);">
                        <h3 style="color:var(--rmbz-text-primary); margin-top:0; font-size:var(--rmbz-text-xl); font-family:var(--rmbz-font-display); font-weight:600;">🎵 <?php echo esc_html($l->project_title ?? ''); ?></h3>
                        <p style="color:var(--rmbz-text-muted); font-size:var(--rmbz-text-sm); margin-bottom:var(--rmbz-space-5);">Lançamento Oficial: <strong style="color:var(--rmbz-brand);"><?php echo $data_release; ?></strong></p>
                        <div style="display:flex; gap:var(--rmbz-space-3); flex-wrap:wrap;">
                            <?php if (!empty($l->final_video_url)): ?><a href="<?php echo esc_url($l->final_video_url); ?>" target="_blank" class="m3-btn" style="background:#2ecc71; color:#04250f; text-decoration:none;">📥 Baixar Arquivo HD</a><?php endif; ?>
                            <?php if (!empty($l->youtube_url)): ?><a href="<?php echo esc_url($l->youtube_url); ?>" target="_blank" class="m3-btn" style="background:#ff0000; color:#fff; text-decoration:none;">▶️ Ver no YouTube</a><?php endif; ?>
                        </div>
                        <?php if (empty($l->final_video_url) && empty($l->youtube_url)): ?><p style="color:#e74c3c; font-size:var(--rmbz-text-xs); margin-top:var(--rmbz-space-3);"><em>Aguardando links da administração...</em></p><?php endif; ?>
                    </div>
                <?php endforeach; ?>
            <?php endif; ?>
        </div>

        <div id="tab-history" class="account-tab-content">
            <h4 style="color:var(--rmbz-text-primary); margin-top:0; font-family:var(--rmbz-font-display); font-weight:600;">Pedidos de Depósito</h4>
            <?php if ( empty($deposit_requests) ) : ?><p style="color:var(--rmbz-text-muted); font-size:var(--rmbz-text-sm); margin-bottom:var(--rmbz-space-6);">Sem depósitos.</p><?php else: ?>
                <table class="history-table responsive-table" style="margin-bottom:var(--rmbz-space-6); width:100%; border-collapse:collapse; color:var(--rmbz-text-secondary); font-size:var(--rmbz-text-sm);">
                    <thead><tr style="border-bottom:1px solid rgba(255,255,255,0.1); text-align:left;"><th>Data</th><th>Valor</th><th>Método</th><th>Estado</th><th>Ações</th></tr></thead>
                    <tbody>
                        <?php foreach ($deposit_requests as $deposit) : 
                            $status_color = '#aaa';
                            $btn_detalhes = '-';
                            
                            if ($deposit->status === 'aprovado') {
                                $status_color = '#2ecc71';
                            } elseif ($deposit->status === 'rejeitado') {
                                $status_color = '#e74c3c';
                                $rejected_detail = wp_json_encode([
                                    'amount'          => number_format((float) $deposit->amount, 2, ',', '.'),
                                    'method'          => $deposit->payment_method ?: '—',
                                    'transaction_id'  => $deposit->transaction_id ?: 'Sem referência',
                                    'proof_image'     => ! empty($deposit->proof_image) ? esc_url($deposit->proof_image) : '',
                                    'sender_phone'    => $deposit->sender_phone ?: 'Não informado',
                                    'request_date'    => $deposit->request_date ? date('d/m/Y H:i', strtotime($deposit->request_date)) : '—',
                                    'processed_date'  => $deposit->processed_date ? date('d/m/Y H:i', strtotime($deposit->processed_date)) : '—',
                                    'reason'          => trim((string) $deposit->admin_notes) ?: 'Motivo não informado.',
                                    'source'          => ($deposit->source_platform ?? '') === 'app'
                                        ? 'App Android'
                                        : (($deposit->source_platform ?? '') === 'site' ? 'Site' : 'Não informada'),
                                    'type'            => ! empty($deposit->is_first_deposit) ? 'Abertura de conta' : 'Reforço de saldo',
                                ]);
                                $btn_detalhes = '<button type="button" class="onemz-btn btn-outline rmbz-view-rejected-deposit-btn m3-btn m3-btn--outlined" data-deposit="'.esc_attr($rejected_detail).'" style="font-size:var(--rmbz-text-2xs); min-height:34px; padding:0 14px; white-space:nowrap;">Mais Detalhes</button>';
                            } elseif ($deposit->status === 'pendente') {
                                $status_color = '#f0b90b';
                                $btn_detalhes = '<button type="button" class="onemz-btn btn-outline rmbz-view-deposit-btn m3-btn m3-btn--outlined" data-amount="'.esc_attr($deposit->amount).'" data-method="'.esc_attr($deposit->payment_method).'" data-trans="'.esc_attr($deposit->transaction_id).'" style="font-size:var(--rmbz-text-2xs); min-height:34px; padding:0 14px; white-space:nowrap;">Ver Detalhes</button>';
                            }
                        ?>
                        <tr style="border-bottom:1px solid rgba(255,255,255,0.06);">
                            <td data-label="Data" style="padding:var(--rmbz-space-3) 0;"><?php echo date('d/m/y H:i', strtotime($deposit->request_date)); ?></td>
                            <td data-label="Valor" style="color:var(--rmbz-text-primary); font-weight:600;"><?php echo number_format((float)$deposit->amount, 2, ',', '.'); ?> MT</td>
                            <td data-label="Método"><?php echo esc_html($deposit->payment_method ?? ''); ?></td>
                            <td data-label="Estado"><span style="color:<?php echo $status_color; ?>; font-weight:600; text-transform:uppercase; font-size:var(--rmbz-text-2xs);"><?php echo esc_html($deposit->status ?? ''); ?></span></td>
                            <td data-label="Ações"><?php echo $btn_detalhes; ?></td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            <?php endif; ?>

            <h4 style="color:var(--rmbz-text-primary); margin-top:var(--rmbz-space-6); font-family:var(--rmbz-font-display); font-weight:600;">Pedidos de Levantamento</h4>
            <?php if ( empty($withdrawal_requests) ) : ?>
                <p style="color:var(--rmbz-text-muted); font-size:var(--rmbz-text-sm); margin-bottom:var(--rmbz-space-6);">Sem levantamentos.</p>
            <?php else: ?>
                <table class="history-table responsive-table" style="margin-bottom:var(--rmbz-space-6); width:100%; border-collapse:collapse; color:var(--rmbz-text-secondary); font-size:var(--rmbz-text-sm);">
                    <thead><tr style="border-bottom:1px solid rgba(255,255,255,0.1); text-align:left;"><th>Data</th><th>Valor</th><th>Fonte</th><th>Método</th><th>Nº Destino</th><th>Estado</th></tr></thead>
                    <tbody>
                        <?php foreach ($withdrawal_requests as $with) : 
                            $status_color = '#aaa';
                            if ($with->status === 'aprovado') $status_color = '#2ecc71';
                            elseif ($with->status === 'rejeitado') $status_color = '#e74c3c';
                            elseif ($with->status === 'pendente') $status_color = '#f0b90b';

                            // [FEAT 1.5.15] Mostrar origem dos fundos
                            $with_source = isset($with->source) ? $with->source : 'wallet';
                            $source_lbl  = $with_source === 'royalties' ? '🎵 Royalties' : '💼 Carteira';
                        ?>
                        <tr style="border-bottom:1px solid rgba(255,255,255,0.06);">
                            <td data-label="Data" style="padding:var(--rmbz-space-3) 0;"><?php echo date('d/m/y H:i', strtotime($with->request_date)); ?></td>
                            <td data-label="Valor" style="color:var(--rmbz-text-primary); font-weight:600;"><?php echo number_format((float)$with->amount, 2, ',', '.'); ?> MT</td>
                            <td data-label="Fonte"><span style="font-size:var(--rmbz-text-xs); color:var(--rmbz-text-secondary);"><?php echo $source_lbl; ?></span></td>
                            <td data-label="Método"><?php echo esc_html($with->payment_method ?? ''); ?></td>
                            <td data-label="Nº Destino"><?php echo esc_html($with->payment_details ?? ''); ?></td>
                            <td data-label="Estado"><span style="color:<?php echo $status_color; ?>; font-weight:600; text-transform:uppercase; font-size:var(--rmbz-text-2xs);"><?php echo esc_html($with->status ?? ''); ?></span></td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            <?php endif; ?>
            <?php
                $settings = get_option('rmbz_payment_settings');
                $mpesa_number = isset($settings['rmbz_mpesa_number']) ? $settings['rmbz_mpesa_number'] : 'Sem número configurado';
                $emola_number = isset($settings['rmbz_emola_number']) ? $settings['rmbz_emola_number'] : 'Sem número configurado';

                // [DS 1.5.44] Modal "Concluir Depósito Pendente" refeito com
                // design system. Preserva IDs internos (p-dep-amount,
                // p-dep-method, p-dep-trans, p-dep-number) — o JS continua a
                // injectar valores neles ao clicar em .rmbz-view-deposit-btn.
                //
                // Trigger inalterado: botões .rmbz-view-deposit-btn com
                // data-amount, data-method, data-trans. O JS abaixo só foi
                // actualizado para usar window.rmbz.modal.open() em vez de
                // style.display='flex' (evita bug recorrente do × não fechar).

                $icon_hourglass = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="48" height="48">'
                                . '<path d="M6 2h12v4l-4 6 4 6v4H6v-4l4-6-4-6V2z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>'
                                . '<path d="M9 6h6M9 18h6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>'
                                . '</svg>';

                $pdep_body = '<div class="rmbz-stack-md">'
                           . '<div style="display:flex;justify-content:center;color:var(--rmbz-brand);">' . $icon_hourglass . '</div>'
                           . '<p style="margin:0;color:var(--rmbz-text-secondary);font-size:var(--rmbz-text-sm);line-height:var(--rmbz-leading-relaxed);text-align:center;">'
                           . esc_html__( 'O seu depósito está pendente. Se teve problema com a transferência, use os detalhes abaixo para reenviar e validar o pedido actual.', '1mz-for-artists' )
                           . '</p>'
                           // Detalhes do pedido — 3 metas (valor, método, ID)
                           . '<div style="background:var(--rmbz-bg-input);border:1px solid var(--rmbz-border-subtle);border-radius:var(--rmbz-radius-sm);padding:var(--rmbz-space-4);">'
                           . '<div style="display:flex;justify-content:space-between;align-items:baseline;padding:var(--rmbz-space-2) 0;border-bottom:1px dashed var(--rmbz-border-subtle);">'
                           . '<span style="color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);">' . esc_html__( 'Valor a transferir', '1mz-for-artists' ) . '</span>'
                           . '<strong style="color:var(--rmbz-text-primary);font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-base);font-variant-numeric:tabular-nums;">'
                           . '<span id="p-dep-amount"></span> MT'
                           . '</strong>'
                           . '</div>'
                           . '<div style="display:flex;justify-content:space-between;align-items:baseline;padding:var(--rmbz-space-2) 0;border-bottom:1px dashed var(--rmbz-border-subtle);">'
                           . '<span style="color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);">' . esc_html__( 'Método', '1mz-for-artists' ) . '</span>'
                           . '<strong style="color:var(--rmbz-text-primary);font-size:var(--rmbz-text-sm);" id="p-dep-method"></strong>'
                           . '</div>'
                           . '<div style="display:flex;justify-content:space-between;align-items:baseline;padding:var(--rmbz-space-2) 0;">'
                           . '<span style="color:var(--rmbz-text-muted);font-size:var(--rmbz-text-xs);">' . esc_html__( 'Referência', '1mz-for-artists' ) . '</span>'
                           . '<strong style="color:var(--rmbz-brand);font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-sm);" id="p-dep-trans"></strong>'
                           . '</div>'
                           . '</div>'
                           // Cartão destacado: número oficial da 1MZ
                           . '<div style="background:var(--rmbz-bg-elevated);border:1px solid var(--rmbz-success);border-radius:var(--rmbz-radius-sm);padding:var(--rmbz-space-4);text-align:center;">'
                           . '<span style="display:block;color:var(--rmbz-text-muted);font-size:var(--rmbz-text-2xs);font-weight:var(--rmbz-weight-semibold);text-transform:uppercase;letter-spacing:var(--rmbz-tracking-wider);margin-bottom:var(--rmbz-space-2);">'
                           . esc_html__( 'Número Oficial 1MZ', '1mz-for-artists' )
                           . '</span>'
                           . '<strong id="p-dep-number" style="display:block;font-family:var(--rmbz-font-mono);font-size:var(--rmbz-text-2xl);color:var(--rmbz-success);letter-spacing:0.05em;font-variant-numeric:tabular-nums;"></strong>'
                           . '</div>'
                           . '<p style="margin:0;font-size:var(--rmbz-text-2xs);color:var(--rmbz-text-muted);text-align:center;">'
                           . '⚠️ ' . wp_kses_post( __( 'Este pedido será <strong>cancelado e apagado automaticamente após 24 horas</strong> se o valor não der entrada.', '1mz-for-artists' ) )
                           . '</p>'
                           . '</div>';

                $pdep_footer = rmbz_btn([
                    'label'   => __( 'Fechar e tentar mais tarde', '1mz-for-artists' ),
                    'variant' => 'ghost',
                    'full'    => true,
                    'attrs'   => [ 'data-rmbz-action' => 'close' ],
                ]);

                echo rmbz_modal([
                    'id'     => 'pending-deposit-modal',
                    'title'  => __( '⏳ Concluir Depósito', '1mz-for-artists' ),
                    'body'   => $pdep_body,
                    'footer' => $pdep_footer,
                ]);

                $rejected_body = '<div class="rmbz-stack-md">'
                               . '<div style="background:rgba(231,76,60,.12);border:1px solid rgba(231,76,60,.45);border-radius:var(--rmbz-radius-sm);padding:var(--rmbz-space-4);">'
                               . '<span style="display:block;color:#e74c3c;font-size:var(--rmbz-text-xs);font-weight:700;margin-bottom:var(--rmbz-space-2);">'
                               . esc_html__( 'Motivo da rejeição', '1mz-for-artists' )
                               . '</span><p id="r-dep-reason" style="margin:0;color:var(--rmbz-text-primary);font-size:var(--rmbz-text-sm);line-height:1.6;"></p></div>'
                               . '<div style="background:var(--rmbz-bg-input);border:1px solid var(--rmbz-border-subtle);border-radius:var(--rmbz-radius-sm);padding:var(--rmbz-space-4);">'
                               . '<div class="rmbz-rejected-dep-grid" style="display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--rmbz-space-4);">'
                               . '<div><small>Valor</small><strong id="r-dep-amount"></strong></div>'
                               . '<div><small>Método</small><strong id="r-dep-method"></strong></div>'
                               . '<div><small>Referência</small><strong id="r-dep-trans"></strong></div>'
                               . '<div><small>Número do pagador</small><strong id="r-dep-sender"></strong></div>'
                               . '<div><small>Pedido em</small><strong id="r-dep-requested"></strong></div>'
                               . '<div><small>Processado em</small><strong id="r-dep-processed"></strong></div>'
                               . '<div><small>Origem</small><strong id="r-dep-source"></strong></div>'
                               . '<div><small>Tipo</small><strong id="r-dep-type"></strong></div>'
                               . '</div></div>'
                               . '<a id="r-dep-proof" href="#" target="_blank" rel="noopener" class="m3-btn m3-btn--outlined" style="display:none;text-decoration:none;text-align:center;">Ver comprovativo enviado</a>'
                               . '</div>'
                               . '<style>.rmbz-rejected-dep-grid small{display:block;color:var(--rmbz-text-muted);font-size:var(--rmbz-text-2xs);margin-bottom:4px}.rmbz-rejected-dep-grid strong{display:block;color:var(--rmbz-text-primary);font-size:var(--rmbz-text-sm);word-break:break-word}@media(max-width:560px){.rmbz-rejected-dep-grid{grid-template-columns:1fr!important}}</style>';

                echo rmbz_modal([
                    'id'     => 'rejected-deposit-modal',
                    'title'  => __( 'Detalhes do depósito rejeitado', '1mz-for-artists' ),
                    'body'   => $rejected_body,
                    'footer' => rmbz_btn([
                        'label' => __( 'Fechar', '1mz-for-artists' ),
                        'variant' => 'ghost',
                        'full' => true,
                        'attrs' => [ 'data-rmbz-action' => 'close' ],
                    ]),
                ]);
            ?>

            <script>
            document.addEventListener('DOMContentLoaded', function() {
                const depBtns = document.querySelectorAll('.rmbz-view-deposit-btn');
                const rejectedDepBtns = document.querySelectorAll('.rmbz-view-rejected-deposit-btn');

                if (depBtns.length === 0 && rejectedDepBtns.length === 0) return;

                const mpesaNum = "<?php echo esc_js($mpesa_number); ?>";
                const emolaNum = "<?php echo esc_js($emola_number); ?>";

                depBtns.forEach(btn => {
                    btn.addEventListener('click', (e) => {
                        e.preventDefault();

                        // Injectar valores no markup do modal
                        const elAmount = document.getElementById('p-dep-amount');
                        const elMethod = document.getElementById('p-dep-method');
                        const elTrans  = document.getElementById('p-dep-trans');
                        const elNumber = document.getElementById('p-dep-number');

                        if (elAmount) elAmount.innerText = btn.getAttribute('data-amount') || '—';

                        const method = btn.getAttribute('data-method') || '';
                        if (elMethod) elMethod.innerText = method;
                        if (elTrans)  elTrans.innerText  = btn.getAttribute('data-trans') || 'S/ Referência';

                        if (elNumber) {
                            if (method === 'M-Pesa')      elNumber.innerText = mpesaNum;
                            else if (method === 'E-Mola') elNumber.innerText = emolaNum;
                            else                          elNumber.innerText = 'N/A';
                        }

                        // [DS 1.5.44] Abrir via API do design system — evita
                        // o bug recorrente do × não fechar quando outro JS
                        // grava style.display inline.
                        if (window.rmbz && window.rmbz.modal && typeof window.rmbz.modal.open === 'function') {
                            window.rmbz.modal.open('pending-deposit-modal');
                        } else {
                            // Fallback se o DS não carregou
                            const modal = document.getElementById('pending-deposit-modal');
                            if (modal) modal.style.display = 'flex';
                        }
                    });
                });

                rejectedDepBtns.forEach(btn => {
                    btn.addEventListener('click', (e) => {
                        e.preventDefault();
                        let data = {};
                        try {
                            data = JSON.parse(btn.getAttribute('data-deposit') || '{}');
                        } catch (error) {
                            data = {};
                        }

                        const setText = (id, value) => {
                            const element = document.getElementById(id);
                            if (element) element.innerText = value || '—';
                        };
                        setText('r-dep-reason', data.reason || 'Motivo não informado.');
                        setText('r-dep-amount', (data.amount || '—') + ' MT');
                        setText('r-dep-method', data.method);
                        setText('r-dep-trans', data.transaction_id);
                        setText('r-dep-sender', data.sender_phone);
                        setText('r-dep-requested', data.request_date);
                        setText('r-dep-processed', data.processed_date);
                        setText('r-dep-source', data.source);
                        setText('r-dep-type', data.type);

                        const proof = document.getElementById('r-dep-proof');
                        if (proof) {
                            if (data.proof_image) {
                                proof.href = data.proof_image;
                                proof.style.display = 'block';
                            } else {
                                proof.removeAttribute('href');
                                proof.style.display = 'none';
                            }
                        }

                        if (window.rmbz && window.rmbz.modal && typeof window.rmbz.modal.open === 'function') {
                            window.rmbz.modal.open('rejected-deposit-modal');
                        } else {
                            const modal = document.getElementById('rejected-deposit-modal');
                            if (modal) modal.style.display = 'flex';
                        }
                    });
                });
            });
            </script>
            
            <h4 id="extrato" style="color:#fff; margin-top:20px; scroll-margin-top:80px;">Extrato da Carteira</h4>
            <?php if ( empty($transactions) ) : echo '<p style="color:#aaa; font-size:13px;">Sem transações.</p>'; else: ?>
                <div id="rmbz-extrato-wrapper" style="position:relative;">
                    <table id="rmbz-extrato-table" class="history-table responsive-table" style="width:100%; border-collapse:collapse; color:#ddd; font-size:13px;">
                        <thead><tr style="border-bottom:1px solid #444; text-align:left;"><th>Data</th><th>Movimento</th><th>Valor</th></tr></thead>
                        <tbody id="rmbz-extrato-tbody">
                            <?php foreach ($transactions as $transaction) : ?>
                                <tr style="border-bottom:1px solid #333;"><td data-label="Data" style="padding:10px 0;"><?php echo date('d/m/y', strtotime($transaction->transaction_date)); ?></td><td data-label="Movimento" style="font-size:12px;"><?php echo esc_html($transaction->details ?? ''); ?></td><td data-label="Valor" style="color:<?php echo ($transaction->amount >= 0) ? '#2ecc71' : '#e74c3c'; ?>; font-weight:bold;"><?php echo number_format((float)$transaction->amount, 2, ',', '.'); ?> MT</td></tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                    <?php /* [1.5.139] Paginação. [1.5.140] Refactor para usar
                        renderer partilhado + ajax. Os mesmos botões funcionam
                        como links normais (fallback se JS off) E como triggers
                        AJAX (interceptados via .rmbz-ext-page-btn). */ ?>
                    <?php if ( $total_ext_pages > 1 ): ?>
                        <?php
                        $first_idx = $ext_offset + 1;
                        $last_idx  = min( $ext_offset + count($transactions), $total_transactions );
                        $counter_text = sprintf(
                            esc_html__( 'A mostrar %1$d–%2$d de %3$d transações', '1mz-for-artists' ),
                            (int) $first_idx, (int) $last_idx, (int) $total_transactions
                        );
                        ?>
                        <div id="rmbz-extrato-paginator" style="margin-top:18px;display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between;align-items:center;border-top:1px solid #333;padding-top:14px;">
                            <span id="rmbz-extrato-counter" style="color:#aaa;font-size:12px;"><?php echo $counter_text; ?></span>
                            <div id="rmbz-extrato-pagination" style="display:flex;flex-wrap:wrap;gap:4px;align-items:center;">
                                <?php
                                if ( function_exists('rmbz_extrato_render_pagination_html') ) {
                                    echo rmbz_extrato_render_pagination_html( $ext_paged, $total_ext_pages );
                                }
                                ?>
                            </div>
                        </div>

                        <?php /* [1.5.140] Overlay de loading sobre a tabela durante AJAX */ ?>
                        <div id="rmbz-extrato-loading" style="display:none;position:absolute;inset:0;background:rgba(0,0,0,0.55);align-items:center;justify-content:center;z-index:5;border-radius:6px;">
                            <span style="color:#f0b90b;font-size:13px;font-weight:600;">⏳ A carregar...</span>
                        </div>
                    <?php endif; ?>
                </div>

                <?php /* [1.5.140] AJAX interceptor — substitui o reload pela
                    troca incremental do tbody + paginação + counter.
                    Sem `&&` em JS para sobreviver ao escape WP (1.5.119/126).
                    Fallback: se JS falhar, os links continuam normais com
                    ?ext_page=N. */ ?>
                <?php if ( $total_ext_pages > 1 ): ?>
                <script>
                (function(){
                    var wrap = document.getElementById('rmbz-extrato-wrapper');
                    if (!wrap) return;
                    var tbody = document.getElementById('rmbz-extrato-tbody');
                    var pagDiv = document.getElementById('rmbz-extrato-pagination');
                    var counter = document.getElementById('rmbz-extrato-counter');
                    var loading = document.getElementById('rmbz-extrato-loading');
                    if (!tbody) return;
                    if (!pagDiv) return;
                    if (!counter) return;

                    var ajaxUrl = '<?php echo esc_url_raw( admin_url('admin-ajax.php') ); ?>';
                    var nonce   = '<?php echo esc_js( wp_create_nonce('rmbz_extrato_paginate_nonce') ); ?>';
                    var inFlight = false;

                    function showLoading() {
                        if (loading) { loading.style.display = 'flex'; }
                    }
                    function hideLoading() {
                        if (loading) { loading.style.display = 'none'; }
                    }

                    function loadPage(page) {
                        if (inFlight) return;
                        inFlight = true;
                        showLoading();

                        var fd = new FormData();
                        fd.append('action', 'rmbz_extrato_paginate');
                        fd.append('nonce', nonce);
                        fd.append('page', page);

                        fetch(ajaxUrl, { method: 'POST', body: fd, credentials: 'same-origin' })
                            .then(function(r){ return r.json(); })
                            .then(function(resp){
                                inFlight = false;
                                hideLoading();
                                var ok = false;
                                if (resp) { if (resp.success) { ok = true; } }
                                if (!ok) {
                                    // Fallback gracioso: recarrega via URL
                                    window.location.href = '?ext_page=' + page + '#extrato';
                                    return;
                                }
                                var data = resp.data || {};
                                tbody.innerHTML = data.rows_html || '';
                                pagDiv.innerHTML = data.pagination_html || '';
                                counter.innerHTML = data.counter_html || '';

                                // Atualizar URL sem fazer reload
                                if (window.history) {
                                    if (window.history.pushState) {
                                        var url = new URL(window.location.href);
                                        url.searchParams.set('ext_page', data.page || page);
                                        url.hash = 'extrato';
                                        window.history.pushState({}, '', url.toString());
                                    }
                                }
                            })
                            .catch(function(){
                                inFlight = false;
                                hideLoading();
                                // Fallback: recarrega normalmente
                                window.location.href = '?ext_page=' + page + '#extrato';
                            });
                    }

                    // Delegação: qualquer clique em .rmbz-ext-page-btn dentro
                    // do paginator é interceptado. Funciona mesmo depois do
                    // pagDiv.innerHTML ser substituído.
                    wrap.addEventListener('click', function(ev){
                        var t = ev.target;
                        if (!t) return;
                        var btn = t.closest ? t.closest('.rmbz-ext-page-btn') : null;
                        if (!btn) return;
                        var p = btn.getAttribute('data-ext-page');
                        if (!p) return;
                        ev.preventDefault();
                        loadPage(parseInt(p, 10));
                    });
                })();
                </script>
                <?php endif; ?>
            <?php endif; ?>
        </div>
        
        <?php
        // [DS 1.5.44] Modal "Motivo da Rejeição" refeito com design system.
        // Preserva ID #rejection-reason-text — o JS continua a injectar o
        // texto via .innerText ao clicar em .rmbz-view-reason-btn (data-reason).
        $reject_body = '<div class="rmbz-stack-md">'
                     . '<div style="display:flex;justify-content:center;color:var(--rmbz-danger);">'
                     . '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="48" height="48">'
                     . '<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.8"/>'
                     . '<path d="M12 7v6M12 16v.01" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>'
                     . '</svg>'
                     . '</div>'
                     . '<p id="rejection-reason-text" style="margin:0;color:var(--rmbz-text-secondary);font-size:var(--rmbz-text-sm);line-height:var(--rmbz-leading-relaxed);background:var(--rmbz-bg-input);padding:var(--rmbz-space-4);border-radius:var(--rmbz-radius-sm);border:1px solid var(--rmbz-border-subtle);min-height:60px;"></p>'
                     . '</div>';

        $reject_footer = rmbz_btn([
            'label'   => __( 'Fechar', '1mz-for-artists' ),
            'variant' => 'ghost',
            'full'    => true,
            'attrs'   => [ 'data-rmbz-action' => 'close' ],
        ]);

        echo rmbz_modal([
            'id'     => 'rejection-modal',
            'title'  => __( 'Motivo da Rejeição', '1mz-for-artists' ),
            'body'   => $reject_body,
            'footer' => $reject_footer,
        ]);
        ?>

        <?php 
        $has_pending_withdrawal = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}rmbz_withdrawal_requests WHERE user_telemovel = %s AND status = 'pendente'", $user_telemovel));
        // [FEAT 1.5.15+1.5.20] Modal de levantamento mostra selecção de fonte
        // (Carteira MT vs Royalties USD), e agora também sugere contactos
        // guardados anteriormente (extra_data → saved_payouts).
        rmbz_render_modals(
            $has_pending_deposit,
            $has_pending_withdrawal,
            (float) $withdrawable_balance,
            (float) $distro_balance_usd,
            (float) $exchange_rate,
            $user_telemovel
        ); 
        ?>
        
        <?php 
        $sub_table = $wpdb->prefix . 'rmbz_subscriptions';
        
        $sub_valida = $wpdb->get_var($wpdb->prepare(
            "SELECT id FROM {$sub_table} WHERE user_telemovel = %s AND status = 'active' AND end_date > %s",
            $user_telemovel, current_time('mysql')
        ));
        $is_vip_agora = $sub_valida ? true : false;

        if (function_exists('rmbz_render_profile_modal') && $user) { rmbz_render_profile_modal($user, $is_vip_agora); }
        if (function_exists('rmbz_render_welcome_onboarding')) { rmbz_render_welcome_onboarding($user_telemovel, $is_vip_agora); }
        ?>
    </div>
    
    <script>
    document.addEventListener('DOMContentLoaded', function() {
        const reasonBtns = document.querySelectorAll('.rmbz-view-reason-btn');
        const reasonText = document.getElementById('rejection-reason-text');

        if (reasonBtns.length > 0 && reasonText) {
            reasonBtns.forEach(btn => {
                btn.addEventListener('click', (e) => {
                    e.preventDefault();
                    reasonText.innerText = btn.getAttribute('data-reason') || 'Sem motivo especificado.';

                    // [DS 1.5.44] Abrir via API do design system
                    if (window.rmbz && window.rmbz.modal && typeof window.rmbz.modal.open === 'function') {
                        window.rmbz.modal.open('rejection-modal');
                    } else {
                        const modal = document.getElementById('rejection-modal');
                        if (modal) modal.style.display = 'flex';
                    }
                });
            });
        }
        
        const copyBtn = document.getElementById('copy-referral-code-btn');
        if (copyBtn) {
            copyBtn.addEventListener('click', () => {
                const input = document.getElementById('referral-code-input');
                input.select();
                document.execCommand('copy');
                // [DS 1.5.39] rmbz_btn() emite estrutura
                // <button>[icon][<span>Label</span>]</button> — alteramos
                // apenas o <span> para preservar o ícone.
                const labelSpan = copyBtn.querySelector('span:not(.rmbz-btn__icon)');
                if (labelSpan) {
                    const original = labelSpan.textContent;
                    labelSpan.textContent = 'Copiado!';
                    setTimeout(() => labelSpan.textContent = original, 2000);
                } else {
                    // Fallback para markup antigo (sem rmbz_btn)
                    copyBtn.innerText = 'Copiado!';
                    setTimeout(() => copyBtn.innerText = 'Copiar', 2000);
                }
            });
        }
        
        // [DS 1.5.41] Tab switching atualizado para sincronizar aria-selected
        // (acessibilidade) e suportar navegação por teclado (setas ←/→).
        const tabs = document.querySelectorAll('.tab-link');
        const contents = document.querySelectorAll('.account-tab-content');

        function activateTab(tab) {
            tabs.forEach(t => {
                t.classList.remove('active');
                t.setAttribute('aria-selected', 'false');
            });
            contents.forEach(c => {
                c.classList.remove('active');
                c.style.display = 'none';
            });

            tab.classList.add('active');
            tab.setAttribute('aria-selected', 'true');

            const target = document.getElementById(tab.getAttribute('data-tab'));
            if (target) {
                target.style.display = 'block';
                setTimeout(() => target.classList.add('active'), 10);
            }
        }

        tabs.forEach((tab, idx) => {
            tab.addEventListener('click', (e) => {
                e.preventDefault();
                activateTab(tab);
            });

            // Navegação por teclado: ← → para mover entre tabs
            tab.addEventListener('keydown', (e) => {
                let nextIdx = -1;
                if (e.key === 'ArrowRight') nextIdx = (idx + 1) % tabs.length;
                else if (e.key === 'ArrowLeft') nextIdx = (idx - 1 + tabs.length) % tabs.length;
                else if (e.key === 'Home') nextIdx = 0;
                else if (e.key === 'End') nextIdx = tabs.length - 1;

                if (nextIdx !== -1) {
                    e.preventDefault();
                    tabs[nextIdx].focus();
                    activateTab(tabs[nextIdx]);
                }
            });
        });
        
        // [DS 1.5.36] Modal de depósito agora usa API do design system —
        // mesmo padrão do levantamento, evita o bug de style.display='flex'
        // a sujar o inline e impedir o close.
        const btnDep = document.getElementById('rmbz-show-deposit-btn');
        if (btnDep) {
            btnDep.addEventListener('click', (e) => {
                e.preventDefault();
                if (window.rmbz && window.rmbz.modal && typeof window.rmbz.modal.open === 'function') {
                    window.rmbz.modal.open('deposit-modal');
                } else {
                    console.warn('[1MZ] Design system não carregado — modal de depósito indisponível.');
                    alert('Erro: scripts não carregaram. Recarregue a página (Ctrl+Shift+R).');
                }
            });
        }
        
        // [DS 1.5.32+1.5.33] Modal de levantamento usa o design system.
        // O fallback antigo (style.display='flex') era o que sujava o
        // inline style e impedia o close de funcionar — eliminado.
        // Se o DS não estiver disponível, mostramos um aviso em vez de
        // abrir um modal que depois não fecha.
        const btnWith = document.getElementById('rmbz-show-withdrawal-btn');
        if (btnWith) {
            btnWith.addEventListener('click', (e) => {
                e.preventDefault();
                if (window.rmbz && window.rmbz.modal && typeof window.rmbz.modal.open === 'function') {
                    window.rmbz.modal.open('withdrawal-modal');
                } else {
                    console.warn('[1MZ] Design system não carregado — modal de levantamento indisponível.');
                    alert('Erro: scripts não carregaram. Recarregue a página (Ctrl+Shift+R).');
                }
            });
        }
    });
    </script>
    
    <script>
    // SISTEMA ANTI-OFFLINE (Envia sinal a cada 3 minutos)
    function sendHeartbeat() {
        let fd = new FormData();
        fd.append('action', 'rmbz_artist_heartbeat');
        // [SEC-MA*] nonce obrigatório.
        fd.append('nonce', '<?php echo esc_js( wp_create_nonce("rmbz_notif_nonce") ); ?>');
        fetch('<?php echo esc_url( admin_url("admin-ajax.php") ); ?>', { method: 'POST', body: fd, credentials: 'same-origin' });
    }
    // Envia um sinal ao carregar a página
    sendHeartbeat();
    // E continua a enviar a cada 3 minutos (180000 ms) enquanto a aba estiver aberta
    setInterval(sendHeartbeat, 180000);
    </script>
    <?php
}

/**
 * ==========================================================================
 * 4. VIEW: MODAIS (Depósito e Levantamento)
 * ==========================================================================
 */
function rmbz_render_modals($has_pending_deposit = false, $has_pending_withdrawal = false, $withdrawable_balance_mt = 0, $distro_balance_usd = 0, $exchange_rate = 63.50, $user_telemovel = '') {
    // ========================================================================
    // [DS 1.5.36] MODAL DE DEPÓSITO — REFEITO COM DESIGN SYSTEM
    //
    // Estrutura paralela ao modal de levantamento (1.5.32-35):
    //   • rmbz_modal() + rmbz_alert() + rmbz_field() + rmbz_btn()
    //   • Operadora via radio-pills nativos (.rmbz-radio-pill) — submetidos
    //     com o form, sem dependência JS frágil
    //   • Tipo de comprovativo (ID vs Screenshot) via radio-pills com
    //     show/hide de painéis controlado por CSS (:has)
    //   • Número da empresa para destinatário aparece imediatamente ao
    //     escolher operadora — também via :has(), zero JS
    //   • Botão de submit com loading state automático
    //   • Limite max corrigido: 50000 MT (era 25000 no UI mas 50000 no servidor)
    //
    // CONTRATO DO SERVIDOR — IDÊNTICO À VERSÃO ANTERIOR (não tocar):
    //   action               = rmbz_processar_deposito
    //   _rmbz_deposit_nonce  = nonce de rmbz_deposit_nonce
    //   deposit_amount       = float MT (max 50000)
    //   payment_method       = M-Pesa | E-Mola
    //   sender_phone         = telefone do utilizador
    //   proof_type           = id | image
    //   transaction_id       = (se proof_type=id) string SMS
    //   proof_image          = (se proof_type=image) FILE upload
    // ========================================================================
    $settings     = get_option('rmbz_payment_settings');
    $mpesa_number = isset($settings['rmbz_mpesa_number']) ? $settings['rmbz_mpesa_number'] : '';
    $emola_number = isset($settings['rmbz_emola_number']) ? $settings['rmbz_emola_number'] : '';

    // ── Caso 1: tem depósito pendente ────────────────────────────────────
    if ( $has_pending_deposit ) {
        $dep_body = function_exists( 'rmbz_alert' )
            ? rmbz_alert( [
                'variant' => 'warning',
                'icon'    => '⏳',
                'title'   => __( 'Depósito Pendente', '1mz-for-artists' ),
                'body'    => '<p style="margin:0;color:var(--rmbz-text-secondary,#c4c4cc);font-size:14px;">'
                           . esc_html__( 'Já existe um pedido de depósito em análise. Aguarde a aprovação do administrador antes de fazer outro.', '1mz-for-artists' )
                           . '</p>',
            ] )
            : '<p>Já existe um depósito pendente.</p>';

        $dep_footer = function_exists( 'rmbz_btn' )
            ? rmbz_btn( [
                'label'   => __( 'Fechar', '1mz-for-artists' ),
                'variant' => 'ghost',
                'attrs'   => [ 'data-rmbz-action' => 'close' ],
            ] )
            : '<button type="button" data-rmbz-action="close">Fechar</button>';

        if ( function_exists( 'rmbz_modal' ) ) {
            echo rmbz_modal( [
                'id'     => 'deposit-modal',
                'title'  => __( 'Depositar Saldo', '1mz-for-artists' ),
                'body'   => $dep_body,
                'footer' => $dep_footer,
            ] );
        }
    } else {
        // ── Caso 2: caminho normal ──────────────────────────────────────
        if ( ! function_exists( 'rmbz_modal' ) || ! function_exists( 'rmbz_btn' ) ) {
            echo '<div id="deposit-modal" style="display:none;"><p>Design system não carregado. Recarregue a página.</p></div>';
        } else {
            ob_start();
            ?>

            <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" enctype="multipart/form-data" class="rmbz-stack-lg" data-rmbz-form="deposit">
                <input type="hidden" name="action" value="rmbz_processar_deposito">
                <?php wp_nonce_field( 'rmbz_deposit_nonce', '_rmbz_deposit_nonce' ); ?>

                <?php
                echo rmbz_field( [
                    'name'        => 'deposit_amount',
                    'label'       => __( 'Quanto pretende depositar?', '1mz-for-artists' ),
                    'type'        => 'number',
                    'placeholder' => '0,00',
                    'variant'     => 'money',
                    'prefix'      => 'MT',
                    'required'    => true,
                    'hint'        => __( 'Valor máximo por depósito: 50 000 MT.', '1mz-for-artists' ),
                    'attrs'       => [
                        'min'       => '1',
                        'max'       => '50000',
                        'step'      => '0.01',
                        'inputmode' => 'decimal',
                    ],
                ] );
                ?>

                <h6 class="rmbz-form-section-title"><?php esc_html_e( 'Para qual operadora vai transferir?', '1mz-for-artists' ); ?></h6>

                <div class="rmbz-radio-group rmbz-radio-group--full" role="radiogroup" aria-label="<?php esc_attr_e( 'Operadora', '1mz-for-artists' ); ?>" data-deposit-method-picker>
                    <label class="rmbz-radio-pill">
                        <input type="radio" name="payment_method" value="M-Pesa" required data-rmbz-target="dep-method-mpesa">
                        <span class="rmbz-radio-pill__label"><span class="rmbz-op-dot rmbz-op-dot--mpesa" aria-hidden="true"></span>M-Pesa</span>
                    </label>
                    <label class="rmbz-radio-pill">
                        <input type="radio" name="payment_method" value="E-Mola" required data-rmbz-target="dep-method-emola">
                        <span class="rmbz-radio-pill__label"><span class="rmbz-op-dot rmbz-op-dot--emola" aria-hidden="true"></span>E-Mola</span>
                    </label>
                </div>

                <?php
                // Caixas com o número da empresa para cada operadora.
                // Visibilidade controlada por CSS (:has) baseada no radio
                // checked do picker acima — zero JS necessário.
                ?>
                <div id="dep-method-mpesa" class="rmbz-deposit-target rmbz-alert rmbz-alert--info" style="display:none;">
                    <span class="rmbz-alert__icon" aria-hidden="true">📱</span>
                    <div class="rmbz-alert__body">
                        <div class="rmbz-alert__title"><?php esc_html_e( 'Transfira por M-Pesa para:', '1mz-for-artists' ); ?></div>
                        <strong style="font-family:var(--rmbz-font-mono);font-variant-numeric:tabular-nums;color:var(--rmbz-brand);font-size:var(--rmbz-text-xl);letter-spacing:0.05em;">
                            <?php echo esc_html( $mpesa_number ?: '— não configurado —' ); ?>
                        </strong>
                        <?php
                        // [1.6.118.5] Mostrar nome titular M-Pesa (config nas settings)
                        $mpesa_name_disp = isset($settings['rmbz_mpesa_name']) && trim((string) $settings['rmbz_mpesa_name']) !== ''
                            ? (string) $settings['rmbz_mpesa_name']
                            : (string) get_option('rmbz_payment_beneficiary', '');
                        if ( $mpesa_name_disp !== '' ):
                        ?>
                            <div style="margin-top:6px;font-size:13px;color:var(--rmbz-text-muted, #666);">
                                <?php esc_html_e( 'Titular:', '1mz-for-artists' ); ?>
                                <strong style="color:var(--rmbz-text, #111);"><?php echo esc_html( $mpesa_name_disp ); ?></strong>
                            </div>
                        <?php endif; ?>
                    </div>
                </div>

                <div id="dep-method-emola" class="rmbz-deposit-target rmbz-alert rmbz-alert--info" style="display:none;">
                    <span class="rmbz-alert__icon" aria-hidden="true">📱</span>
                    <div class="rmbz-alert__body">
                        <div class="rmbz-alert__title"><?php esc_html_e( 'Transfira por E-Mola para:', '1mz-for-artists' ); ?></div>
                        <strong style="font-family:var(--rmbz-font-mono);font-variant-numeric:tabular-nums;color:var(--rmbz-brand);font-size:var(--rmbz-text-xl);letter-spacing:0.05em;">
                            <?php echo esc_html( $emola_number ?: '— não configurado —' ); ?>
                        </strong>
                        <?php
                        // [1.6.118.5] Mostrar nome titular E-Mola
                        $emola_name_disp = isset($settings['rmbz_emola_name']) && trim((string) $settings['rmbz_emola_name']) !== ''
                            ? (string) $settings['rmbz_emola_name']
                            : (string) get_option('rmbz_payment_beneficiary', '');
                        if ( $emola_name_disp !== '' ):
                        ?>
                            <div style="margin-top:6px;font-size:13px;color:var(--rmbz-text-muted, #666);">
                                <?php esc_html_e( 'Titular:', '1mz-for-artists' ); ?>
                                <strong style="color:var(--rmbz-text, #111);"><?php echo esc_html( $emola_name_disp ); ?></strong>
                            </div>
                        <?php endif; ?>
                    </div>
                </div>

                <?php
                echo rmbz_field( [
                    'name'        => 'sender_phone',
                    'label'       => __( 'O seu número (de onde transferiu)', '1mz-for-artists' ),
                    'type'        => 'tel',
                    'placeholder' => '841234567',
                    'required'    => true,
                    'hint'        => __( 'Indique o número que usou para fazer a transferência.', '1mz-for-artists' ),
                    'attrs'       => [
                        'pattern'   => '8[4-7][0-9]{7}',
                        'inputmode' => 'numeric',
                        'minlength' => '9',
                        'maxlength' => '15',
                    ],
                ] );
                ?>

                <h6 class="rmbz-form-section-title"><?php esc_html_e( 'Comprovativo da transferência', '1mz-for-artists' ); ?></h6>

                <div class="rmbz-radio-group rmbz-radio-group--full" role="radiogroup" aria-label="<?php esc_attr_e( 'Tipo de comprovativo', '1mz-for-artists' ); ?>" data-deposit-proof-picker>
                    <label class="rmbz-radio-pill">
                        <input type="radio" name="proof_type" value="id" required checked>
                        <span class="rmbz-radio-pill__label">📝 ID da Transação</span>
                    </label>
                    <label class="rmbz-radio-pill">
                        <input type="radio" name="proof_type" value="image" required>
                        <span class="rmbz-radio-pill__label">📸 Screenshot</span>
                    </label>
                </div>

                <?php
                // ID da Transação — visível por defeito (proof_type=id)
                ?>
                <div id="dep-proof-id-box" class="rmbz-deposit-proof rmbz-deposit-proof--id">
                    <?php
                    echo rmbz_field( [
                        'name'        => 'transaction_id',
                        'label'       => __( 'Código da SMS (ID da transação)', '1mz-for-artists' ),
                        'type'        => 'text',
                        'placeholder' => 'Ex: CHJ1A23B4C',
                        'hint'        => __( 'Código que recebeu na SMS de confirmação da transferência.', '1mz-for-artists' ),
                        'attrs'       => [
                            'style'           => 'text-transform:uppercase;font-family:var(--rmbz-font-mono);font-weight:600;color:var(--rmbz-brand);letter-spacing:0.08em;',
                            'autocapitalize'  => 'characters',
                            'autocomplete'    => 'off',
                        ],
                    ] );
                    ?>
                </div>

                <?php
                // Screenshot upload — escondido por defeito
                ?>
                <div id="dep-proof-image-box" class="rmbz-deposit-proof rmbz-deposit-proof--image" style="display:none;">
                    <div class="rmbz-field">
                        <label class="rmbz-field__label" for="dep-proof-file">
                            <?php esc_html_e( 'Anexar imagem do comprovativo', '1mz-for-artists' ); ?>
                        </label>
                        <input type="file"
                               id="dep-proof-file"
                               name="proof_image"
                               accept="image/jpeg,image/png,image/webp"
                               class="rmbz-input rmbz-input--file"
                               style="padding:var(--rmbz-space-3);cursor:pointer;">
                        <span class="rmbz-field__hint">
                            <?php esc_html_e( 'Aceita JPG, PNG ou WebP. Tire screenshot da SMS ou da app.', '1mz-for-artists' ); ?>
                        </span>
                    </div>
                </div>

                <?php
                // [DS 1.5.86] Wrapper com margin-top extra antes do CTA final.
                // Cria respiração visual entre o helper text "Código que recebeu
                // na SMS de confirmação" e o botão de submeter, melhorando a
                // hierarquia visual do final do formulário.
                //
                // [1.5.86 update] Aumentado para space-6 (24px) por feedback
                // do utilizador — a distância anterior (12px) ainda fazia o
                // hint colar-se visualmente ao botão amarelo grande abaixo.
                // Total = stack-lg gap (28px) + margin (24px) = 52px de respiro.
                ?>
                <div style="margin-top: var(--rmbz-space-6); padding-top: var(--rmbz-space-2); border-top: 1px solid var(--rmbz-border-subtle);">
                <?php
                echo rmbz_btn( [
                    'label'   => __( 'Confirmar Depósito', '1mz-for-artists' ),
                    'variant' => 'primary',
                    'type'    => 'submit',
                    'icon'    => '→',
                    'full'    => true,
                    'attrs'   => [
                        'data-rmbz-loading-on-submit' => '1',
                    ],
                ] );
                ?>
                </div>
            </form>

            <?php
            $dep_body = ob_get_clean();
            echo rmbz_modal( [
                'id'    => 'deposit-modal',
                'title' => __( 'Depositar Saldo', '1mz-for-artists' ),
                'body'  => $dep_body,
            ] );
            ?>

            <?php // ============================================================
                  // [DS 1.5.36] CSS específico do modal de depósito
                  //
                  // Mostra/esconde os painéis "número da empresa" e "tipo de
                  // comprovativo" baseado no radio checked do picker pai —
                  // tudo em CSS via :has(), zero JS.
                  //
                  // Fallback gracioso para browsers sem :has(): os painéis
                  // ficam todos visíveis (display: block via CSS antigo). Não
                  // é bonito mas funciona.
                  // ============================================================ ?>
            <style>
            /* Painéis do número da empresa (M-Pesa/E-Mola) */
            #deposit-modal:has([data-deposit-method-picker] input[value="M-Pesa"]:checked) #dep-method-mpesa,
            #deposit-modal:has([data-deposit-method-picker] input[value="E-Mola"]:checked) #dep-method-emola {
                display: flex !important;
            }

            /* Painéis do tipo de comprovativo */
            #deposit-modal:has([data-deposit-proof-picker] input[value="id"]:checked) #dep-proof-id-box {
                display: block !important;
            }
            #deposit-modal:has([data-deposit-proof-picker] input[value="id"]:checked) #dep-proof-image-box {
                display: none !important;
            }
            #deposit-modal:has([data-deposit-proof-picker] input[value="image"]:checked) #dep-proof-id-box {
                display: none !important;
            }
            #deposit-modal:has([data-deposit-proof-picker] input[value="image"]:checked) #dep-proof-image-box {
                display: block !important;
            }

            /* Input de file mais elegante */
            #dep-proof-file {
                background: var(--rmbz-bg-input) !important;
                border: 1px dashed var(--rmbz-border-strong) !important;
                color: var(--rmbz-text-secondary) !important;
                width: 100% !important;
                box-sizing: border-box;
            }
            #dep-proof-file::-webkit-file-upload-button,
            #dep-proof-file::file-selector-button {
                background: var(--rmbz-brand);
                color: var(--rmbz-text-on-brand);
                border: none;
                padding: var(--rmbz-space-2) var(--rmbz-space-4);
                border-radius: var(--rmbz-radius-sm);
                font-family: var(--rmbz-font-body);
                font-weight: var(--rmbz-weight-semibold);
                font-size: var(--rmbz-text-sm);
                cursor: pointer;
                margin-right: var(--rmbz-space-3);
                transition: background var(--rmbz-duration-fast) var(--rmbz-ease-out);
            }
            #dep-proof-file::-webkit-file-upload-button:hover,
            #dep-proof-file::file-selector-button:hover {
                background: var(--rmbz-brand-strong);
            }
            </style>

            <?php // ============================================================
                  // [DS 1.5.36] JS mínimo do depósito
                  //
                  // Faz APENAS uma coisa: validar prefixo de telefone do
                  // sender vs operadora antes do submit (ex: M-Pesa só aceita
                  // 84/85, E-Mola só 86/87). Toda a UI dinâmica é CSS puro.
                  // ============================================================ ?>
            <script>
            (function(){
                if (window.__rmbzDepModalInit) return;
                window.__rmbzDepModalInit = true;

                document.addEventListener('submit', function(e){
                    var form = e.target;
                    if (!form.matches('[data-rmbz-form="deposit"]')) return;

                    // Operadora seleccionada
                    var methodRadio = form.querySelector('input[name="payment_method"]:checked');
                    if (!methodRadio) {
                        // Browser nativo já valida 'required', mas defesa extra
                        return;
                    }

                    // Validar prefixo telefone vs operadora
                    var phoneInput = form.querySelector('input[name="sender_phone"]');
                    if (phoneInput) {
                        var phone = String(phoneInput.value).replace(/\D/g, '');
                        if (phone.length === 12 && phone.startsWith('258')) phone = phone.substring(3);

                        var prefix = phone.substring(0, 2);
                        var validMpesa = ['84', '85'];
                        var validEmola = ['86', '87'];
                        var op = methodRadio.value;

                        if (op === 'M-Pesa' && validMpesa.indexOf(prefix) === -1) {
                            e.preventDefault();
                            if (window.rmbz && window.rmbz.toast) {
                                window.rmbz.toast.danger('Número M-Pesa deve começar por 84 ou 85.');
                            } else {
                                alert('Número M-Pesa deve começar por 84 ou 85.');
                            }
                            return;
                        }
                        if (op === 'E-Mola' && validEmola.indexOf(prefix) === -1) {
                            e.preventDefault();
                            if (window.rmbz && window.rmbz.toast) {
                                window.rmbz.toast.danger('Número E-Mola deve começar por 86 ou 87.');
                            } else {
                                alert('Número E-Mola deve começar por 86 ou 87.');
                            }
                            return;
                        }
                    }

                    // Validar que tem comprovativo conforme proof_type
                    var proofType = form.querySelector('input[name="proof_type"]:checked');
                    if (proofType && proofType.value === 'id') {
                        var txInput = form.querySelector('input[name="transaction_id"]');
                        if (!txInput || !txInput.value.trim()) {
                            e.preventDefault();
                            if (window.rmbz && window.rmbz.toast) {
                                window.rmbz.toast.danger('Insira o ID da transação (código da SMS).');
                            } else {
                                alert('Insira o ID da transação (código da SMS).');
                            }
                            return;
                        }
                    } else if (proofType && proofType.value === 'image') {
                        var fileInput = form.querySelector('input[name="proof_image"]');
                        if (!fileInput || !fileInput.files || !fileInput.files[0]) {
                            e.preventDefault();
                            if (window.rmbz && window.rmbz.toast) {
                                window.rmbz.toast.danger('Anexe uma imagem do comprovativo.');
                            } else {
                                alert('Anexe uma imagem do comprovativo.');
                            }
                            return;
                        }
                    }
                });
            })();
            </script>
            <?php
        }
    }
    ?>

    <?php
    // ========================================================================
    // [DS 1.5.32] MODAL DE LEVANTAMENTO — REFEITO COM DESIGN SYSTEM
    //
    // Esta versão substitui as 9 reescritas anteriores (1.5.21 → 1.5.30) por
    // uma única estrutura baseada no design system. Características:
    //
    //   • Markup completo via .rmbz-modal (gerido por design-system.js)
    //   • Fechar: botão ×, click no overlay, Escape — ZERO scripts inline
    //   • Toggle Carteira ↔ Royalties via .rmbz-pill-group (data-target)
    //   • Inputs monetários com .rmbz-input--money (mono + tabular-nums)
    //   • Validação prefixo M-Pesa (84/85) / E-Mola (86/87) via UI hint
    //   • Botão de submit com loading automático (data-rmbz-loading-on-submit)
    //   • Preview de conversão USD→MT (único <script> mínimo, isolado)
    //
    // CONTRATO DO SERVIDOR — IDÊNTICO À VERSÃO ANTERIOR (não tocar):
    //   action               = rmbz_request_withdrawal
    //   _wpnonce             = nonce de rmbz_withdrawal_nonce
    //   rmbz_withdrawal_source         = wallet | royalties
    //   rmbz_payment_method            = M-Pesa | E-Mola
    //   rmbz_payment_details           = telefone (9 dígitos)
    //   rmbz_withdrawal_amount         = float MT (se source=wallet)
    //   rmbz_withdrawal_amount_usd     = float USD (se source=royalties)
    // ========================================================================

    // Saldos validados
    $withdrawable_balance_mt = (float) $withdrawable_balance_mt;
    $distro_balance_usd      = (float) $distro_balance_usd;
    $exchange_rate           = (float) $exchange_rate;
    if ( $exchange_rate <= 0 ) $exchange_rate = 63.50;
    $distro_balance_mt_preview = $distro_balance_usd * $exchange_rate;
    $min_usd_for_withdrawal    = max( 0.01, round( RMBZ_MIN_WITHDRAWAL / $exchange_rate, 2 ) );
    $wallet_eligible           = $withdrawable_balance_mt >= RMBZ_MIN_WITHDRAWAL;
    $royalties_eligible        = $distro_balance_usd >= $min_usd_for_withdrawal;

    // ── Caso 1: tem pedido pendente ────────────────────────────────────────
    if ( $has_pending_withdrawal ) {
        $body = function_exists( 'rmbz_alert' )
            ? rmbz_alert( [
                'variant' => 'warning',
                'icon'    => '⏳',
                'title'   => __( 'Levantamento Pendente', '1mz-for-artists' ),
                'body'    => '<p style="margin:0;color:var(--rmbz-text-secondary,#c4c4cc);font-size:14px;">'
                           . esc_html__( 'Já possui um pedido em processamento. Aguarde a conclusão antes de pedir outro.', '1mz-for-artists' )
                           . '</p>',
            ] )
            : '<div style="text-align:center;padding:20px;"><div style="font-size:40px;margin-bottom:10px;">⏳</div><strong style="color:#f0b90b;">Levantamento Pendente</strong><p>Já possui um pedido em processamento.</p></div>';

        $footer = function_exists( 'rmbz_btn' )
            ? rmbz_btn( [
                'label'   => __( 'Fechar', '1mz-for-artists' ),
                'variant' => 'ghost',
                'attrs'   => [ 'data-rmbz-action' => 'close' ],
            ] )
            : '<button type="button" data-rmbz-action="close">Fechar</button>';

        if ( function_exists( 'rmbz_modal' ) ) {
            echo rmbz_modal( [
                'id'     => 'withdrawal-modal',
                'title'  => __( 'Levantar Fundos', '1mz-for-artists' ),
                'body'   => $body,
                'footer' => $footer,
            ] );
            return;
        }
    }

    // ── Caso 2: caminho normal ─────────────────────────────────────────────
    // Se o design system não está disponível por algum motivo, fallback para
    // versão simples (não devia acontecer, mas defensivo).
    if ( ! function_exists( 'rmbz_modal' ) || ! function_exists( 'rmbz_btn' ) ) {
        echo '<div id="withdrawal-modal" style="display:none;"><p>Design system não carregado. Recarregue a página.</p></div>';
        return;
    }

    // ─── Construir o body do modal ────────────────────────────────────────
    ob_start();
    ?>

    <?php if ( ! $wallet_eligible && ! $royalties_eligible ): ?>

        <?php
        echo rmbz_alert( [
            'variant' => 'warning',
            'title'   => __( 'Saldo insuficiente', '1mz-for-artists' ),
            'body'    => sprintf(
                /* translators: %s = montante mínimo formatado em MT */
                '<p style="margin:0;font-size:14px;">' . esc_html__( 'Não tem saldo suficiente em nenhuma fonte. Mínimo: %s MT (ou equivalente em USD).', '1mz-for-artists' ) . '</p>',
                '<strong>' . esc_html( number_format( RMBZ_MIN_WITHDRAWAL, 2, ',', '.' ) ) . '</strong>'
            ),
        ] );
        ?>

    <?php else: ?>

        <div class="rmbz-stack-lg">

            <?php
            // === Toggle de fonte (só aparece se ambas estiverem disponíveis) ===
            if ( $wallet_eligible && $royalties_eligible ) {
                echo '<div class="rmbz-stack">';
                echo '<h6 class="rmbz-form-section-title">' . esc_html__( 'De onde quer levantar?', '1mz-for-artists' ) . '</h6>';
                echo rmbz_pill_group( [
                    'name' => __( 'Fonte dos fundos', '1mz-for-artists' ),
                    'full' => true,
                    'options' => [
                        [
                            'value'  => 'wallet',
                            'label'  => __( 'Carteira (MT)', '1mz-for-artists' ),
                            'icon'   => '💼',
                            'target' => 'wd-panel-wallet',
                            'active' => true,
                        ],
                        [
                            'value'  => 'royalties',
                            'label'  => __( 'Royalties (USD)', '1mz-for-artists' ),
                            'icon'   => '🎵',
                            'target' => 'wd-panel-royalties',
                        ],
                    ],
                ] );
                echo '</div>';
            }
            ?>

            <?php // === PAINEL CARTEIRA (MT) === ?>
            <div id="wd-panel-wallet" class="rmbz-stack-lg" <?php echo ( $wallet_eligible ) ? '' : 'hidden'; ?>>

                <?php if ( $wallet_eligible ): ?>
                    <?php
                    echo rmbz_stat( [
                        'label'   => __( 'Saldo disponível na carteira', '1mz-for-artists' ),
                        'amount'  => number_format( $withdrawable_balance_mt, 2, ',', '.' ),
                        'unit'    => 'MT',
                        'variant' => 'brand',
                    ] );
                    ?>

                    <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" class="rmbz-stack" data-rmbz-form="wd-wallet">
                        <input type="hidden" name="action" value="rmbz_request_withdrawal">
                        <input type="hidden" name="rmbz_withdrawal_source" value="wallet">
                        <?php wp_nonce_field( 'rmbz_withdrawal_nonce' ); ?>

                        <?php
                        echo rmbz_field( [
                            'name'        => 'rmbz_withdrawal_amount',
                            'label'       => __( 'Quanto pretende levantar?', '1mz-for-artists' ),
                            'type'        => 'number',
                            'placeholder' => '0,00',
                            'variant'     => 'money',
                            'prefix'      => 'MT',
                            'required'    => true,
                            'hint'        => sprintf(
                                /* translators: %s = montante mínimo */
                                __( 'Mínimo: %s MT.', '1mz-for-artists' ),
                                number_format( RMBZ_MIN_WITHDRAWAL, 2, ',', '.' )
                            ),
                            'attrs'       => [
                                'min'       => (string) RMBZ_MIN_WITHDRAWAL,
                                'max'       => (string) $withdrawable_balance_mt,
                                'step'      => '0.01',
                                'inputmode' => 'decimal',
                            ],
                        ] );
                        ?>

                        <h6 class="rmbz-form-section-title"><?php esc_html_e( 'Para onde enviar?', '1mz-for-artists' ); ?></h6>

                        <?php
                        // [DS 1.5.34] Picker de operadora com radios nativos.
                        // Substituiu o picker JS-dependente que falhava silenciosamente
                        // (input hidden ficava vazio mesmo após click). Radios nativos
                        // são à prova de bugs: o browser garante que o submit envia o
                        // value do radio seleccionado, sem qualquer JS necessário.
                        ?>
                        <div class="rmbz-radio-group rmbz-radio-group--full" role="radiogroup" aria-label="<?php esc_attr_e( 'Operadora', '1mz-for-artists' ); ?>">
                            <label class="rmbz-radio-pill">
                                <input type="radio" name="rmbz_payment_method" value="M-Pesa" required>
                                <span class="rmbz-radio-pill__label"><span class="rmbz-op-dot rmbz-op-dot--mpesa" aria-hidden="true"></span>M-Pesa</span>
                            </label>
                            <label class="rmbz-radio-pill">
                                <input type="radio" name="rmbz_payment_method" value="E-Mola" required>
                                <span class="rmbz-radio-pill__label"><span class="rmbz-op-dot rmbz-op-dot--emola" aria-hidden="true"></span>E-Mola</span>
                            </label>
                        </div>

                        <?php
                        echo rmbz_field( [
                            'name'        => 'rmbz_payment_details',
                            'label'       => __( 'Número de telefone', '1mz-for-artists' ),
                            'type'        => 'tel',
                            'placeholder' => '841234567',
                            'required'    => true,
                            'hint'        => __( 'M-Pesa: 84 ou 85 (Vodacom). E-Mola: 86 ou 87 (Movitel).', '1mz-for-artists' ),
                            'attrs'       => [
                                'pattern'   => '8[4-7][0-9]{7}',
                                'inputmode' => 'numeric',
                                'minlength' => '9',
                                'maxlength' => '15',
                            ],
                        ] );
                        ?>

                        <?php
                        echo rmbz_btn( [
                            'label'   => __( 'Solicitar Levantamento', '1mz-for-artists' ),
                            'variant' => 'primary',
                            'type'    => 'submit',
                            'icon'    => '→',
                            'full'    => true,
                            'attrs'   => [
                                'data-rmbz-loading-on-submit' => '1',
                            ],
                        ] );
                        ?>
                    </form>

                <?php else: ?>
                    <?php
                    echo rmbz_alert( [
                        'variant' => 'info',
                        'body'    => sprintf(
                            /* translators: 1 = saldo actual, 2 = mínimo */
                            '<p style="margin:0;font-size:14px;">' . esc_html__( 'O seu saldo na carteira (%1$s MT) está abaixo do mínimo (%2$s MT).', '1mz-for-artists' ) . '</p>',
                            number_format( $withdrawable_balance_mt, 2, ',', '.' ),
                            number_format( RMBZ_MIN_WITHDRAWAL, 2, ',', '.' )
                        ),
                    ] );
                    ?>
                <?php endif; ?>
            </div>

            <?php // === PAINEL ROYALTIES (USD) === ?>
            <div id="wd-panel-royalties" class="rmbz-stack-lg" <?php echo ( $wallet_eligible || ! $royalties_eligible ) ? 'hidden' : ''; ?>>

                <?php if ( $royalties_eligible ): ?>
                    <?php
                    echo rmbz_stat( [
                        'label'           => __( 'Saldo de royalties (streaming)', '1mz-for-artists' ),
                        'amount'          => number_format( $distro_balance_usd, 2, '.', ',' ),
                        'unit'            => 'USD',
                        'trend'           => sprintf(
                            /* translators: %s = montante em MT */
                            __( '≈ %s MT ao câmbio actual (1 USD = %s MT)', '1mz-for-artists' ),
                            number_format( $distro_balance_mt_preview, 2, ',', '.' ),
                            number_format( $exchange_rate, 2, ',', '.' )
                        ),
                        'trend_direction' => 'flat',
                        'variant'         => 'brand',
                    ] );
                    ?>

                    <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" class="rmbz-stack" data-rmbz-form="wd-royalties">
                        <input type="hidden" name="action" value="rmbz_request_withdrawal">
                        <input type="hidden" name="rmbz_withdrawal_source" value="royalties">
                        <?php wp_nonce_field( 'rmbz_withdrawal_nonce' ); ?>

                        <?php
                        echo rmbz_field( [
                            'name'        => 'rmbz_withdrawal_amount_usd',
                            'label'       => __( 'Quanto pretende levantar?', '1mz-for-artists' ),
                            'type'        => 'number',
                            'placeholder' => '0.00',
                            'variant'     => 'money',
                            'prefix'      => 'USD',
                            'required'    => true,
                            'hint'        => sprintf(
                                /* translators: %s = montante mínimo USD */
                                __( 'Mínimo: %s USD. Convertido para MT no momento do envio.', '1mz-for-artists' ),
                                number_format( $min_usd_for_withdrawal, 2 )
                            ),
                            'attrs'       => [
                                'id'        => 'wd-usd-amount',
                                'min'       => (string) $min_usd_for_withdrawal,
                                'max'       => (string) $distro_balance_usd,
                                'step'      => '0.01',
                                'inputmode' => 'decimal',
                            ],
                        ] );
                        ?>

                        <div id="wd-conversion-preview" class="rmbz-alert rmbz-alert--info" hidden>
                            <span class="rmbz-alert__icon" aria-hidden="true">≈</span>
                            <div class="rmbz-alert__body">
                                <?php esc_html_e( 'Vai receber aproximadamente', '1mz-for-artists' ); ?>
                                <strong id="wd-mt-preview" style="font-family:var(--rmbz-font-mono);font-variant-numeric:tabular-nums;color:var(--rmbz-brand);">0,00 MT</strong>
                            </div>
                        </div>

                        <h6 class="rmbz-form-section-title"><?php esc_html_e( 'Para onde enviar?', '1mz-for-artists' ); ?></h6>

                        <div class="rmbz-radio-group rmbz-radio-group--full" role="radiogroup" aria-label="<?php esc_attr_e( 'Operadora', '1mz-for-artists' ); ?>">
                            <label class="rmbz-radio-pill">
                                <input type="radio" name="rmbz_payment_method" value="M-Pesa" required>
                                <span class="rmbz-radio-pill__label"><span class="rmbz-op-dot rmbz-op-dot--mpesa" aria-hidden="true"></span>M-Pesa</span>
                            </label>
                            <label class="rmbz-radio-pill">
                                <input type="radio" name="rmbz_payment_method" value="E-Mola" required>
                                <span class="rmbz-radio-pill__label"><span class="rmbz-op-dot rmbz-op-dot--emola" aria-hidden="true"></span>E-Mola</span>
                            </label>
                        </div>

                        <?php
                        echo rmbz_field( [
                            'name'        => 'rmbz_payment_details',
                            'label'       => __( 'Número de telefone', '1mz-for-artists' ),
                            'type'        => 'tel',
                            'placeholder' => '841234567',
                            'required'    => true,
                            'hint'        => __( 'M-Pesa: 84 ou 85. E-Mola: 86 ou 87.', '1mz-for-artists' ),
                            'attrs'       => [
                                'pattern'   => '8[4-7][0-9]{7}',
                                'inputmode' => 'numeric',
                                'minlength' => '9',
                                'maxlength' => '15',
                            ],
                        ] );
                        ?>

                        <?php
                        echo rmbz_btn( [
                            'label'   => __( 'Solicitar Levantamento', '1mz-for-artists' ),
                            'variant' => 'primary',
                            'type'    => 'submit',
                            'icon'    => '→',
                            'full'    => true,
                            'attrs'   => [
                                'data-rmbz-loading-on-submit' => '1',
                            ],
                        ] );
                        ?>
                    </form>
                <?php endif; ?>
            </div>

        </div>

    <?php endif; ?>

    <?php
    $modal_body = ob_get_clean();

    echo rmbz_modal( [
        'id'    => 'withdrawal-modal',
        'title' => __( 'Levantar Fundos', '1mz-for-artists' ),
        'body'  => $modal_body,
    ] );
    ?>

    <?php // ============================================================
          // [DS 1.5.32] JS isolado do modal de levantamento
          //
          // Este é o ÚNICO bloco <script> do modal. Faz três coisas:
          //   1. Sincroniza pills de operadora com o input hidden do form
          //   2. Calcula preview USD → MT em tempo real
          //   3. Garante que o input hidden de operadora tem valor antes do submit
          //
          // Tudo o resto (fechar modal, abrir, focus trap, loading do botão)
          // vem do design-system.js já carregado.
          // ============================================================ ?>
    <script>
    (function(){
        if (window.__rmbzWdModalInit) return;
        window.__rmbzWdModalInit = true;

        var EXCHANGE_RATE = <?php echo wp_json_encode( $exchange_rate ); ?>;

        // [DS 1.5.34] Picker de operadora foi simplificado para radios
        // nativos — não precisa mais de handler JS. O browser garante o
        // value no submit. Resta apenas:
        //   1. Conversão USD → MT em tempo real (preview)
        //   2. Validação prefixo M-Pesa (84/85) / E-Mola (86/87)

        // 1) Conversão USD → MT em tempo real
        var usdInput = document.getElementById('wd-usd-amount');
        var preview  = document.getElementById('wd-conversion-preview');
        var mtOut    = document.getElementById('wd-mt-preview');
        if (usdInput && preview && mtOut) {
            usdInput.addEventListener('input', function(){
                var v = parseFloat(String(this.value).replace(',', '.'));
                if (isNaN(v) || v <= 0) {
                    preview.setAttribute('hidden', '');
                    return;
                }
                var mt = v * EXCHANGE_RATE;
                mtOut.textContent = mt.toLocaleString('pt-PT', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' MT';
                preview.removeAttribute('hidden');
            });
        }

        // 2) Validação client-side antes do submit
        document.addEventListener('submit', function(e){
            var form = e.target;
            if (!form.matches('[data-rmbz-form="wd-wallet"], [data-rmbz-form="wd-royalties"]')) return;

            // Operadora seleccionada (radio checked)
            var checkedRadio = form.querySelector('input[name="rmbz_payment_method"]:checked');
            if (!checkedRadio) {
                e.preventDefault();
                if (window.rmbz && window.rmbz.toast) {
                    window.rmbz.toast.danger('Escolha uma operadora (M-Pesa ou E-Mola).');
                } else {
                    alert('Escolha uma operadora (M-Pesa ou E-Mola).');
                }
                return;
            }

            // Validação prefixo telefone vs operadora
            var phoneInput = form.querySelector('input[name="rmbz_payment_details"]');
            if (phoneInput) {
                var phone = String(phoneInput.value).replace(/\D/g, '');
                if (phone.length === 12 && phone.startsWith('258')) phone = phone.substring(3);

                var prefix = phone.substring(0, 2);
                var validMpesa = ['84', '85'];
                var validEmola = ['86', '87'];
                var op = checkedRadio.value;

                if (op === 'M-Pesa' && validMpesa.indexOf(prefix) === -1) {
                    e.preventDefault();
                    if (window.rmbz && window.rmbz.toast) {
                        window.rmbz.toast.danger('Número M-Pesa deve começar por 84 ou 85.');
                    } else {
                        alert('Número M-Pesa deve começar por 84 ou 85.');
                    }
                    return;
                }
                if (op === 'E-Mola' && validEmola.indexOf(prefix) === -1) {
                    e.preventDefault();
                    if (window.rmbz && window.rmbz.toast) {
                        window.rmbz.toast.danger('Número E-Mola deve começar por 86 ou 87.');
                    } else {
                        alert('Número E-Mola deve começar por 86 ou 87.');
                    }
                    return;
                }
            }
        });
    })();
    </script>
    <?php
}
