<?php
// includes/distribution/distribution-main.php

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

/**
 * ==========================================================================
 * CARREGAR SUB-MÓDULOS (Dependências)
 * ==========================================================================
 */
require_once 'distribution-list-view.php';   
require_once 'distribution-single-view.php'; 
require_once 'distribution-wizard.php';      
require_once 'distribution-analytics.php';   
require_once 'distribution-financial.php';   

/**
 * Carrega os Assets (CSS/JS) exclusivos da Distribuição
 */
function rmbz_enqueue_distro_assets() {
    wp_enqueue_style( 'rmbz-distro-css', RMBZ_PLUGIN_URL . 'assets/css/distribution.css', [], '1.2.0' );
    // Fullbleed utility — aplica largura inteira do viewport a páginas que
    // usem .rmbz-fullbleed na div raíz. Carregado DEPOIS do principal para
    // ter prioridade nas regras de width/margin/transform.
    wp_enqueue_style( 'rmbz-distro-fullbleed', RMBZ_PLUGIN_URL . 'assets/css/distribution-fullbleed.css', ['rmbz-distro-css'], '1.0.6' );
    wp_enqueue_script( 'rmbz-distro-js', RMBZ_PLUGIN_URL . 'assets/js/distribution.js', ['jquery'], '1.2.0', true );
    
    wp_localize_script( 'rmbz-distro-js', 'rmbz_distro_vars', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('rmbz_distro_nonce')
    ]);
}

/**
 * Renderiza a Tela de Bloqueio (Paywall)
 */
/**
 * Renderiza a Tela de Bloqueio (Paywall)
 *
 * [1.5.114] Reescrita para usar o sistema de Pacotes VIP em vez do legacy
 * `rmbz_sub_price`. Lê `get_option('rmbz_vip_packages', [])`, filtra apenas
 * os pacotes com permissão `distribute=true` (afinal este paywall é da
 * distribuição digital), escolhe o MAIS BARATO, e usa a action correcta
 * `rmbz_buy_vip_package` (nonce `rmbz_buy_package_nonce`, campo `package_id`).
 *
 * Se não existir NENHUM pacote com `distribute=true`, mostra bloqueio total
 * com mensagem clara — sem botão de compra (evita botão que falharia no
 * handler porque requer um package_id válido).
 *
 * Design: glassmorphism premium escuro, com theme overrides localizados
 * ao container `.distro-paywall-container` para neutralizar regras do tema
 * Foxiz (sublinhado em <a>, cores forçadas, etc).
 */
function rmbz_render_distribution_paywall( $telemovel ) {
    // [1.5.114] Procurar o pacote MAIS BARATO com permissão de distribuição.
    $pacotes_raw = get_option('rmbz_vip_packages', []);
    $pacotes_distro = [];
    if ( is_array($pacotes_raw) ) {
        foreach ( $pacotes_raw as $p ) {
            if ( ! is_array($p) ) continue;
            $perms = isset($p['perms']) && is_array($p['perms']) ? $p['perms'] : [];
            if ( ! empty($perms['distribute']) && isset($p['preco']) && is_numeric($p['preco']) ) {
                $pacotes_distro[] = $p;
            }
        }
    }

    // Ordenar por preço crescente e pegar o primeiro (mais barato).
    usort( $pacotes_distro, function($a, $b) {
        return ((float) $a['preco']) <=> ((float) $b['preco']);
    });
    $pacote = ! empty($pacotes_distro) ? $pacotes_distro[0] : null;

    // Saldo do artista — defensivo contra null/false/string.
    $saldo_raw = function_exists('rmbz_get_wallet_balance_by_phone') ? rmbz_get_wallet_balance_by_phone($telemovel) : 0;
    $saldo     = is_numeric($saldo_raw) ? (float) $saldo_raw : 0.0;

    // Barra global de notificações (mantida do design anterior).
    if ( function_exists('rmbz_notif_render_global_bar') ) {
        rmbz_notif_render_global_bar( $telemovel );
    }
    ?>
    <div class="distro-paywall-container distro-paywall-v2">
        <div class="paywall-content paywall-content-v2">

            <span class="pw-v2-vip-badge">
                <span class="pw-v2-vip-dot"></span>
                <?php esc_html_e( 'Plano VIP', '1mz-for-artists' ); ?>
            </span>

            <div class="pw-v2-icon-wrap">
                <svg class="pw-v2-icon" width="32" height="32" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
                    <circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="1.5"/>
                    <path d="M3 12h18M12 3a14 14 0 010 18M12 3a14 14 0 000 18" stroke="currentColor" stroke-width="1.5"/>
                </svg>
            </div>

            <h1 class="pw-v2-title"><?php esc_html_e( 'Distribuição Ilimitada', '1mz-for-artists' ); ?></h1>
            <p class="pw-v2-subtitle">
                <?php esc_html_e( 'Coloque a sua música no Spotify, Apple Music, TikTok e mais de 150 lojas.', '1mz-for-artists' ); ?>
            </p>

            <ul class="pw-v2-features">
                <li class="pw-v2-feature">
                    <span class="pw-v2-check" aria-hidden="true">
                        <svg width="12" height="12" viewBox="0 0 16 16" fill="none"><path d="M3 8.5l3.5 3.5L13 5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
                    </span>
                    <span class="pw-v2-feature-text">
                        <span class="pw-v2-feature-title"><?php esc_html_e( 'Uploads Ilimitados', '1mz-for-artists' ); ?></span>
                        <span class="pw-v2-feature-desc"><?php esc_html_e( 'Lance quantos singles e álbuns quiser.', '1mz-for-artists' ); ?></span>
                    </span>
                </li>
                <li class="pw-v2-feature">
                    <span class="pw-v2-check" aria-hidden="true">
                        <svg width="12" height="12" viewBox="0 0 16 16" fill="none"><path d="M3 8.5l3.5 3.5L13 5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
                    </span>
                    <span class="pw-v2-feature-text">
                        <span class="pw-v2-feature-title"><?php esc_html_e( '100% dos Royalties', '1mz-for-artists' ); ?></span>
                        <span class="pw-v2-feature-desc"><?php esc_html_e( 'Fique com todo o dinheiro que a sua música gerar.', '1mz-for-artists' ); ?></span>
                    </span>
                </li>
                <li class="pw-v2-feature">
                    <span class="pw-v2-check" aria-hidden="true">
                        <svg width="12" height="12" viewBox="0 0 16 16" fill="none"><path d="M3 8.5l3.5 3.5L13 5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
                    </span>
                    <span class="pw-v2-feature-text">
                        <span class="pw-v2-feature-title"><?php esc_html_e( 'Analytics Avançado', '1mz-for-artists' ); ?></span>
                        <span class="pw-v2-feature-desc"><?php esc_html_e( 'Veja quem ouve sua música e onde.', '1mz-for-artists' ); ?></span>
                    </span>
                </li>
                <li class="pw-v2-feature">
                    <span class="pw-v2-check" aria-hidden="true">
                        <svg width="12" height="12" viewBox="0 0 16 16" fill="none"><path d="M3 8.5l3.5 3.5L13 5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
                    </span>
                    <span class="pw-v2-feature-text">
                        <span class="pw-v2-feature-title"><?php esc_html_e( 'Verificação Oficial', '1mz-for-artists' ); ?></span>
                        <span class="pw-v2-feature-desc"><?php esc_html_e( 'Tenha o selo azul nas plataformas.', '1mz-for-artists' ); ?></span>
                    </span>
                </li>
            </ul>

            <?php if ( $pacote === null ) : // FALLBACK: nenhum pacote com distribute=true configurado ?>

                <div class="pw-v2-no-plans">
                    <svg class="pw-v2-no-plans-icon" width="28" height="28" viewBox="0 0 24 24" fill="none" aria-hidden="true">
                        <circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5"/>
                        <path d="M12 7v5M12 16v.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
                    </svg>
                    <div class="pw-v2-no-plans-title"><?php esc_html_e( 'Planos indisponíveis no momento', '1mz-for-artists' ); ?></div>
                    <div class="pw-v2-no-plans-desc">
                        <?php esc_html_e( 'Ainda não há planos de distribuição configurados. A nossa equipa está a preparar as opções — por favor contacte o suporte para mais informações.', '1mz-for-artists' ); ?>
                    </div>
                </div>

            <?php else :
                $custo      = (float) $pacote['preco'];
                $dias       = isset($pacote['dias']) ? intval($pacote['dias']) : 30;
                $nome_plano = isset($pacote['nome']) ? $pacote['nome'] : __( 'Plano de Distribuição', '1mz-for-artists' );
                $tem_saldo  = ( $saldo >= $custo );
            ?>

                <div class="pw-v2-price-box">
                    <div class="pw-v2-plan-name"><?php echo esc_html( $nome_plano ); ?></div>
                    <div class="pw-v2-price-row">
                        <span class="pw-v2-price"><?php echo esc_html( number_format( $custo, 2, ',', '.' ) ); ?></span>
                        <span class="pw-v2-price-currency">MT</span>
                    </div>
                    <div class="pw-v2-price-period">
                        <?php
                        printf(
                            /* translators: %d = número de dias */
                            esc_html__( 'Válido por %d dias · cancele quando quiser', '1mz-for-artists' ),
                            $dias
                        );
                        ?>
                    </div>
                </div>

                <?php if ( $tem_saldo ) : ?>

                    <div class="pw-v2-balance-ok">
                        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5"/><path d="M8 12.5l2.5 2.5L16 9.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
                        <span>
                            <?php
                            printf(
                                /* translators: %s = saldo formatado */
                                esc_html__( 'Saldo disponível: %s MT', '1mz-for-artists' ),
                                '<strong>' . esc_html( number_format( $saldo, 2, ',', '.' ) ) . '</strong>'
                            );
                            ?>
                        </span>
                    </div>

                    <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>"
                          onsubmit="return confirm('<?php echo esc_js( sprintf(
                              __( 'Serão deduzidos %s MT do seu saldo. Confirmar compra do plano %s?', '1mz-for-artists' ),
                              number_format( $custo, 2, ',', '.' ),
                              $nome_plano
                          ) ); ?>');">
                        <input type="hidden" name="action" value="rmbz_buy_vip_package">
                        <input type="hidden" name="package_id" value="<?php echo esc_attr( $pacote['id'] ); ?>">
                        <?php wp_nonce_field('rmbz_buy_package_nonce'); ?>
                        <button type="submit" class="pw-v2-btn pw-v2-btn-primary">
                            <span><?php esc_html_e( 'Activar plano agora', '1mz-for-artists' ); ?></span>
                            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M5 12h14M13 5l7 7-7 7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
                        </button>
                    </form>

                <?php else : ?>

                    <div class="pw-v2-balance-low">
                        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" aria-hidden="true"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="1.5"/><path d="M12 7v5M12 16v.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
                        <div class="pw-v2-balance-low-text">
                            <div class="pw-v2-balance-low-title"><?php esc_html_e( 'Saldo insuficiente', '1mz-for-artists' ); ?></div>
                            <div class="pw-v2-balance-low-desc">
                                <?php
                                printf(
                                    /* translators: 1: saldo actual, 2: valor em falta */
                                    esc_html__( 'Você tem %1$s MT · faltam %2$s MT', '1mz-for-artists' ),
                                    esc_html( number_format( $saldo, 2, ',', '.' ) ),
                                    esc_html( number_format( $custo - $saldo, 2, ',', '.' ) )
                                );
                                ?>
                            </div>
                        </div>
                    </div>

                    <a href="<?php echo esc_url( home_url('/minha-conta/') ); ?>" class="pw-v2-btn pw-v2-btn-primary">
                        <span><?php esc_html_e( 'Fazer Depósito', '1mz-for-artists' ); ?></span>
                        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M5 12h14M13 5l7 7-7 7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
                    </a>

                <?php endif; ?>

            <?php endif; ?>

            <div class="pw-v2-footer">
                <svg width="12" height="12" viewBox="0 0 24 24" fill="none" aria-hidden="true"><rect x="5" y="11" width="14" height="10" rx="1.5" stroke="currentColor" stroke-width="1.5"/><path d="M8 11V8a4 4 0 018 0v3" stroke="currentColor" stroke-width="1.5"/></svg>
                <span><?php esc_html_e( 'Acesso bloqueado · ative para desbloquear', '1mz-for-artists' ); ?></span>
            </div>

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

/**
 * ==========================================================================
 * CONTROLADOR PRINCIPAL DA ABA DE DISTRIBUIÇÃO
 * ==========================================================================
 */
function rmbz_render_distribution_dashboard() {
    rmbz_enqueue_distro_assets();

    if ( ! function_exists('rmbz_get_current_user_telemovel') ) return 'Erro: Sessão inválida.';
    $telemovel = rmbz_get_current_user_telemovel();

    // [1.5.197] Detectar se é admin WP a aceder (modo override)
    $is_admin_override = function_exists('current_user_can') && current_user_can('manage_options');

    // Caso especial: admin sem release_id em contexto e sem sessão de telefone
    // → mostrar página de escolha de artista
    if ( $is_admin_override && empty( $telemovel ) ) {
        rmbz_render_admin_artist_picker();
        return;
    }

    global $wpdb;

    // ==========================================================================
    // 1. VERIFICAR CASTIGOS DA ADMINISTRAÇÃO
    // [1.5.197] Bypass para admin — não aplicar gates do artista
    // ==========================================================================
    if ( ! $is_admin_override ) {
        $user_wallet = $wpdb->get_row( $wpdb->prepare("SELECT extra_data FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s", $telemovel) );
        $w_extra = ($user_wallet && !empty($user_wallet->extra_data)) ? json_decode($user_wallet->extra_data, true) : [];

        $is_blocked_per_user = !empty($w_extra['block_distribution']) ? true : false;
        // [1.6.47] Bloqueio global (toda a plataforma)
        $is_blocked_global = function_exists('rmbz_is_globally_blocked')
            ? rmbz_is_globally_blocked('distribution') : false;
        $is_blocked_by_admin = $is_blocked_per_user || $is_blocked_global;

        if ($is_blocked_by_admin) {
            // [1.6.47] Mensagem diferente conforme o tipo de bloqueio
            $gate_message = $is_blocked_global && ! $is_blocked_per_user
                ? __( 'A Distribuição Digital está temporariamente suspensa em toda a plataforma. Por favor tenta de novo mais tarde.', '1mz-for-artists' )
                : __( 'O seu acesso à Distribuição Digital foi bloqueado permanentemente pela administração da 1MusicMoz.', '1mz-for-artists' );

            $gate_aux = $is_blocked_global && ! $is_blocked_per_user
                ? __( 'O serviço está em manutenção. Aguarda alguns minutos ou contacta o suporte se persistir.', '1mz-for-artists' )
                : __( 'Isto pode ocorrer devido a violação de direitos autorais ou uso indevido da plataforma. Contacte o suporte para mais informações.', '1mz-for-artists' );

            $icon_block = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">'
                        . '<circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="1.8"/>'
                        . '<path d="M5.6 5.6l12.8 12.8" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>'
                        . '</svg>';
            echo '<div class="rmbz-gate rmbz-gate--danger">'
               .   '<div class="rmbz-gate__icon">' . $icon_block . '</div>'
               .   '<h2 class="rmbz-gate__title">' . esc_html__( 'Acesso Restrito', '1mz-for-artists' ) . '</h2>'
               .   '<p class="rmbz-gate__message">' . esc_html( $gate_message ) . '</p>'
               .   '<p class="rmbz-gate__message-aux">' . esc_html( $gate_aux ) . '</p>'
               . '</div>';
            return;
        }
    }

    // ==========================================================================
    // 2. VERIFICAÇÃO DE SUBSCRIÇÃO VIP
    // [1.5.197] Bypass para admin — não exigir subscrição
    // ==========================================================================
    if ( ! $is_admin_override ) {
        $has_sub = function_exists('rmbz_user_has_active_subscription') ? rmbz_user_has_active_subscription($telemovel) : false;
        if ( ! $has_sub ) { rmbz_render_distribution_paywall($telemovel); return; }
        $plan_permissions = function_exists( 'rmbz_vip_plan_permissions' )
            ? rmbz_vip_plan_permissions( $telemovel, isset( $w_extra ) && is_array( $w_extra ) ? $w_extra : null )
            : [];
        if ( empty( $plan_permissions['distribute'] ) ) {
            rmbz_render_distribution_paywall( $telemovel );
            return;
        }
    }

    // [1.5.197] Banner de modo admin no topo do painel (se admin override)
    if ( $is_admin_override ) {
        $artist_label = '';
        if ( $telemovel ) {
            $artist_name = $wpdb->get_var( $wpdb->prepare(
                "SELECT user_nome FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s",
                $telemovel
            ) );
            $artist_label = $artist_name ? ' (a actuar como: <strong>' . esc_html( $artist_name ) . '</strong>)' : '';
        }
        echo '<div style="background:#fef3c7; border:1px solid #f59e0b; color:#78350f; padding:10px 16px; border-radius:6px; margin:0 0 14px 0; display:flex; align-items:center; gap:10px; font-size:13px;">';
        echo '  <span style="font-size:18px;">⚙️</span>';
        echo '  <div style="flex:1;"><strong>Modo administrador</strong>' . $artist_label . ' — A editar como WP admin. Alterações são registadas no audit trail.</div>';
        echo '  <a href="' . esc_url( admin_url('admin.php?page=rmbz-admin-distribution&tab=releases') ) . '" style="color:#78350f; text-decoration:underline; font-size:12px;">← Voltar ao admin</a>';
        echo '</div>';
    }

    // Roteamento
    $action = isset($_GET['distro_action']) ? $_GET['distro_action'] : 'dashboard';
    $release_id = isset($_GET['id']) ? intval($_GET['id']) : 0;

    // [DS 1.5.82] BLOQUEIO POR PENDÊNCIA SOMAS
    // Se o artista tem pedido SOMAS pending/returned, bloqueamos tudo
    // excepto a rota onde ele resolve (licensing-somas) e a rota onde ele
    // pode rever os seus dados (artist-data). Mostra-se um banner amigável
    // e impede-se uso da distribuição até resolver.
    if ( function_exists('rmbz_licensing_should_block_route')
         && rmbz_licensing_should_block_route( $telemovel, $action ) ) {
        echo '<div class="distro-dashboard rmbz-fullbleed">';
        echo '<div class="distro-header"><h1>Distribuição Digital</h1>';
        echo '<a href="?distro_action=artist-data" class="back-link">Ver os meus dados &rarr;</a></div>';
        rmbz_licensing_render_pending_alert( $telemovel );
        echo '</div>';
        return;
    }

    // Ações Específicas
    if ( $action === 'create' || $action === 'edit_release' ) {
        // [1.5.189] GUARD DE STATUS — só permite editar em estados editáveis.
        // Defesa em profundidade: o botão "Editar" já está escondido na UI
        // mas alguém pode chegar aqui via URL directa, bookmark, ou inspecção
        // do DOM. Aqui é o último gate antes de o wizard carregar com dados
        // editáveis (que depois geraria UPDATE na BD).
        //
        // [1.5.196] BYPASS PARA ADMINS — admins (manage_options) podem editar
        // em mais estados que o artista. Excepção absoluta: live/distribuido
        // permanecem bloqueados para todos (sem desync com DSPs). Para corrigir
        // release nas lojas, usar takedown primeiro.
        if ( $action === 'edit_release' && $release_id > 0 ) {
            $r = $wpdb->get_row( $wpdb->prepare(
                "SELECT status, artist_telemovel FROM {$wpdb->prefix}rmbz_distro_releases WHERE id = %d",
                $release_id
            ) );

            $is_admin = current_user_can('manage_options');

            // Estados editáveis (artista): apenas pre-aprovação
            $artist_editable_statuses = [ 'incomplete', 'draft', 'returned' ];
            // Estados bloqueados absolutamente (mesmo admin): apenas nas lojas
            $always_blocked_statuses  = [ 'live', 'distribuido' ];

            $is_blocked = false;
            if ( $r ) {
                if ( in_array( $r->status, $always_blocked_statuses, true ) ) {
                    // Bloqueado para todos
                    $is_blocked = true;
                } elseif ( ! $is_admin && ! in_array( $r->status, $artist_editable_statuses, true ) ) {
                    // Artista comum num estado não-editável
                    $is_blocked = true;
                }
                // Caso especial: takedown_requested e taken_down também bloqueiam
                // mesmo para admin — usar fluxo de takedown_cancel primeiro.
                if ( $is_admin && in_array( $r->status, [ 'takedown_requested' ], true ) ) {
                    $is_blocked = true;
                }
            }

            if ( $r && $is_blocked ) {
                $reasons = [
                    'approved'           => $is_admin
                        ? 'Estado approved — já em entrega aos DSPs. Edição bloqueada para evitar desync.'
                        : 'Já foi aprovado e está em entrega aos DSPs.',
                    'distribuido'        => 'Já está nas lojas. Pede um takedown se precisa de corrigir.',
                    'live'               => 'Já está nas lojas. Pede um takedown se precisa de corrigir.',
                    'takedown_requested' => 'Takedown em análise — edição bloqueada.',
                    'taken_down'         => $is_admin
                        ? 'Removido das lojas. Para reeditar, faz uma cópia ou cancela o takedown.'
                        : 'Removido das lojas — contacta a equipa para reeditar.',
                    'rejected'           => $is_admin
                        ? 'Estado rejected. Para reabrir edição, muda o status manualmente.'
                        : 'Rejeitado — não é possível editar.',
                ];
                $msg = $reasons[ $r->status ] ?? 'Edição bloqueada para este estado.';
                echo '<div class="distro-dashboard rmbz-fullbleed" style="padding:32px;">';
                echo '  <div style="max-width:560px; margin:48px auto; background:#1a1a1a; border:1px solid #333; border-radius:10px; padding:28px; text-align:center;">';
                echo '    <div style="font-size:42px; margin-bottom:8px;">🔒</div>';
                echo '    <h2 style="color:#fff; margin:0 0 8px;">Edição bloqueada</h2>';
                echo '    <p style="color:#aaa; margin:0 0 18px;">' . esc_html( $msg ) . '</p>';
                echo '    <a href="?distro_action=view_release&id=' . (int) $release_id . '" style="display:inline-block; padding:10px 20px; background:#f0b90b; color:#000; text-decoration:none; border-radius:6px; font-weight:600;">Ver detalhes do lançamento</a>';
                echo '  </div>';
                echo '</div>';
                return;
            }

            // [1.5.196] Mostrar banner de "Modo admin" se for admin a editar release
            // que não está nos estados normais do artista (approved, etc).
            if ( $is_admin && $r && ! in_array( $r->status, $artist_editable_statuses, true ) ) {
                echo '<div style="background:#fef3c7; border:1px solid #f59e0b; color:#78350f; padding:12px 18px; border-radius:6px; margin-bottom:14px; display:flex; align-items:center; gap:10px;">';
                echo '  <span style="font-size:20px;">⚙️</span>';
                echo '  <div>';
                echo '    <strong>Modo admin</strong> — A editar lançamento em estado <code>' . esc_html( $r->status ) . '</code>. Os artistas normais não podem editar neste estado.';
                echo '    Faz alterações com cuidado e regista o motivo nas notas.';
                echo '  </div>';
                echo '</div>';
            }

            // [1.5.196] Para admin, passar o telemovel do artista da release
            // (não do admin) ao wizard. Senão a query "WHERE artist_telemovel = ?"
            // no wizard não encontraria o release.
            if ( $is_admin && $r && ! empty( $r->artist_telemovel ) ) {
                $telemovel = $r->artist_telemovel;
            }
        }
        if (function_exists('rmbz_render_wizard_view')) rmbz_render_wizard_view( $telemovel, $release_id );
        return;
    }
    if ( $action === 'view_release' && $release_id > 0 ) {
        if (function_exists('rmbz_render_single_release_view')) rmbz_render_single_release_view( $release_id, $telemovel );
        return;
    }
    if ( $action === 'analytics' ) {
        if (function_exists('rmbz_render_analytics_view')) rmbz_render_analytics_view( $telemovel );
        return;
    }
    // [1.5.232] FASE 2 — Conquistas
    if ( $action === 'milestones' ) {
        if (function_exists('rmbz_render_milestones_view')) rmbz_render_milestones_view( $telemovel );
        return;
    }
    // [1.5.232] FASE 2 — Histórico de atividade
    if ( $action === 'history' ) {
        if (function_exists('rmbz_render_history_view')) rmbz_render_history_view( $telemovel );
        return;
    }
    // [1.5.235] FASE 3 — Notificações (centro + preferências)
    if ( $action === 'notifications' ) {
        if (function_exists('rmbz_render_notifications_view')) rmbz_render_notifications_view( $telemovel );
        return;
    }
    if ( $action === 'list' ) {
        echo '<div class="distro-dashboard rmbz-fullbleed"><div class="distro-header"><h1>Minha Discografia</h1><a href="?distro_action=dashboard" class="back-link">&larr; Voltar</a></div>';
        if (function_exists('rmbz_render_releases_list_view')) rmbz_render_releases_list_view($telemovel);
        echo '</div>';
        return;
    }
    if ( $action === 'profiles' ) {
        if (function_exists('rmbz_render_artist_profiles_view')) rmbz_render_artist_profiles_view( $telemovel );
        return;
    }
    // [DS 1.5.80] Licenciamento musical (SOMAS)
    if ( $action === 'licensing-somas' ) {
        do_action( 'rmbz_distro_route_licensing-somas', $telemovel );
        return;
    }
    // [DS 1.5.82] Página "Dados do Artista" — sumário pessoal + estado SOMAS
    if ( $action === 'artist-data' ) {
        do_action( 'rmbz_distro_route_artist-data', $telemovel );
        return;
    }

    // ==========================================================================
    // DASHBOARD PRINCIPAL
    // ==========================================================================
    
    // 1. Dados do Artista (Nome)
    $user_data = $wpdb->get_row( $wpdb->prepare("SELECT user_nome FROM {$wpdb->prefix}rmbz_wallets WHERE user_telemovel = %s", $telemovel) );
    $artist_name = $user_data ? $user_data->user_nome : 'Artista';

    // 2. Estatísticas (Saldo e Streams)
    $stats = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}rmbz_distro_stats WHERE artist_telemovel = %s", $telemovel) );
    $saldo_usd = $stats ? (float)$stats->total_earnings : 0.00;
    $streams = $stats ? (int)$stats->total_streams : 0;
    // Nota: a coluna plan_type não existe na tabela rmbz_distro_stats.
    // Usamos valor fixo até haver sistema de planos implementado.
    $plano = 'Pro';

    // 3. Lançamentos Recentes (Limite 6) — com filtro opcional por tipo.
    //
    // NOTA TÉCNICA: NÃO usamos $wpdb->prepare aninhado (uma vez para o
    // clause, outra para a query completa). Isso causa "wpdb::prepare foi
    // chamada incorretamente" porque o WordPress conta os %s/%d duas vezes.
    // Em vez disso, construímos a query final consoante o filtro.
    $filter = isset($_GET['filter']) ? sanitize_key($_GET['filter']) : 'all';
    $filter_type = '';
    if ( function_exists('rmbz_release_type_filter_clause') ) {
        $filter_type = rmbz_release_type_filter_clause( $filter );
    }

    // [1.5.179] Paginação progressiva ("Ver mais")
    // Página inicial mostra 6. Click "Ver mais" carrega mais 6 via AJAX.
    $releases_per_load = 6;

    $base_sql  = "SELECT * FROM {$wpdb->prefix}rmbz_distro_releases WHERE artist_telemovel = %s";
    $count_sql = "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_distro_releases WHERE artist_telemovel = %s";

    if ( $filter_type !== '' ) {
        $releases = $wpdb->get_results( $wpdb->prepare(
            $base_sql . " AND release_type = %s ORDER BY created_at DESC LIMIT %d",
            $telemovel, $filter_type, $releases_per_load
        ) );
        $total_releases = (int) $wpdb->get_var( $wpdb->prepare(
            $count_sql . " AND release_type = %s",
            $telemovel, $filter_type
        ) );
    } else {
        $releases = $wpdb->get_results( $wpdb->prepare(
            $base_sql . " ORDER BY created_at DESC LIMIT %d",
            $telemovel, $releases_per_load
        ) );
        $total_releases = (int) $wpdb->get_var( $wpdb->prepare(
            $count_sql,
            $telemovel
        ) );
    }
    $loaded_count = count( $releases );
    $has_more = ( $loaded_count < $total_releases );

    // Sweep oportunístico — reclassifica releases mal marcados
    if ( function_exists('rmbz_release_type_sweep_misclassified') ) {
        rmbz_release_type_sweep_misclassified();
    }

    // 4. Conversão Visual
    // [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);
    $saldo_mt_estimado = $saldo_usd * $exchange_rate;

    ob_start();
    ?>
    <div class="distro-dashboard rmbz-fullbleed">

        <?php
        // [1.5.182] Sistema de notificações inline — banner com alertas
        // específicos do utilizador + broadcasts. Aparece logo a seguir
        // ao container de abertura, antes do header "Olá, X".
        if ( function_exists('rmbz_notif_render_dashboard_banner') ) {
            rmbz_notif_render_dashboard_banner( $telemovel );
        }
        ?>

        <div class="distro-header">
            <h1>Olá, <?php echo esc_html($artist_name); ?></h1>
            
            <div class="header-actions">
                <a href="?distro_action=artist-data" class="onemz-btn" style="background:#222; border:1px solid #444; color:#fff; display:inline-flex; align-items:center; gap:8px; width:auto; padding: 10px 20px; font-size:13px; text-decoration:none;">
                    👤 Dados do Artista
                </a>
                <a href="?distro_action=profiles" class="onemz-btn" style="background:#222; border:1px solid #444; color:#fff; display:inline-flex; align-items:center; gap:8px; width:auto; padding: 10px 20px; font-size:13px; text-decoration:none;">
                    🎤 Perfis nas Lojas
                </a>
                <a href="?distro_action=analytics" class="onemz-btn" style="background:#222; border:1px solid #444; color:#fff; display:inline-flex; align-items:center; gap:8px; width:auto; padding: 10px 20px; font-size:13px; text-decoration:none;">
                    📊 Ver Tendências
                </a>
                <a href="?distro_action=milestones" class="onemz-btn" style="background:#222; border:1px solid #444; color:#fff; display:inline-flex; align-items:center; gap:8px; width:auto; padding: 10px 20px; font-size:13px; text-decoration:none;">
                    🏆 Conquistas
                </a>
                <a href="?distro_action=history" class="onemz-btn" style="background:#222; border:1px solid #444; color:#fff; display:inline-flex; align-items:center; gap:8px; width:auto; padding: 10px 20px; font-size:13px; text-decoration:none;">
                    📜 Histórico
                </a>
                <a href="?distro_action=notifications" class="onemz-btn" style="background:#222; border:1px solid #444; color:#fff; display:inline-flex; align-items:center; gap:8px; width:auto; padding: 10px 20px; font-size:13px; text-decoration:none;">
                    🔔 Notificações
                </a>
            </div>
        </div>

        <div class="stats-grid">
            
            <div class="stat-card">
                <span class="stat-label">Saldo Disponível (Royalties)</span>
                <span class="stat-value">$<?php echo number_format($saldo_usd, 2); ?></span>
                <small style="color:#666;">~ <?php echo number_format($saldo_mt_estimado, 2, ',', '.'); ?> MT</small>
            </div>

            <div class="stat-card">
                <span class="stat-label">Plano Ilimitado</span>
                <div class="pro-badge">
                    <span style="color:#f0b90b;">◉</span> <?php echo esc_html(strtoupper( (string) ($plano ?: 'Pro') )); ?>
                </div>
                <small style="color:#2ecc71; font-weight:bold; margin-top:5px;">✓ Subscrição Ativa</small>
            </div>

            <div class="stat-card">
                <span class="stat-label">Reproduções Acumuladas</span>
                <div>
                    <span class="new-feature-badge">Novo Recurso!</span>
                    <div style="display:flex; justify-content:space-between; align-items:flex-end;">
                        <span class="stat-value">
                            <?php echo ($streams > 1000000) ? round($streams/1000000, 1).'M' : number_format($streams); ?>
                        </span>
                        <a href="?distro_action=analytics" style="color:#aaa; font-size:12px; text-decoration:none;">Ver Análises &gt;</a>
                    </div>
                </div>
            </div>
        </div>

        <div class="promo-banner">
            <div style="display:flex; gap:15px; align-items:center;">
                <div style="font-size:30px;">🔥</div>
                <div>
                    <h3 style="margin:0; color:#fff;">Suas músicas. <span style="color:#f0b90b;">Seu dinheiro.</span></h3>
                    <p style="margin:5px 0 0 0; font-size:13px; color:#ccc;">Receba 100% dos royalties do Spotify, Apple Music e mais.</p>
                </div>
            </div>
            <a href="?distro_action=create" class="btn-gradient">
                <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
                    <path d="M12 5v14M5 12h14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/>
                </svg>
                Novo Lan&ccedil;amento
            </a>
        </div>

        <h3 style="color:#fff; margin-bottom:15px;">Contas de artistas</h3>
        <div class="artist-accounts-grid">
            <div class="account-card spotify">
                <img src="https://upload.wikimedia.org/wikipedia/commons/1/19/Spotify_logo_without_text.svg" width="40" alt="Spotify">
                <div>
                    <strong style="color:#fff; display:block;">Spotify for Artists</strong>
                    <small style="color:#ddd; font-size:12px;">Reivindicar perfil ></small>
                </div>
            </div>
            <div class="account-card apple">
                <img src="https://upload.wikimedia.org/wikipedia/commons/f/fa/Apple_logo_black.svg" width="30" style="filter:invert(1);" alt="Apple">
                <div>
                    <strong style="color:#fff; display:block;">Apple Music for Artists</strong>
                    <small style="color:#ddd; font-size:12px;">Ver estatísticas ></small>
                </div>
            </div>
        </div>

        <div class="releases-header">
            <h2 style="color:#fff; margin:0;">Seus lançamentos</h2>
            <div>
                <?php
                if ( function_exists('rmbz_release_type_render_filter_bar') ) {
                    rmbz_release_type_render_filter_bar( $filter );
                }
                ?>
            </div>
        </div>

        <div class="releases-grid"
             id="rmbz-releases-grid"
             data-loaded="<?php echo (int) $loaded_count; ?>"
             data-total="<?php echo (int) $total_releases; ?>"
             data-filter="<?php echo esc_attr( $filter ); ?>"
             data-per-load="<?php echo (int) $releases_per_load; ?>"
             data-dashboard-max="12"
             data-list-url="?distro_action=list"
             data-nonce="<?php echo esc_attr( wp_create_nonce('rmbz_load_more_releases') ); ?>">
            
            <?php if ( ! empty($releases) ): ?>
                <?php
                // [DS 1.5.69] Tabela de configuração de status — substitui o
                // if/elseif inline com cores hardcoded. Cada status tem:
                //   • label    : texto mostrado ao utilizador
                //   • color    : cor do ponto (semânticamente coerente)
                //   • action   : link onde levar ao clicar
                //   • priority : se requer atenção do artista (afecta visual)
                //
                // Mudanças nesta versão (1.5.69):
                //   • returned → LARANJA (#e67e22) — antes era cinzento default
                //     porque não havia case (o utilizador reportou). Faz sentido
                //     ser laranja/warning porque pode ser corrigido (não é fim
                //     do caminho, ao contrário de rejected).
                //   • rejected → VERMELHO (#e74c3c) — preparado para o futuro,
                //     ainda não existe como status de release mas o suporte
                //     fica pronto. Vermelho = acção definitiva, sem volta.
                //   • incomplete → CINZENTO AZULADO (#94a3b8) — antes era
                //     vermelho. Rascunho NÃO é erro — é "em construção".
                //     Vermelho fica reservado para rejected (definitivo).
                //   • pendente continua AMARELO (#f0b90b) — em revisão pela equipa
                //   • live continua VERDE (#2ecc71) — publicado nas lojas
                $status_map = [
                    'live'        => [ 'label' => 'Live',           'color' => '#2ecc71', 'action' => 'view_release' ],
                    'distribuido' => [ 'label' => 'Live',           'color' => '#2ecc71', 'action' => 'view_release' ],
                    'pendente'    => [ 'label' => 'Em Revisão',     'color' => '#f0b90b', 'action' => 'view_release' ],
                    'returned'    => [ 'label' => 'Devolvido',      'color' => '#e67e22', 'action' => 'edit_release' ],
                    'rejected'    => [ 'label' => 'Rejeitado',      'color' => '#e74c3c', 'action' => 'view_release' ],
                    'incomplete'  => [ 'label' => 'Rascunho',       'color' => '#94a3b8', 'action' => 'edit_release' ],
                ];
                ?>
                <?php foreach($releases as $rel):
                    if ( function_exists('rmbz_render_release_card') ) {
                        rmbz_render_release_card( $rel, $status_map );
                    }
                endforeach; ?>
            <?php endif; ?>

            <a href="?distro_action=create" style="text-decoration:none;" id="rmbz-add-release-card">
                <div class="release-card js-add-release">
                    <div class="add-release-card">
                        <div class="plus-btn">+</div>
                    </div>
                </div>
            </a>

        </div>

        <?php /* [1.5.179] Botão "Ver mais" — só aparece se há mais releases por carregar */ ?>
        <?php if ( $has_more ): ?>
            <div style="text-align:center; margin-top:20px;">
                <button type="button" id="rmbz-load-more-releases"
                        style="background:#1a1a1a; border:1px solid #333; color:#f0b90b; padding:12px 28px; border-radius:8px; font-size:14px; font-weight:600; cursor:pointer; transition:all 0.15s ease;"
                        onmouseover="this.style.borderColor='#f0b90b';this.style.background='#222';"
                        onmouseout="this.style.borderColor='#333';this.style.background='#1a1a1a';">
                    Ver mais (<span id="rmbz-load-more-remaining"><?php echo (int) ( $total_releases - $loaded_count ); ?></span>)
                </button>
            </div>
        <?php endif; ?>

        <div style="margin-top: 50px; border-top: 1px solid #333; padding-top: 30px;">
            <h3 style="color:#fff; margin-bottom:20px;">Gestão de Catálogo (Discografia)</h3>
            <?php 
                if ( function_exists('rmbz_render_releases_list_view') ) {
                    rmbz_render_releases_list_view($telemovel);
                }
            ?>
        </div>

        <div class="footer-actions">
            <a href="?distro_action=list" class="btn-secondary-outline" style="text-decoration:none;">VER TODOS</a>
            <a href="?distro_action=create" class="btn-gradient" style="text-decoration:none;">
                <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
                    <path d="M12 5v14M5 12h14" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/>
                </svg>
                ADICIONAR LAN&Ccedil;AMENTO
            </a>
        </div>

        <?php /* [1.5.179] JS — Ver mais releases via AJAX
                 [1.5.180] Limite de 12 cards no dashboard. Após esgotar limite,
                 o botão troca para "Ver todos os lançamentos →" que leva à
                 página de Discografia. */ ?>
        <script>
        (function() {
            var btn = document.getElementById('rmbz-load-more-releases');
            var grid = document.getElementById('rmbz-releases-grid');
            if (!btn || !grid) return;

            var ajaxUrl  = '<?php echo esc_js( admin_url('admin-ajax.php') ); ?>';
            var nonce    = grid.getAttribute('data-nonce');
            var perLoad  = parseInt(grid.getAttribute('data-per-load'), 10) || 6;
            var dashMax  = parseInt(grid.getAttribute('data-dashboard-max'), 10) || 12;
            var listUrl  = grid.getAttribute('data-list-url') || '?distro_action=list';
            var filter   = grid.getAttribute('data-filter') || 'all';
            var addCard  = document.getElementById('rmbz-add-release-card');

            // Trocar o botão "Ver mais" por "Ver todos os lançamentos →"
            function showSeeAllButton(remaining) {
                btn.disabled = false;
                btn.style.opacity = '1';
                btn.style.borderColor = '#f0b90b';
                btn.style.background = 'linear-gradient(90deg, #f0b90b 0%, #d4a009 100%)';
                btn.style.color = '#000';
                btn.innerHTML = 'Ver todos os lançamentos (' + remaining + ' restantes) →';
                // Substituir o handler de click por navegação
                btn.onclick = function(e) {
                    e.preventDefault();
                    window.location.href = listUrl;
                };
            }

            btn.addEventListener('click', function() {
                if (btn.disabled) return;
                btn.disabled = true;
                btn.style.opacity = '0.6';
                btn.textContent = 'A carregar...';

                var loaded = parseInt(grid.getAttribute('data-loaded'), 10) || 0;
                var total  = parseInt(grid.getAttribute('data-total'), 10) || 0;

                // Calcular quantos pedir nesta call.
                // Se com perLoad ultrapassamos dashMax, pedir só o que cabe.
                var canStillLoad = Math.max(0, dashMax - loaded);
                var thisLoad = Math.min(perLoad, canStillLoad, total - loaded);
                if (thisLoad <= 0) return; // safety

                var fd = new FormData();
                fd.append('action', 'rmbz_load_more_releases');
                fd.append('_nonce', nonce);
                fd.append('offset', String(loaded));
                fd.append('limit', String(thisLoad));
                fd.append('filter', filter);

                fetch(ajaxUrl, { method: 'POST', body: fd, credentials: 'same-origin' })
                    .then(function(r) { return r.json(); })
                    .then(function(data) {
                        if (!data || !data.success) {
                            btn.textContent = 'Erro — tentar novamente';
                            btn.disabled = false;
                            btn.style.opacity = '1';
                            return;
                        }

                        // Inserir novos cards ANTES do botão "+" (que tem que ficar último)
                        if (data.data.html && addCard) {
                            var temp = document.createElement('div');
                            temp.innerHTML = data.data.html;
                            while (temp.firstChild) {
                                grid.insertBefore(temp.firstChild, addCard);
                            }
                        }

                        var newLoaded = loaded + (data.data.count || 0);
                        grid.setAttribute('data-loaded', String(newLoaded));

                        var remaining = total - newLoaded;

                        if (remaining <= 0) {
                            // Acabou tudo — esconder botão suavemente
                            btn.style.transition = 'opacity 0.3s ease';
                            btn.style.opacity = '0';
                            setTimeout(function() {
                                btn.parentNode && btn.parentNode.removeChild(btn);
                            }, 300);
                        } else if (newLoaded >= dashMax) {
                            // [1.5.180] Atingiu limite do dashboard — mostrar Ver todos
                            showSeeAllButton(remaining);
                        } else {
                            // Continuar a permitir Ver mais
                            btn.disabled = false;
                            btn.style.opacity = '1';
                            btn.innerHTML = 'Ver mais (' + remaining + ')';
                        }
                    })
                    .catch(function(err) {
                        console.error('[Releases] Falhou', err);
                        btn.textContent = 'Erro de rede — tentar novamente';
                        btn.disabled = false;
                        btn.style.opacity = '1';
                    });
            });
        })();
        </script>

    </div>
    <?php
    return ob_get_clean();
}


/* ============================================================================
 * [1.5.179] HELPER — render de UM card de release (reutilizado por PHP e AJAX)
 *
 * Centraliza a lógica de render para garantir que os cards carregados via
 * "Ver mais" são idênticos aos renderizados no carregamento inicial.
 *
 * @param object $rel        Linha de wp_rmbz_distro_releases
 * @param array  $status_map Mapeamento status → label/color/action
 * ============================================================================ */
if ( ! function_exists('rmbz_render_release_card') ):
function rmbz_render_release_card( $rel, $status_map = null ) {
    if ( ! $status_map ) {
        $status_map = [
            'live'        => [ 'label' => 'Live',           'color' => '#2ecc71', 'action' => 'view_release' ],
            'distribuido' => [ 'label' => 'Live',           'color' => '#2ecc71', 'action' => 'view_release' ],
            'pendente'    => [ 'label' => 'Em Revisão',     'color' => '#f0b90b', 'action' => 'view_release' ],
            'returned'    => [ 'label' => 'Devolvido',      'color' => '#e67e22', 'action' => 'edit_release' ],
            'rejected'    => [ 'label' => 'Rejeitado',      'color' => '#e74c3c', 'action' => 'view_release' ],
            'incomplete'  => [ 'label' => 'Rascunho',       'color' => '#94a3b8', 'action' => 'edit_release' ],
        ];
    }

    $st_key = strtolower((string) $rel->status);
    if ( isset($status_map[$st_key]) ) {
        $status_label = $status_map[$st_key]['label'];
        $pill_bg      = $status_map[$st_key]['color'];
        $link_action  = $status_map[$st_key]['action'];
    } else {
        $status_label = ucfirst($rel->status);
        $pill_bg      = '#94a3b8';
        $link_action  = 'view_release';
    }
    ?>
    <a href="?distro_action=<?php echo esc_attr($link_action); ?>&id=<?php echo (int) $rel->id; ?>" style="text-decoration:none;">
        <div class="release-card">
            <div class="release-cover-wrap" style="position:relative;">
                <?php if($rel->cover_image): ?>
                    <img src="<?php echo esc_url($rel->cover_image); ?>" class="cover-img">
                <?php else: ?>
                    <div class="cover-img" style="background:#333; display:flex; align-items:center; justify-content:center; color:#555; font-size:30px;">🎵</div>
                <?php endif; ?>

                <div class="status-pill" style="background: rgba(0,0,0,0.8);">
                    <span style="width:6px; height:6px; background:<?php echo esc_attr($pill_bg); ?>; border-radius:50%;"></span>
                    <?php echo esc_html($status_label); ?>
                </div>
            </div>
            <strong style="display:block; color:#fff; font-size:14px; margin-top:8px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;">
                <?php echo esc_html($rel->title ? $rel->title : 'Sem Título'); ?>
            </strong>
        </div>
    </a>
    <?php
}
endif;


/* ============================================================================
 * [1.5.179] HANDLER AJAX — load more releases
 *
 * Recebe: offset, limit, filter, nonce
 * Devolve: HTML dos próximos cards
 *
 * Segurança:
 *   - Verifica nonce
 *   - Usa telemovel da SESSÃO (não do POST) — utilizador não pode ver
 *     releases de outro artista
 *   - Limit hardcoded a 24 por chamada (defensivo, evita scraping)
 * ============================================================================ */
function rmbz_load_more_releases_ajax_handler() {
    if ( ! isset($_POST['_nonce']) || ! wp_verify_nonce( $_POST['_nonce'], 'rmbz_load_more_releases' ) ) {
        wp_send_json_error( [ 'msg' => 'nonce_invalid' ], 403 );
    }

    if ( ! function_exists('rmbz_get_current_user_telemovel') ) {
        wp_send_json_error( [ 'msg' => 'no_session_helper' ], 500 );
    }
    $telemovel = rmbz_get_current_user_telemovel();
    if ( empty( $telemovel ) ) {
        wp_send_json_error( [ 'msg' => 'not_logged_in' ], 401 );
    }

    $offset = max( 0,   (int) ( $_POST['offset'] ?? 0 ) );
    $limit  = min( 24,  max( 1, (int) ( $_POST['limit'] ?? 6 ) ) ); // hard cap 24
    $filter = isset($_POST['filter']) ? sanitize_key( $_POST['filter'] ) : 'all';

    global $wpdb;
    $base_sql = "SELECT * FROM {$wpdb->prefix}rmbz_distro_releases WHERE artist_telemovel = %s";

    $filter_type = '';
    if ( function_exists('rmbz_release_type_filter_clause') ) {
        $filter_type = rmbz_release_type_filter_clause( $filter );
    }

    if ( $filter_type !== '' ) {
        $rows = $wpdb->get_results( $wpdb->prepare(
            $base_sql . " AND release_type = %s ORDER BY created_at DESC LIMIT %d OFFSET %d",
            $telemovel, $filter_type, $limit, $offset
        ) );
    } else {
        $rows = $wpdb->get_results( $wpdb->prepare(
            $base_sql . " ORDER BY created_at DESC LIMIT %d OFFSET %d",
            $telemovel, $limit, $offset
        ) );
    }

    ob_start();
    foreach ( (array) $rows as $rel ) {
        rmbz_render_release_card( $rel );
    }
    $html = ob_get_clean();

    wp_send_json_success( [
        'html'   => $html,
        'count'  => count( $rows ),
        'offset' => $offset,
    ] );
}
add_action('wp_ajax_rmbz_load_more_releases', 'rmbz_load_more_releases_ajax_handler');
// [1.5.208] Sem nopriv, "carregar mais releases" no painel artista falhava
// para users só com sessão telefone (sem conta WP).
add_action('wp_ajax_nopriv_rmbz_load_more_releases', 'rmbz_load_more_releases_ajax_handler');


/**
 * [1.5.197] Página de escolha de artista para admin
 *
 * Quando WP admin entra no painel sem ter ?id=X (release_id) na URL,
 * mostramos uma lista de artistas para escolher qual quer "personificar".
 *
 * Não é exposto a artistas comuns — só a quem tem manage_options.
 */
function rmbz_render_admin_artist_picker() {
    if ( ! current_user_can('manage_options') ) {
        wp_die('Sem permissão.');
    }

    global $wpdb;
    $search = isset($_GET['admin_search']) ? sanitize_text_field( $_GET['admin_search'] ) : '';

    $where = '1=1';
    $params = [];
    if ( ! empty( $search ) ) {
        $where .= ' AND (user_nome LIKE %s OR user_telemovel LIKE %s)';
        $params[] = '%' . $wpdb->esc_like( $search ) . '%';
        $params[] = '%' . $wpdb->esc_like( $search ) . '%';
    }

    $sql = "SELECT user_telemovel, user_nome,
                   (SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_distro_releases r WHERE r.artist_telemovel = w.user_telemovel) AS releases_count
            FROM {$wpdb->prefix}rmbz_wallets w
            WHERE $where
            ORDER BY releases_count DESC, user_nome ASC
            LIMIT 100";
    $artists = $params
        ? $wpdb->get_results( $wpdb->prepare( $sql, $params ) )
        : $wpdb->get_results( $sql );

    ?>
    <div style="max-width:900px; margin:30px auto; padding:30px; background:#fff; border-radius:10px; box-shadow:0 4px 20px rgba(0,0,0,0.1); font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">
        <div style="display:flex; align-items:center; gap:12px; margin-bottom:20px;">
            <div style="font-size:32px;">⚙️</div>
            <div>
                <h2 style="margin:0; color:#1d2327;">Modo administrador</h2>
                <p style="margin:4px 0 0; color:#666; font-size:13px;">Escolhe um artista para personificar e aceder ao painel de distribuição com os releases dele.</p>
            </div>
        </div>

        <form method="get" style="display:flex; gap:8px; margin-bottom:20px;">
            <?php
            // Preservar parametros existentes excepto admin_search
            foreach ( $_GET as $k => $v ) {
                if ( $k === 'admin_search' ) continue;
                echo '<input type="hidden" name="' . esc_attr($k) . '" value="' . esc_attr($v) . '">';
            }
            ?>
            <input type="text" name="admin_search" value="<?php echo esc_attr( $search ); ?>"
                   placeholder="Procurar por nome ou telemóvel..."
                   style="flex:1; padding:10px 14px; border:1px solid #c3c4c7; border-radius:6px; font-size:14px;">
            <button type="submit" style="background:#2271b1; color:#fff; border:none; padding:10px 20px; border-radius:6px; font-size:14px; cursor:pointer; font-weight:600;">Procurar</button>
        </form>

        <div style="max-height:500px; overflow-y:auto;">
            <?php if ( empty( $artists ) ): ?>
                <p style="color:#999; text-align:center; padding:40px;">Nenhum artista encontrado.</p>
            <?php else: ?>
                <table style="width:100%; border-collapse:collapse;">
                    <thead>
                        <tr style="background:#fafafa; border-bottom:1px solid #dcdcde;">
                            <th style="text-align:left; padding:10px; font-size:11px; color:#787c82; text-transform:uppercase;">Artista</th>
                            <th style="text-align:left; padding:10px; font-size:11px; color:#787c82; text-transform:uppercase;">Telemóvel</th>
                            <th style="text-align:right; padding:10px; font-size:11px; color:#787c82; text-transform:uppercase;">Lançamentos</th>
                            <th style="width:120px; padding:10px;"></th>
                        </tr>
                    </thead>
                    <tbody>
                    <?php foreach ( $artists as $a ):
                        // URL para entrar como este artista — precisa de pelo menos
                        // 1 release ou go to dashboard genérico
                        $first_rel_id = $wpdb->get_var( $wpdb->prepare(
                            "SELECT id FROM {$wpdb->prefix}rmbz_distro_releases
                             WHERE artist_telemovel = %s ORDER BY created_at DESC LIMIT 1",
                            $a->user_telemovel
                        ) );
                        $url = $first_rel_id
                            ? add_query_arg( ['distro_action' => 'view_release', 'id' => (int) $first_rel_id], remove_query_arg(['admin_search']) )
                            : '#';
                    ?>
                        <tr style="border-bottom:1px solid #f0f0f1;">
                            <td style="padding:10px; font-weight:600;"><?php echo esc_html( $a->user_nome ?: '(sem nome)' ); ?></td>
                            <td style="padding:10px; font-family:monospace; font-size:12px; color:#666;"><?php echo esc_html( $a->user_telemovel ); ?></td>
                            <td style="padding:10px; text-align:right;"><?php echo (int) $a->releases_count; ?></td>
                            <td style="padding:10px; text-align:right;">
                                <?php if ( $first_rel_id ): ?>
                                    <a href="<?php echo esc_url( $url ); ?>"
                                       style="background:#dba617; color:#1d2327; padding:6px 14px; border-radius:5px; font-size:12px; font-weight:600; text-decoration:none;">
                                        Entrar →
                                    </a>
                                <?php else: ?>
                                    <span style="color:#999; font-size:11px; font-style:italic;">Sem releases</span>
                                <?php endif; ?>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                    </tbody>
                </table>
            <?php endif; ?>
        </div>

        <p style="margin-top:16px; font-size:12px; color:#999; text-align:center;">
            <a href="<?php echo esc_url( admin_url('admin.php?page=rmbz-admin-distribution&tab=releases') ); ?>" style="color:#2271b1;">← Voltar ao painel admin</a>
        </p>
    </div>
    <?php
}
?>
