<?php
// includes/distribution/distribution-single-view.php

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

/**
 * Renderiza a Página de Detalhes de um Lançamento (Single View)
 * * @param int $release_id O ID do lançamento.
 * @param string $user_telemovel O ID do artista (para segurança).
 */
function rmbz_render_single_release_view( $release_id, $user_telemovel ) {
    global $wpdb;
    
    // 1. Buscar Detalhes do Lançamento
    $table_releases = $wpdb->prefix . 'rmbz_distro_releases';
    $release = $wpdb->get_row( $wpdb->prepare(
        "SELECT * FROM $table_releases WHERE id = %d AND artist_telemovel = %s", 
        $release_id, $user_telemovel
    ) );

    if ( ! $release ) {
        echo '<div class="rmbz-notice error" style="margin-top:20px;">Lançamento não encontrado ou sem permissão de visualização.</div>';
        echo '<a href="?page=rmbz-distribution" class="onemz-btn btn-secondary" style="width:auto; display:inline-block; margin-top:15px;">&larr; Voltar ao Painel</a>';
        return;
    }

    // 2. Buscar Faixas (Tracks) associadas
    $table_tracks = $wpdb->prefix . 'rmbz_distro_tracks';
    // Verificação de segurança se a tabela existe
    if($wpdb->get_var("SHOW TABLES LIKE '$table_tracks'") === $table_tracks) {
        $tracks = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $table_tracks WHERE release_id = %d ORDER BY track_order ASC, id ASC", $release_id) );
    } else {
        $tracks = [];
    }

    // 2.1 Nome real do artista
    $table_wallet = $wpdb->prefix . 'rmbz_wallets';
    $artist_name = $wpdb->get_var( $wpdb->prepare(
        "SELECT user_nome FROM $table_wallet WHERE user_telemovel = %s",
        $user_telemovel
    ) );
    if ( empty($artist_name) ) $artist_name = 'Artista 1MZ';

    // 3. Formatar Dados para Exibição
    $status_label = ucfirst($release->status);
    $status_desc = 'O seu lançamento está em processamento pela nossa equipa.';
    $status_icon = '⏳';
    $status_class = 'pending-mode'; // Classe CSS padrão

    if ($release->status === 'live' || $release->status === 'distribuido') {
        $status_label = 'Disponível';
        $status_desc  = 'Uhu! Sua música está disponível nas lojas e a gerar royalties.';
        $status_icon  = '🎵';
        $status_class = 'live-mode';
    } elseif ($release->status === 'rejeitado') {
        $status_label = 'Rejeitado';
        $status_desc  = 'Houve um problema com a arte ou áudio. Verifique seu email.';
        $status_icon  = '❌';
        $status_class = 'error-mode'; // Poderia adicionar esta classe no CSS
    }

    // Datas
    $data_criacao = isset($release->created_at) && $release->created_at ? date('d/m/Y', strtotime($release->created_at)) : '—';
    $rd_orig = isset($release->release_date_original) ? $release->release_date_original : null;
    if ( empty($rd_orig) && isset($release->release_date) ) $rd_orig = $release->release_date;
    $data_original = $rd_orig ? date('d/m/Y', strtotime($rd_orig)) : $data_criacao;
    
    // Imagem de Capa (Fallback)
    $cover_url = ( isset($release->cover_image) && $release->cover_image ) ? esc_url($release->cover_image) : 'https://via.placeholder.com/300x300?text=No+Cover';

    ?>
    <?php
    // [1.5.117] STUB GLOBAL EARLY-LOAD para rmbzOpenSplitsModal.
    // Definimos a função IMEDIATAMENTE no topo do markup, ANTES de qualquer
    // outro <script> da página. Razão: detectámos casos em que outro script
    // da página (ex: linha 1454 de dashboard-digital — `'#' not followed by
    // identifier`) atira SyntaxError e aborta a execução de todos os scripts
    // SEGUINTES — incluindo o IIFE da modal. Resultado: `rmbzOpenSplitsModal`
    // ficava indefinida e o botão dava ReferenceError silencioso.
    //
    // Pondo o stub AQUI no topo, ele fica definido independentemente do que
    // falhe depois. Quando o utilizador clicar, ele procura o modal no DOM
    // (que já estará lá, pois o markup é emitido depois) e abre normalmente.
    //
    // O IIFE original em distribution-splits-frontend.php sobrescreve este
    // stub com uma versão optimizada quando consegue correr — não há regressão
    // funcional.
    ?>
    <script>
    if (typeof window.rmbzOpenSplitsModal !== 'function') {
        window.rmbzOpenSplitsModal = function() {
            var m = document.getElementById('rmbz-splits-modal');
            if (!m) {
                console.error('[1MZ Splits] Modal #rmbz-splits-modal não encontrada no DOM. ' +
                    'Possível causa: utilizador não é owner da release, ou erro de PHP a renderizar o markup.');
                alert('Não foi possível abrir o configurador de splits.\n\n' +
                    'Tenta recarregar a página (F5). Se persistir, contacta o suporte.');
                return;
            }
            // [1.5.118] Reparent para <body> para escapar de ancestors com
            // transform/filter/contain que quebram position:fixed.
            if (m.parentNode !== document.body) {
                document.body.appendChild(m);
            }
            m.classList.add('is-open');
            m.setAttribute('aria-hidden', 'false');
            document.body.style.overflow = 'hidden';
        };
    }
    </script>
    <?php
    ?>
    <div class="distro-single-view rmbz-sv2 rmbz-fullbleed">
        
        <div class="rmbz-sv2-back">
            <a href="?page=rmbz-distribution&distro_action=list" class="back-link">&larr; Voltar à Discografia</a>
        </div>

        <div class="rmbz-sv2-hero">
            <div class="rmbz-sv2-cover">
                <img src="<?php echo $cover_url; ?>" alt="Capa do Álbum">
            </div>
            <div class="rmbz-sv2-info">
                <h1 class="rmbz-sv2-title"><?php echo esc_html($release->title ?? '—'); ?></h1>
                <p class="rmbz-sv2-artist">por <strong><?php echo esc_html($artist_name); ?></strong></p>

                <div class="rmbz-sv2-meta">
                    <span>📅 <?php echo $data_original; ?></span>
                    <?php if ( ! empty($release->release_type) ): ?>
                        <span>💿 <?php echo esc_html(ucfirst($release->release_type)); ?></span>
                    <?php endif; ?>
                    <?php if ( ! empty($release->primary_genre) ): ?>
                        <span>🎵 <?php echo esc_html($release->primary_genre); ?></span>
                    <?php endif; ?>
                </div>

                <div class="rmbz-sv2-actions">
                    <?php
                    // Estados terminais ou em workflow de takedown — esconder
                    // acções de edição/splits/etc. e mostrar apenas o badge
                    // do estado actual.
                    $rs = $release->status ?? '';
                    $is_in_takedown_flow = in_array( $rs, ['takedown_requested','taken_down'], true );
                    ?>

                    <?php if ( ! $is_in_takedown_flow ): ?>
                        <?php
                        // [DS 1.5.116] Verificar se o utilizador é owner da release.
                        // Só nesse caso o botão funciona (UI completa). Caso contrário,
                        // mostrar versão desabilitada com tooltip.
                        $can_configure_splits = function_exists('rmbz_splits_user_owns_release')
                            && rmbz_splits_user_owns_release( (int) $release->id );

                        // [1.5.144] Mesma verificação de ownership para o botão
                        // de gestão de lojas. Só releases LIVE permitem gerir lojas.
                        $can_manage_stores = $can_configure_splits && in_array( $rs, ['live', 'distribuido'], true );
                        ?>

                        <?php if ( $can_manage_stores ): ?>
                            <button class="rmbz-sv2-btn secondary" id="rmbz-open-stores-btn" onclick="rmbzOpenStoresModal()">🏪 Adicionar / Remover Lojas</button>
                        <?php endif; ?>

                        <?php if ( $can_configure_splits ): ?>
                            <button class="rmbz-sv2-btn secondary" onclick="rmbzOpenSplitsModal()">🔧 Configurar Splits</button>
                        <?php else: ?>
                            <button class="rmbz-sv2-btn secondary" disabled
                                    title="Apenas o artista dono da release pode configurar splits.">
                                🔧 Configurar Splits
                            </button>
                        <?php endif; ?>
                        <?php
                        // [1.5.189] EDITABILIDADE BASEADA NO STATUS
                        //
                        // ANTES: condição era ( $rs !== 'live' ) — permitia editar em
                        // estados como 'approved', 'distribuido', 'takedown_requested'
                        // que JÁ FORAM ENTREGUES aos DSPs. Editar nessa fase causa
                        // inconsistência entre Spotify/Apple e a BD local.
                        //
                        // AGORA: só permite editar nestes estados:
                        //   - incomplete (rascunho)
                        //   - pendente / pending / submitted (à espera de revisão)
                        //   - returned (devolvido pela equipa para correcção)
                        //
                        // Bloqueia em: approved, distribuido, live, takedown_*, rejected
                        $editable_statuses = [ 'incomplete', 'draft', 'returned' ];
                        $can_edit_release  = in_array( $rs, $editable_statuses, true );
                        ?>
                        <?php if ( $can_edit_release ): ?>
                            <a href="?page=rmbz-distribution&distro_action=edit_release&id=<?php echo (int) $release->id; ?>" class="rmbz-sv2-btn primary">✏️ Editar</a>
                        <?php else: ?>
                            <?php
                            // Mensagem clara de porque está bloqueado, baseada no estado
                            $lock_reason = '';
                            if ( in_array( $rs, [ 'approved' ], true ) ) {
                                $lock_reason = 'Já aprovado — em entrega aos DSPs. Edição bloqueada.';
                            } elseif ( in_array( $rs, [ 'distribuido', 'live' ], true ) ) {
                                $lock_reason = 'Nas lojas — para corrigir, pede takedown primeiro.';
                            } elseif ( in_array( $rs, [ 'takedown_requested' ], true ) ) {
                                $lock_reason = 'Takedown em análise — não é possível editar.';
                            } elseif ( in_array( $rs, [ 'taken_down' ], true ) ) {
                                $lock_reason = 'Removido das lojas — para reeditar, contacta a equipa.';
                            } elseif ( in_array( $rs, [ 'rejected' ], true ) ) {
                                $lock_reason = 'Rejeitado — não é possível editar.';
                            } else {
                                $lock_reason = 'Edição bloqueada para este estado.';
                            }
                            ?>
                            <span class="rmbz-sv2-btn secondary" disabled
                                  title="<?php echo esc_attr( $lock_reason ); ?>"
                                  style="opacity:0.5; cursor:not-allowed;">
                                🔒 Editar bloqueado
                            </span>
                        <?php endif; ?>
                    <?php endif; ?>

                    <?php
                    // Botão de pedir takedown — só quando release está efectivamente
                    // nas lojas (live/distribuido) e ainda não há pedido em curso.
                    if ( in_array( $rs, ['live','distribuido'], true ) ): ?>
                        <button type="button" class="rmbz-sv2-btn danger"
                                onclick="rmbzOpenTakedownModal(<?php echo (int) $release->id; ?>);">
                            🗑 Pedir Retirada das Lojas
                        </button>

                    <?php elseif ( $rs === 'takedown_requested' ): ?>
                        <span class="rmbz-sv2-btn ghost-warn" title="Pedido em análise pelo admin">
                            ⏳ Takedown em análise
                        </span>

                    <?php elseif ( $rs === 'taken_down' ): ?>
                        <span class="rmbz-sv2-btn ghost-removed" title="Lançamento removido das lojas">
                            🚫 Removido das lojas
                        </span>
                    <?php endif; ?>

                    <?php
                    // [1.5.230] FASE 1d — Botão "Ver relatório de ganhos".
                    // Só releases nas lojas (live/distribuido) — abre o
                    // relatório de ganhos deste lançamento (igual à app).
                    if ( in_array( $rs, ['live','distribuido'], true ) ): ?>
                        <a href="?distro_action=analytics&release_stats=<?php echo (int) $release->id; ?>"
                           class="rmbz-sv2-btn secondary">
                            📊 Ver relatório de ganhos
                        </a>
                    <?php endif; ?>
                </div>
            </div>
        </div>

        <?php
        // Release Tracker moderno (substitui o banner antigo).
        // Só aparece em releases submetidos (esconde em rascunhos).
        if ( function_exists('rmbz_render_release_tracker') ) {
            rmbz_render_release_tracker( $release );
        }
        ?>

        <div class="rmbz-sv2-two-col">
          <div class="rmbz-sv2-col">
            <h3 class="section-title">Links da loja</h3>
            <div class="links-grid">
            <?php
            // Substituí o hardcoded por loop — botão de copy só aparece se há link.
            // Antes deste fix, o ícone 📄 aparecia sempre, mesmo quando o valor era
            // "Gerado após distribuição..." (causava cliques inúteis).
            $store_fields = [
                'iTunes'      => [ 'val' => $release->link_itunes      ?? '', 'logo' => 'apple_music' ],
                'Apple Music' => [ 'val' => $release->link_applemusic  ?? '', 'logo' => 'apple_music' ],
                'Spotify URL' => [ 'val' => $release->link_spotify_url ?? '', 'logo' => 'spotify' ],
                'Spotify URI' => [ 'val' => $release->link_spotify_uri ?? '', 'logo' => 'spotify' ], // URI não é URL, render diferente
            ];
            foreach ( $store_fields as $label => $info ):
                $val = trim( (string) $info['val'] );
                $is_uri = ( $label === 'Spotify URI' );
                $has = ( $val !== '' );
            ?>
                <div class="link-box <?php echo $has ? 'lb-has' : 'lb-empty'; ?>">
                    <div class="lb-header">
                        <span style="display:inline-flex; align-items:center; gap:6px;">
                            <?php /* [1.5.163] Logo do DSP no header do link */ ?>
                            <?php if ( function_exists('rmbz_service_logo') ): ?>
                                <span style="display:inline-flex; flex-shrink:0;"><?php echo rmbz_service_logo($info['logo'], ['size' => 16]); ?></span>
                            <?php endif; ?>
                            <?php echo esc_html($label); ?>
                        </span>
                        <?php if ( $has ): ?>
                            <i class="copy-icon" onclick="copyToClipboard(this)" title="Copiar">📄</i>
                        <?php endif; ?>
                    </div>
                    <div class="lb-val">
                        <?php if ( ! $has ): ?>
                            <span style="color:#666;">Gerado após distribuição...</span>
                        <?php elseif ( $is_uri ): ?>
                            <?php echo esc_html($val); ?>
                        <?php else: ?>
                            <a href="<?php echo esc_url($val); ?>" target="_blank" rel="noopener" style="color:var(--rmbz-text-primary, #fff);"><?php echo esc_html($val); ?></a>
                        <?php endif; ?>
                    </div>
                </div>
            <?php endforeach; ?>
        </div>
          </div><!-- /.rmbz-sv2-col (Links) -->

          <div class="rmbz-sv2-col">
            <h3 class="section-title">Perfis de artistas</h3>
        <?php
        // Lê os perfis configurados pelo artista em ?distro_action=profiles.
        // Antes deste fix esta secção mostrava sempre Spotify e Apple "Perfil
        // Mapeado" como UI fake (link "#"), o que era enganador.
        $artist_profiles = function_exists('rmbz_artist_profiles_get_all')
            ? rmbz_artist_profiles_get_all( $user_telemovel )
            : [];
        $catalog = function_exists('rmbz_artist_profiles_catalog')
            ? rmbz_artist_profiles_catalog()
            : [];
        ?>
        <?php if ( empty($artist_profiles) ): ?>
            <div class="rmbz-sv2-empty-cta">
                <p>⚠ Ainda não configuraste o teu perfil em nenhuma loja.</p>
                <p>Sem isto, os royalties podem ir para outro artista com o teu nome.</p>
                <a href="?distro_action=profiles" class="rmbz-sv2-btn primary" style="display:inline-block;">🎤 Configurar perfis agora</a>
            </div>
        <?php else: ?>
            <div class="profiles-grid">
                <?php foreach ( $artist_profiles as $slug => $row ):
                    if ( ! isset($catalog[$slug]) ) continue;
                    $meta = $catalog[$slug];
                ?>
                    <div class="profile-card">
                        <div class="pc-icon" style="background:<?php echo esc_attr($meta['color']); ?>20; display:flex; align-items:center; justify-content:center; font-size:18px;">
                            <?php echo $meta['icon']; ?>
                        </div>
                        <div class="pc-info">
                            <strong><?php echo esc_html($meta['name']); ?></strong>
                            <small>✓ Perfil configurado</small>
                        </div>
                        <div class="pc-actions">
                            <a href="<?php echo esc_url($row->url); ?>" target="_blank" rel="noopener" title="Abrir perfil" style="color:var(--rmbz-text-primary, #fff); text-decoration:none;">↗</a>
                        </div>
                    </div>
                <?php endforeach; ?>
            </div>
            <p style="margin-top:8px; font-size:11px; color:var(--rmbz-text-muted, #888);">
                <a href="?distro_action=profiles" style="color:var(--rmbz-brand, #f0b90b); text-decoration:none;">✏️ Editar perfis</a>
            </p>
        <?php endif; ?>
          </div><!-- /.rmbz-sv2-col (Perfis) -->
        </div><!-- /.rmbz-sv2-two-col -->

        <h3 class="section-title">Detalhes do Lançamento</h3>
        <div class="details-table-grid">
            <div class="dt-cell">
                <span class="dt-label">Data original</span>
                <span class="dt-val"><?php echo $data_original; ?></span>
            </div>
            <?php /* UPC ESCONDIDO da vista do artista — código técnico só relevante
                      para o admin/DSPs. Continua a ser gerado e usado no backend
                      (matching de royalties pelo importador). Visível em
                      WP-Admin → 1MZ Distribuição → Lançamentos. */ ?>
            <div class="dt-cell">
                <span class="dt-label">Nome da Gravadora</span>
                <span class="dt-val"><?php echo ! empty($release->label_name) ? esc_html($release->label_name) : '—'; ?></span>
            </div>
            <div class="dt-cell">
                <span class="dt-label">Idioma</span>
                <span class="dt-val"><?php echo ! empty($release->language) ? esc_html($release->language) : '—'; ?></span>
            </div>
            
            <div class="dt-cell">
                <span class="dt-label">Género primário</span>
                <span class="dt-val"><?php echo ! empty($release->primary_genre) ? esc_html($release->primary_genre) : '—'; ?></span>
            </div>
            <div class="dt-cell">
                <span class="dt-label">Subgénero</span>
                <span class="dt-val"><?php echo ! empty($release->secondary_genre) ? esc_html($release->secondary_genre) : '—'; ?></span>
            </div>
            <div class="dt-cell">
                <span class="dt-label">Territórios</span>
                <span class="dt-val"><?php
                    // Primeiro tenta usar a tabela nova rmbz_distro_release_platforms
                    $territorios_str = '—';
                    if ( function_exists('rmbz_distro_get_platforms') ) {
                        $pfm = rmbz_distro_get_platforms( (int) $release->id );
                        if ( $pfm && isset($pfm->territory_mode) ) {
                            if ( $pfm->territory_mode === 'worldwide' ) {
                                $territorios_str = 'Mundo inteiro';
                            } elseif ( $pfm->territory_mode === 'worldwide_except' ) {
                                $n = is_array($pfm->_territory_list) ? count($pfm->_territory_list) : 0;
                                $territorios_str = 'Mundo, excluindo ' . $n . ' país(es)';
                            } elseif ( $pfm->territory_mode === 'selected' ) {
                                $n = is_array($pfm->_territory_list) ? count($pfm->_territory_list) : 0;
                                $territorios_str = $n . ' país(es) selecionado(s)';
                            }
                        }
                    }
                    // Fallback para o campo antigo se existir
                    if ( $territorios_str === '—' && isset($release->sold_worldwide) ) {
                        $territorios_str = ( (int) $release->sold_worldwide === 1 ) ? 'Mundo inteiro' : 'Restrito';
                    }
                    echo esc_html($territorios_str);
                ?></span>
            </div>
            <div class="dt-cell">
                <span class="dt-label">Local de Gravação</span>
                <span class="dt-val"><?php echo ! empty($release->recording_location) ? esc_html($release->recording_location) : '—'; ?></span>
            </div>
        </div>

        <div style="display:flex; justify-content:space-between; align-items:center; margin-top:30px; margin-bottom:10px;">
            <h3 class="section-title" style="margin:0; border:none;">Faixas</h3>
            <?php if($release->status !== 'live'): ?>
                <button class="btn-text-action" onclick="alert('Edição de faixas disponível no assistente.')">✏️ EDITAR</button>
            <?php endif; ?>
        </div>
        
        <div class="tracks-list-container">
            <?php if ( empty($tracks) ): ?>
                <div style="padding:20px; background:#252525; color:var(--rmbz-text-muted, #aaa); text-align:center; border-radius:6px;">
                    Nenhuma faixa encontrada. Se isto for um single, os dados da faixa podem estar a ser processados.
                </div>
            <?php else: ?>
                <?php foreach($tracks as $index => $track): ?>
                <div class="track-row">
                    <div class="tr-num"><?php echo $index + 1; ?></div>
                    <div class="tr-main">
                        <strong class="tr-title"><?php echo esc_html($track->track_title); ?></strong>
                        <div class="tr-meta">
                            <span style="margin-right:15px;">ISRC: <?php echo ( ! empty($track->isrc_code) ) ? '<span style="color:var(--rmbz-text-primary, #fff); font-family:monospace;">'.esc_html($track->isrc_code).'</span>' : '<span style="color:var(--rmbz-brand, #f0b90b);">Atribuído após aprovação</span>'; ?></span>
                            <?php if ( ! empty($track->is_explicit) ): ?>
                                <span style="border:1px solid #666; font-size:9px; padding:1px 3px; border-radius:2px; color:var(--rmbz-text-muted, #aaa);">EXPLICIT</span>
                            <?php endif; ?>
                        </div>
                    </div>
                    <div class="tr-dur">
                        <?php
                            $dur = isset($track->duration) ? $track->duration : (isset($track->duration_seconds) ? $track->duration_seconds : null);
                            if ( ! empty($dur) ) {
                                // Se é inteiro (segundos), formatar como mm:ss
                                if ( is_numeric($dur) ) {
                                    $m = floor($dur / 60);
                                    $s = $dur % 60;
                                    echo esc_html( sprintf('%02d:%02d', $m, $s) );
                                } else {
                                    echo esc_html($dur);
                                }
                            } else {
                                echo '--:--';
                            }
                        ?>
                    </div>
                </div>
                <?php endforeach; ?>
            <?php endif; ?>
        </div>

        <?php
        // [FEAT 1.5.14] Bloco "Serviços Exclusivos" — mostra ao artista o
        // estado dos pedidos feitos no wizard (YT Content ID, FB Rights Manager,
        // TikTok monetization). Só aparece se o artista realmente pediu pelo
        // menos um. Mostra badge, notas do admin, e se for conflito detalhe
        // completo (URL evidência + fonte suspeita) para o artista poder agir.
        $platforms_row = null;
        if ( function_exists('rmbz_distro_get_platforms') ) {
            $platforms_row = rmbz_distro_get_platforms( (int) $release->id );
        }
        $exclusive_services = [
            'yt_content_id' => [
                'label'    => 'YouTube Content ID',
                /* [1.5.162] icon agora é o slug para a função rmbz_service_logo()
                   que renderiza SVG oficial. Antes era emoji '🎬'. */
                'logo'     => 'youtube',
                'color'    => '#FF0000',
                'desc_on'  => 'Monetização ativa — o sistema automático do YouTube vai identificar usos da sua música em vídeos de outros utilizadores e atribuir-lhe os royalties dessa reprodução.',
                'status_col'   => 'yt_content_id_status',
                'note_col'     => 'yt_content_id_decision_note',
                'conf_url_col' => 'yt_content_id_conflict_url',
                'conf_src_col' => 'yt_content_id_conflict_source',
            ],
            'fb_monet' => [
                'label'    => 'Facebook / Instagram Rights Manager',
                'logo'     => 'meta',
                'color'    => '#1877F2',
                'desc_on'  => 'Monetização ativa — sempre que esta música aparecer em Reels, Stories ou vídeos no Facebook ou Instagram, os royalties são-lhe atribuídos.',
                'status_col'   => 'fb_monet_status',
                'note_col'     => 'fb_monet_decision_note',
                'conf_url_col' => 'fb_monet_conflict_url',
                'conf_src_col' => 'fb_monet_conflict_source',
            ],
            'tt_monet' => [
                'label'    => 'TikTok Monetization',
                'logo'     => 'tiktok',
                'color'    => '#010101',
                'desc_on'  => 'Monetização ativa — os usos da sua música em vídeos TikTok são identificados e os royalties atribuídos a si.',
                'status_col'   => 'tt_monet_status',
                'note_col'     => 'tt_monet_decision_note',
                'conf_url_col' => 'tt_monet_conflict_url',
                'conf_src_col' => 'tt_monet_conflict_source',
            ],
        ];

        // Só mostrar a secção se houver pelo menos um serviço pedido (não 'not_requested')
        $has_any_exclusive = false;
        if ( $platforms_row ) {
            foreach ( $exclusive_services as $svc ) {
                $st = $platforms_row->{$svc['status_col']} ?? 'not_requested';
                if ( $st !== 'not_requested' ) { $has_any_exclusive = true; break; }
            }
        }
        ?>
        <?php if ( $has_any_exclusive ): ?>
        <div style="display:flex; justify-content:space-between; align-items:center; margin-top:30px; margin-bottom:10px;">
            <h3 class="section-title" style="margin:0; border:none;">Serviços Exclusivos</h3>
        </div>

        <div class="rmbz-svx-list">
            <?php foreach ( $exclusive_services as $key => $svc ):
                $status       = $platforms_row->{$svc['status_col']} ?? 'not_requested';
                if ( $status === 'not_requested' ) continue;

                $note         = $platforms_row->{$svc['note_col']}     ?? '';
                $conflict_url = $platforms_row->{$svc['conf_url_col']} ?? '';
                $conflict_src = $platforms_row->{$svc['conf_src_col']} ?? '';
            ?>
            <div class="rmbz-svx-card rmbz-svx-<?php echo esc_attr($status); ?>">
                <div class="rmbz-svx-head">
                    <?php /* [1.5.162] Ícone agora é SVG oficial via helper.
                       Antes era emoji com background hex (ex: '🎬' sobre #FF0000).
                       Agora o SVG já tem cores próprias da marca e melhor aspecto. */ ?>
                    <span class="rmbz-svx-icon"><?php
                        if ( function_exists('rmbz_service_logo') && ! empty($svc['logo']) ) {
                            echo rmbz_service_logo( $svc['logo'], ['size' => 38] );
                        } else {
                            // Fallback se o ficheiro de logos não estiver carregado
                            echo '<span style="background:' . esc_attr($svc['color']) . '; width:100%; height:100%; border-radius:50%; display:block;"></span>';
                        }
                    ?></span>
                    <div>
                        <strong class="rmbz-svx-name"><?php echo esc_html($svc['label']); ?></strong>
                        <div class="rmbz-svx-status-line">
                            <?php if ( $status === 'requested' ): ?>
                                <span class="rmbz-svx-badge rmbz-svx-badge-pending">⏳ Pedido em análise</span>
                            <?php elseif ( $status === 'approved' ): ?>
                                <span class="rmbz-svx-badge rmbz-svx-badge-ok">✅ Aprovado — monetização ativa</span>
                            <?php elseif ( $status === 'rejected' ): ?>
                                <span class="rmbz-svx-badge rmbz-svx-badge-rej">❌ Pedido não aprovado</span>
                            <?php elseif ( $status === 'conflict' ): ?>
                                <span class="rmbz-svx-badge rmbz-svx-badge-conf">⚠️ Conflito detectado — ação necessária</span>
                            <?php endif; ?>
                        </div>
                    </div>
                </div>

                <div class="rmbz-svx-body">
                    <?php if ( $status === 'requested' ): ?>
                        <p>O seu pedido para este serviço está a ser revisto pela nossa equipa. Normalmente respondemos em 1–3 dias úteis. Será notificado quando houver decisão.</p>

                    <?php elseif ( $status === 'approved' ): ?>
                        <p><?php echo esc_html($svc['desc_on']); ?></p>
                        <?php if ( $note ): ?>
                            <p class="rmbz-svx-note">💬 <strong>Nota da equipa:</strong> <?php echo esc_html($note); ?></p>
                        <?php endif; ?>

                        <?php
                        // [1.6.117.8] APENAS para YouTube Content ID:
                        // mostrar botão "Pedir remoção de claim" e histórico
                        // de pedidos anteriores DENTRO do card.
                        if ( $key === 'yt_content_id' && function_exists( 'rmbz_contentid_render_inline' ) ) {
                            rmbz_contentid_render_inline( $release );
                        }
                        ?>

                    <?php elseif ( $status === 'rejected' ): ?>
                        <p>O seu pedido para este serviço não foi aprovado.</p>
                        <?php if ( $note ): ?>
                            <p class="rmbz-svx-note rmbz-svx-note-rej">❌ <strong>Motivo:</strong> <?php echo esc_html($note); ?></p>
                        <?php endif; ?>
                        <p style="font-size:13px; color:var(--rmbz-text-muted, #aaa); margin-top:8px;">
                            Se corrigir o que foi apontado, pode criar um novo lançamento ou contactar a equipa via notificação.
                        </p>

                    <?php elseif ( $status === 'conflict' ): ?>
                        <p style="margin-top:0;">
                            Ao verificar o seu pedido, detectámos que esta música parece <strong>já estar registada noutro distribuidor ou titular</strong>.
                            Não podemos avançar com o registo neste serviço porque causaria um conflito de propriedade na plataforma e pode resultar em sanções automáticas na sua conta.
                        </p>

                        <div class="rmbz-svx-conflict-box">
                            <?php if ( $note ): ?>
                                <div class="rmbz-svx-conflict-field">
                                    <span class="rmbz-svx-conflict-label">Descrição</span>
                                    <span class="rmbz-svx-conflict-val"><?php echo esc_html($note); ?></span>
                                </div>
                            <?php endif; ?>
                            <?php if ( $conflict_src ): ?>
                                <div class="rmbz-svx-conflict-field">
                                    <span class="rmbz-svx-conflict-label">Distribuidor / titular suspeito</span>
                                    <span class="rmbz-svx-conflict-val"><?php echo esc_html($conflict_src); ?></span>
                                </div>
                            <?php endif; ?>
                            <?php if ( $conflict_url ): ?>
                                <div class="rmbz-svx-conflict-field">
                                    <span class="rmbz-svx-conflict-label">Evidência</span>
                                    <a class="rmbz-svx-conflict-val rmbz-svx-conflict-link" href="<?php echo esc_url($conflict_url); ?>" target="_blank" rel="noopener noreferrer"><?php echo esc_html($conflict_url); ?> ↗</a>
                                </div>
                            <?php endif; ?>
                        </div>

                        <p style="margin-top:12px; font-size:13px; color:var(--rmbz-text-secondary, #ddd);">
                            <strong>O que fazer?</strong> Se você é o verdadeiro titular exclusivo desta música:
                        </p>
                        <ol style="font-size:13px; color:var(--rmbz-text-secondary, #ccc); line-height:1.6; padding-left:20px;">
                            <li>Contacte a equipa 1MZ através da área de Notificações com provas da sua titularidade (contrato, ficheiros originais, etc.).</li>
                            <li>Se a música está registada por outro distribuidor em seu nome sem autorização, pede-lhes o takedown.</li>
                            <li>Quando o conflito estiver resolvido, podemos reabrir o pedido.</li>
                        </ol>
                    <?php endif; ?>
                </div>
            </div>
            <?php endforeach; ?>
        </div>

        <style>
        /* [1.5.160] Refactor para usar Design Tokens em vez de cores hardcoded.
           Cada cor tem fallback (var(--token, #fallback)) para resiliência —
           se o DS não carregar, o fallback mantém o aspecto correcto. */
        .rmbz-svx-list { display:flex; flex-direction:column; gap:14px; margin-top:14px; }
        .rmbz-svx-card {
            background:var(--rmbz-bg-surface, #1a1a1a);
            border:1px solid var(--rmbz-border-subtle, #2a2a2a);
            border-radius:var(--rmbz-radius-md, 10px);
            padding:18px 20px;
        }
        .rmbz-svx-card.rmbz-svx-approved  { border-left:4px solid var(--rmbz-success, #10b981); }
        .rmbz-svx-card.rmbz-svx-requested { border-left:4px solid var(--rmbz-warning, #f59e0b); }
        .rmbz-svx-card.rmbz-svx-rejected  { border-left:4px solid var(--rmbz-danger, #ef4444); }
        .rmbz-svx-card.rmbz-svx-conflict  {
            border-left:4px solid var(--rmbz-warning-strong, #d97706);
            background:linear-gradient(180deg, #1f1a14 0%, var(--rmbz-bg-surface, #1a1a1a) 100%);
        }
        .rmbz-svx-head { display:flex; gap:14px; align-items:center; margin-bottom:10px; }
        .rmbz-svx-icon {
            /* [1.5.162] Wrapper agora apenas constrange tamanho e centra o SVG.
               O SVG do logo já tem cores próprias da marca, não precisa de
               background no span. Removido font-size que era para os emojis. */
            width:38px; height:38px;
            display:inline-flex; align-items:center; justify-content:center;
            flex-shrink:0;
            overflow:hidden; /* segurança contra SVGs com viewBox excêntrico */
        }
        .rmbz-svx-icon svg {
            display: block;
            width: 100%;
            height: 100%;
            border-radius: 50%; /* uniforme para todos os logos */
        }
        .rmbz-svx-name {
            font-size:15px;
            color:var(--rmbz-text-primary, #fff);
            display:block; margin-bottom:3px;
        }
        .rmbz-svx-status-line { font-size:13px; }
        .rmbz-svx-badge {
            display:inline-block; padding:3px 10px;
            border-radius:12px; font-size:11px;
            font-weight:600; letter-spacing:0.2px;
        }
        .rmbz-svx-badge-ok {
            background:var(--rmbz-success-soft, rgba(16,185,129,0.15));
            color:var(--rmbz-success, #10b981);
            border:1px solid var(--rmbz-success, rgba(16,185,129,0.3));
        }
        .rmbz-svx-badge-pending {
            background:var(--rmbz-warning-soft, rgba(245,158,11,0.15));
            color:var(--rmbz-warning, #f59e0b);
            border:1px solid var(--rmbz-warning, rgba(245,158,11,0.3));
        }
        .rmbz-svx-badge-rej {
            background:var(--rmbz-danger-soft, rgba(239,68,68,0.15));
            color:var(--rmbz-danger, #ef4444);
            border:1px solid var(--rmbz-danger, rgba(239,68,68,0.3));
        }
        .rmbz-svx-badge-conf {
            background:rgba(230,126,34,0.18);
            color:#f5a865;
            border:1px solid rgba(230,126,34,0.4);
        }
        .rmbz-svx-body {
            color:var(--rmbz-text-secondary, #ccc);
            font-size:14px; line-height:1.6;
        }
        .rmbz-svx-body p { margin:8px 0; }
        .rmbz-svx-note {
            background:rgba(255,255,255,0.03);
            border-left:3px solid var(--rmbz-border-strong, #444);
            padding:8px 12px; border-radius:4px; font-size:13px;
        }
        .rmbz-svx-note-rej { border-left-color:var(--rmbz-danger, #ef4444); }
        .rmbz-svx-conflict-box {
            background:rgba(230,126,34,0.06);
            border:1px solid rgba(230,126,34,0.25);
            border-radius:8px; padding:14px 16px; margin-top:10px;
        }
        .rmbz-svx-conflict-field {
            display:grid; grid-template-columns:220px 1fr;
            gap:12px; padding:6px 0;
            border-bottom:1px dashed rgba(230,126,34,0.15);
        }
        .rmbz-svx-conflict-field:last-child { border-bottom:none; }
        .rmbz-svx-conflict-label {
            color:#f5a865; font-size:11px;
            text-transform:uppercase; letter-spacing:0.5px; font-weight:600;
        }
        .rmbz-svx-conflict-val {
            color:var(--rmbz-text-primary, #fff);
            font-size:13px; word-break:break-word;
        }
        .rmbz-svx-conflict-link { color:#ffa855; text-decoration:underline; }
        .rmbz-svx-conflict-link:hover { color:#ffbd7d; }
        @media (max-width:700px) {
            .rmbz-svx-conflict-field { grid-template-columns:1fr; gap:2px; }
        }
        </style>
        <?php endif; ?>

        <?php
        // [1.6.117] Secção Content ID — só aparece em releases LIVE.
        // A função própria valida o estado; aqui só chamamos.
        if ( function_exists( 'rmbz_contentid_render_section' ) ) {
            rmbz_contentid_render_section( $release, $tracks );
        }
        ?>

    </div>

    <style>
    /* ============================================================================
     * SINGLE VIEW V2 — LAYOUT DESKTOP PROFISSIONAL
     * Antes: tudo numa coluna estreita, parecia mobile esticado.
     * Agora: hero grande (capa 240px), tipografia maior, grids de 2 colunas
     * para Links/Perfis quando há espaço, spacing generoso entre secções.
     * ============================================================================ */

    /* ------------------------------------------------------------------------
     * Container — herda full-bleed e estilos base do distribution.css global.
     * Aqui só definimos cor/fonte (já vem do .distro-single-view).
     * ------------------------------------------------------------------------ */
    .rmbz-sv2 {
        color: var(--rmbz-text-primary, #fff);
        /* [1.5.160] Fonte de body do DS (Geist) — fallback para system fonts */
        font-family: var(--rmbz-font-body, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);
    }

    .rmbz-sv2-back { margin-bottom: 20px; }
    .rmbz-sv2-back a { color: var(--rmbz-text-muted, #aaa); text-decoration: none; font-size: 14px; padding: 8px 14px; border: 1px solid #333; border-radius: 6px; display: inline-block; transition: all 0.15s; }
    .rmbz-sv2-back a:hover { color: var(--rmbz-brand, #f0b90b); border-color: var(--rmbz-brand, #f0b90b); background: rgba(240,185,11,0.05); }

    /* HERO — capa grande + info detalhada */
    .rmbz-sv2-hero {
        display: grid;
        grid-template-columns: 280px 1fr;
        gap: 36px;
        margin-bottom: 32px;
        background: linear-gradient(135deg, #1a1a1a 0%, #161616 100%);
        border: 1px solid var(--rmbz-border-subtle, #2a2a2a);
        border-radius: 12px;
        padding: 32px;
        align-items: start;
    }
    @media (max-width: 900px) { .rmbz-sv2-hero { grid-template-columns: 200px 1fr; gap: 24px; padding: 22px; } }
    @media (max-width: 700px) { .rmbz-sv2-hero { grid-template-columns: 1fr; text-align: center; padding: 20px; } }

    .rmbz-sv2-cover img {
        width: 100%;
        max-width: 280px;
        height: auto;
        aspect-ratio: 1/1;
        object-fit: cover;
        border-radius: 10px;
        box-shadow: 0 8px 30px rgba(0,0,0,0.6);
        display: block;
        margin: 0 auto;
    }

    .rmbz-sv2-info { min-width: 0; padding-top: 4px; }
    .rmbz-sv2-title {
        font-size: 42px;
        font-weight: 700;
        color: var(--rmbz-text-primary, #fff);
        margin: 0 0 10px 0;
        line-height: 1.1;
        /* [1.5.160] Usa fonte de display do DS (Bricolage Grotesque)
           para identidade visual consistente com o resto da plataforma. */
        font-family: var(--rmbz-font-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);
        /* Sintaxe correcta para quebra de palavras longas em todos os browsers.
           "word-break: break-word" era sintaxe não-standard que vários browsers
           ignoram. A combinação overflow-wrap:anywhere + word-break:normal
           é a forma moderna e funciona em Safari, Firefox, Chrome. */
        overflow-wrap: anywhere;
        word-break: normal;
        hyphens: auto;
        letter-spacing: -0.8px;
        /* Garantia extra contra overflow do container pai */
        max-width: 100%;
    }
    @media (max-width: 900px) { .rmbz-sv2-title { font-size: 32px; } }
    @media (max-width: 700px) { .rmbz-sv2-title { font-size: 24px; letter-spacing: -0.4px; } }
    @media (max-width: 480px) { .rmbz-sv2-title { font-size: 20px; letter-spacing: -0.2px; } }
    .rmbz-sv2-artist { color: var(--rmbz-text-muted, #aaa); margin: 0 0 22px 0; font-size: 17px; }
    .rmbz-sv2-artist strong { color: var(--rmbz-brand, #f0b90b); font-weight: 600; }

    .rmbz-sv2-meta {
        display: flex;
        flex-wrap: wrap;
        gap: 10px 14px;
        margin-bottom: 26px;
        font-size: 14px;
        color: var(--rmbz-text-secondary, #ccc);
    }
    @media (max-width: 700px) { .rmbz-sv2-meta { justify-content: center; } }
    .rmbz-sv2-meta span {
        white-space: nowrap;
        background: rgba(255,255,255,0.04);
        padding: 7px 13px;
        border-radius: 5px;
        border: 1px solid rgba(255,255,255,0.06);
    }

    .rmbz-sv2-actions { display: flex; flex-wrap: wrap; gap: 10px; }
    @media (max-width: 700px) { .rmbz-sv2-actions { justify-content: center; } }

    .rmbz-sv2-btn {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        padding: 12px 22px;
        border-radius: 7px;
        font-size: 13px;
        font-weight: 600;
        text-transform: uppercase;
        letter-spacing: 0.4px;
        cursor: pointer;
        text-decoration: none;
        transition: all 0.15s;
        border: 1px solid;
        white-space: nowrap;
    }
    .rmbz-sv2-btn.primary { background: var(--rmbz-brand, #f0b90b); color: #000; border-color: var(--rmbz-brand, #f0b90b); }
    .rmbz-sv2-btn.primary:hover { background: #d4a000; border-color: #d4a000; transform: translateY(-1px); }
    .rmbz-sv2-btn.secondary { background: transparent; color: var(--rmbz-text-primary, #fff); border-color: var(--rmbz-border-strong, #555); }
    .rmbz-sv2-btn.secondary:hover { border-color: var(--rmbz-brand, #f0b90b); color: var(--rmbz-brand, #f0b90b); }
    .rmbz-sv2-btn.danger { background: transparent; color: var(--rmbz-danger, #ef4444); border-color: var(--rmbz-danger, #ef4444); }
    .rmbz-sv2-btn.danger:hover { background: rgba(231,76,60,0.1); transform: translateY(-1px); }
    .rmbz-sv2-btn.ghost-warn { background: rgba(240,185,11,0.08); color: var(--rmbz-brand, #f0b90b); border-color: rgba(240,185,11,0.3); cursor: default; }
    .rmbz-sv2-btn.ghost-removed { background: rgba(136,136,136,0.12); color: #999; border-color: rgba(136,136,136,0.4); cursor: default; }

    /* ============================================================================
     * LAYOUT 2 COLUNAS — Links da Loja | Perfis de Artistas
     * Override aos defaults do distribution.css que eram repeat(auto-fit, 300px)
     * — não funcionam bem em 1200px porque cada card fica enorme.
     * ============================================================================ */
    .rmbz-sv2 .section-title {
        font-size: 20px;
        color: var(--rmbz-text-primary, #fff);
        margin: 32px 0 16px 0;
        border-bottom: 1px solid var(--rmbz-border-subtle, #333);
        padding-bottom: 12px;
        font-weight: 600;
        letter-spacing: -0.2px;
    }

    .rmbz-sv2-two-col {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: 28px;
        margin-bottom: 12px;
    }
    @media (max-width: 900px) {
        .rmbz-sv2-two-col { grid-template-columns: 1fr; gap: 0; }
    }
    .rmbz-sv2-col h3.section-title { margin-top: 0; }

    /* LINKS DA LOJA — substitui o links-grid global do distribution.css */
    .rmbz-sv2 .links-grid {
        display: flex;
        flex-direction: column;
        gap: 10px;
        margin-bottom: 0;
    }
    .rmbz-sv2 .link-box {
        background: var(--rmbz-bg-surface, #1a1a1a);
        border: 1px solid var(--rmbz-border-subtle, #2a2a2a);
        border-radius: 8px;
        padding: 14px 18px;
        transition: border-color 0.15s;
    }
    .rmbz-sv2 .link-box.lb-has { border-color: rgba(46,204,113,0.25); }
    .rmbz-sv2 .link-box.lb-empty { opacity: 0.65; }
    .rmbz-sv2 .lb-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        font-size: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        color: var(--rmbz-text-muted, #888);
        margin-bottom: 6px;
        font-weight: 600;
    }
    .rmbz-sv2 .lb-header .copy-icon {
        cursor: pointer;
        font-style: normal;
        font-size: 14px;
        padding: 4px 8px;
        border-radius: 4px;
        transition: all 0.12s;
        background: rgba(255,255,255,0.05);
    }
    .rmbz-sv2 .lb-header .copy-icon:hover { background: rgba(240,185,11,0.15); color: var(--rmbz-brand, #f0b90b); }
    .rmbz-sv2 .lb-val {
        font-size: 13px;
        color: var(--rmbz-text-secondary, #ddd);
        word-break: break-all;
        font-family: -apple-system, monospace;
    }
    .rmbz-sv2 .lb-val a { color: var(--rmbz-brand, #f0b90b); text-decoration: none; }
    .rmbz-sv2 .lb-val a:hover { text-decoration: underline; }

    /* PERFIS DE ARTISTAS — também substitui profiles-grid do css global */
    .rmbz-sv2 .profiles-grid {
        display: flex;
        flex-direction: column;
        gap: 10px;
        margin-bottom: 0;
    }
    .rmbz-sv2 .profile-card {
        display: grid;
        grid-template-columns: 44px 1fr auto;
        gap: 14px;
        align-items: center;
        background: var(--rmbz-bg-surface, #1a1a1a);
        border: 1px solid var(--rmbz-border-subtle, #2a2a2a);
        border-radius: 8px;
        padding: 14px 18px;
    }
    .rmbz-sv2 .pc-icon {
        width: 44px;
        height: 44px;
        border-radius: 8px;
        font-size: 22px;
    }
    .rmbz-sv2 .pc-info strong { display: block; font-size: 15px; color: var(--rmbz-text-primary, #fff); margin-bottom: 2px; }
    .rmbz-sv2 .pc-info small { font-size: 12px; color: var(--rmbz-text-muted, #888); }
    .rmbz-sv2 .pc-actions a {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 36px;
        height: 36px;
        border-radius: 6px;
        background: rgba(255,255,255,0.06);
        font-size: 16px;
        transition: all 0.12s;
    }
    .rmbz-sv2 .pc-actions a:hover { background: rgba(240,185,11,0.15); color: var(--rmbz-brand, #f0b90b); }

    /* DETALHES — tabela full width com 4 colunas em desktop */
    .rmbz-sv2 .details-table-grid {
        display: grid;
        grid-template-columns: repeat(4, 1fr);
        background: var(--rmbz-bg-surface, #1a1a1a);
        border: 1px solid var(--rmbz-border-subtle, #2a2a2a);
        border-radius: 8px;
        margin-bottom: 12px;
        overflow: hidden;
    }
    @media (max-width: 900px) { .rmbz-sv2 .details-table-grid { grid-template-columns: repeat(2, 1fr); } }
    @media (max-width: 600px) { .rmbz-sv2 .details-table-grid { grid-template-columns: 1fr; } }
    .rmbz-sv2 .dt-cell {
        padding: 18px 20px;
        border-right: 1px solid #2a2a2a;
        border-bottom: 1px solid #2a2a2a;
    }
    .rmbz-sv2 .dt-cell:nth-child(4n) { border-right: none; }
    @media (max-width: 900px) { .rmbz-sv2 .dt-cell { border-right: 1px solid #2a2a2a; } .rmbz-sv2 .dt-cell:nth-child(2n) { border-right: none; } }
    @media (max-width: 600px) { .rmbz-sv2 .dt-cell { border-right: none; } }
    .rmbz-sv2 .dt-label {
        display: block;
        font-size: 11px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        color: var(--rmbz-text-muted, #888);
        font-weight: 600;
        margin-bottom: 6px;
    }
    .rmbz-sv2 .dt-val { font-size: 15px; color: var(--rmbz-text-primary, #fff); font-weight: 600; }

    /* CTA "Configurar perfis" quando vazio */
    .rmbz-sv2-empty-cta {
        background: var(--rmbz-bg-surface, #1a1a1a);
        border: 1.5px dashed #444;
        border-radius: 10px;
        padding: 32px 20px;
        text-align: center;
        color: var(--rmbz-text-muted, #aaa);
        margin-bottom: 12px;
    }
    .rmbz-sv2-empty-cta p { margin: 0 0 14px 0; font-size: 14px; }
    .rmbz-sv2-empty-cta p:first-child { font-size: 16px; color: var(--rmbz-brand, #f0b90b); font-weight: 600; }

    /* FAIXAS — cards bonitos */
    .rmbz-sv2 .tracks-list-grid { background: transparent; border: none; }
    .rmbz-sv2 .track-row {
        background: var(--rmbz-bg-surface, #1a1a1a);
        border: 1px solid var(--rmbz-border-subtle, #2a2a2a);
        border-radius: 8px;
        padding: 14px 18px;
        margin-bottom: 8px;
    }

    /* Takedown modal */
    .rmbz-td-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.85); z-index: 99999; display: none; align-items: center; justify-content: center; padding: 20px; }
    .rmbz-td-overlay.active { display: flex; }
    .rmbz-td-modal { background: #1f1f1f; border: 1px solid #333; border-radius: 12px; max-width: 520px; width: 100%; max-height: 90vh; overflow-y: auto; color: #eee; }
    .rmbz-td-head { padding: 18px 22px; border-bottom: 1px solid var(--rmbz-border-subtle, #333); display: flex; align-items: center; justify-content: space-between; }
    .rmbz-td-head h3 { margin: 0; font-size: 18px; color: var(--rmbz-text-primary, #fff); }
    .rmbz-td-close { background: none; border: 0; color: var(--rmbz-text-muted, #888); font-size: 22px; cursor: pointer; line-height: 1; }
    .rmbz-td-body { padding: 18px 22px; }
    .rmbz-td-info { background: rgba(231,76,60,0.08); border-left: 3px solid #e74c3c; padding: 12px 14px; border-radius: 4px; margin-bottom: 14px; font-size: 13px; line-height: 1.5; }
    .rmbz-td-info.warning { background: rgba(240,185,11,0.08); border-left-color: var(--rmbz-brand, #f0b90b); }
    .rmbz-td-info.error { background: rgba(231,76,60,0.15); border-left-color: var(--rmbz-danger, #ef4444); color: #ffb3ad; }
    .rmbz-td-info strong { color: var(--rmbz-text-primary, #fff); }
    .rmbz-td-fieldset { margin-bottom: 14px; }
    .rmbz-td-fieldset > label { display: block; font-weight: 600; margin-bottom: 6px; color: var(--rmbz-text-secondary, #ddd); font-size: 13px; }
    .rmbz-td-reason-list label { display: flex; align-items: flex-start; gap: 8px; padding: 8px 10px; border: 1px solid #333; border-radius: 6px; margin-bottom: 4px; cursor: pointer; transition: all 0.12s; font-size: 13px; }
    .rmbz-td-reason-list label:hover { border-color: var(--rmbz-border-strong, #555); background: #252525; }
    .rmbz-td-reason-list input[type=radio]:checked + .rmbz-td-reason-text { color: var(--rmbz-brand, #f0b90b); font-weight: 600; }
    .rmbz-td-reason-list label:has(input:checked) { background: rgba(240,185,11,0.06); border-color: var(--rmbz-brand, #f0b90b); }
    .rmbz-td-textarea { width: 100%; background: var(--rmbz-bg-elevated, #111); border: 1px solid #333; color: var(--rmbz-text-primary, #fff); padding: 10px; border-radius: 6px; font-family: inherit; font-size: 13px; resize: vertical; min-height: 60px; box-sizing: border-box; }
    .rmbz-td-confirm-row { display: flex; align-items: center; gap: 8px; margin: 14px 0; padding: 10px; background: var(--rmbz-bg-elevated, #111); border-radius: 6px; font-size: 13px; }
    .rmbz-td-foot { padding: 14px 22px 18px; border-top: 1px solid #333; display: flex; gap: 8px; justify-content: flex-end; }
    .rmbz-td-feedback { color: #ff7b6e; font-size: 12px; padding: 0 22px 12px; min-height: 16px; }
    </style>

    <!-- Nonce + ajax_url injectados directamente — não dependem do
         wp_localize_script. No frontend público, `ajaxurl` (global do
         wp-admin) NÃO existe, e dependendo do timing do enqueue a var
         `rmbz_distro_vars` também pode não estar disponível. Esta abordagem
         elimina ambos os problemas. -->
    <input type="hidden" id="rmbz-td-nonce" value="<?php echo esc_attr( wp_create_nonce('rmbz_distro_nonce') ); ?>">
    <input type="hidden" id="rmbz-td-ajax-url" value="<?php echo esc_attr( admin_url('admin-ajax.php') ); ?>">

    <!-- Modal de Takedown -->
    <div id="rmbz-td-overlay" class="rmbz-td-overlay" role="dialog" aria-modal="true" aria-labelledby="rmbz-td-title">
        <div class="rmbz-td-modal">
            <div class="rmbz-td-head">
                <h3 id="rmbz-td-title">🗑 Pedir retirada das lojas</h3>
                <button type="button" class="rmbz-td-close" onclick="rmbzCloseTakedownModal()" aria-label="Fechar">×</button>
            </div>
            <div class="rmbz-td-body">

                <div id="rmbz-td-precheck-info" class="rmbz-td-info">A carregar...</div>

                <div id="rmbz-td-form-fields" style="display:none;">
                    <div class="rmbz-td-fieldset">
                        <label>Por que motivo queres retirar este lançamento?</label>
                        <div class="rmbz-td-reason-list">
                            <label>
                                <input type="radio" name="rmbz_td_reason" value="rights">
                                <span class="rmbz-td-reason-text">Direitos de autor / licença expirada</span>
                            </label>
                            <label>
                                <input type="radio" name="rmbz_td_reason" value="metadata_error">
                                <span class="rmbz-td-reason-text">Erro na faixa ou nos dados (metadata)</span>
                            </label>
                            <label>
                                <input type="radio" name="rmbz_td_reason" value="relaunch">
                                <span class="rmbz-td-reason-text">Vou relançar com nova versão</span>
                            </label>
                            <label>
                                <input type="radio" name="rmbz_td_reason" value="collaborator">
                                <span class="rmbz-td-reason-text">Conflito com colaborador</span>
                            </label>
                            <label>
                                <input type="radio" name="rmbz_td_reason" value="other">
                                <span class="rmbz-td-reason-text">Outro motivo (explicar abaixo)</span>
                            </label>
                        </div>
                    </div>

                    <div class="rmbz-td-fieldset">
                        <label for="rmbz-td-text">Detalhes adicionais <small id="rmbz-td-text-hint" style="color:var(--rmbz-text-muted, #888); font-weight:normal;">(opcional)</small></label>
                        <textarea id="rmbz-td-text" class="rmbz-td-textarea" maxlength="1000" placeholder="Ex: o produtor revogou o consentimento; vou re-masterizar..."></textarea>
                    </div>

                    <div class="rmbz-td-confirm-row">
                        <input type="checkbox" id="rmbz-td-confirm">
                        <label for="rmbz-td-confirm" style="margin:0; cursor:pointer;">
                            Entendo que <strong>retirar das lojas pode demorar 7-14 dias</strong> e que vou perder os streams acumulados.
                        </label>
                    </div>
                </div>

            </div>
            <div class="rmbz-td-feedback" id="rmbz-td-feedback"></div>
            <div class="rmbz-td-foot">
                <button type="button" class="rmbz-sv2-btn secondary" onclick="rmbzCloseTakedownModal()">Cancelar</button>
                <button type="button" class="rmbz-sv2-btn danger" id="rmbz-td-submit" disabled
                        onclick="rmbzSubmitTakedown()">Enviar pedido</button>
            </div>
        </div>
    </div>

    <script>
    function copyToClipboard(element) {
        var box = element.closest('.link-box');
        if (!box) return;
        var valBox = box.querySelector('.lb-val');
        if (!valBox) return;
        // Preferir o href se houver <a>, senão usar texto
        var anchor = valBox.querySelector('a');
        var text = anchor ? anchor.getAttribute('href') : valBox.textContent.trim();
        if (!text || text.indexOf('Gerado após distribuição') !== -1) return;
        navigator.clipboard.writeText(text).then(function(){
            element.textContent = '✓';
            setTimeout(function(){ element.textContent = '📄'; }, 1200);
        }).catch(function(){
            alert('Não foi possível copiar.');
        });
    }

    /* ========== TAKEDOWN MODAL ========== */
    var _rmbzTdReleaseId = 0;
    var _rmbzTdEligible  = false;

    function rmbzGetDistroNonce() {
        // 1ª prioridade: hidden input injectado directamente no template.
        // É a forma mais robusta — não depende do enqueue/localize.
        // [1.5.126] Reescrito sem `&&` — WP escapa para &#038; e parte o JS
        // (mesmo bug da 1.5.119 que afectava a modal de splits).
        var hidden = document.getElementById('rmbz-td-nonce');
        if (hidden) { if (hidden.value) return hidden.value; }
        // Fallbacks defensivos
        if (typeof rmbz_distro_vars !== 'undefined') {
            if (rmbz_distro_vars.nonce) return rmbz_distro_vars.nonce;
        }
        if (typeof rmbz_distro !== 'undefined') {
            if (rmbz_distro.nonce) return rmbz_distro.nonce;
        }
        if (typeof rmbzDistro !== 'undefined') {
            if (rmbzDistro.nonce) return rmbzDistro.nonce;
        }
        return '';
    }

    function rmbzGetAjaxUrl() {
        // No frontend público a global `ajaxurl` (do wp-admin) NÃO existe.
        // Lemos do hidden injectado pelo template; só usamos `ajaxurl` se for
        // mesmo o último recurso.
        // [1.5.126] Sem `&&` (ver nota acima).
        var hidden = document.getElementById('rmbz-td-ajax-url');
        if (hidden) { if (hidden.value) return hidden.value; }
        if (typeof rmbz_distro_vars !== 'undefined') {
            if (rmbz_distro_vars.ajax_url) return rmbz_distro_vars.ajax_url;
        }
        if (typeof ajaxurl !== 'undefined') return ajaxurl;
        // Último recurso — assumir caminho standard do WP
        return '/wp-admin/admin-ajax.php';
    }

    function rmbzOpenTakedownModal(releaseId) {
        _rmbzTdReleaseId = parseInt(releaseId, 10);
        if (!_rmbzTdReleaseId) return;

        var overlay = document.getElementById('rmbz-td-overlay');

        // Mover overlay para <body> na primeira abertura. Sem isto, qualquer
        // pai com transform/filter/will-change/contain transforma o
        // position:fixed em relativo ao pai (em vez do viewport), causando
        // que o overlay só cubra parte da página.
        // É inofensivo correr a cada abertura — appendChild move o nó se já
        // existe noutro sítio.
        if (overlay.parentElement !== document.body) {
            document.body.appendChild(overlay);
        }

        overlay.classList.add('active');
        document.getElementById('rmbz-td-feedback').textContent = '';
        document.getElementById('rmbz-td-confirm').checked = false;
        document.getElementById('rmbz-td-text').value = '';
        document.querySelectorAll('input[name="rmbz_td_reason"]').forEach(function(r){ r.checked = false; });
        document.getElementById('rmbz-td-form-fields').style.display = 'none';
        document.getElementById('rmbz-td-submit').disabled = true;

        var info = document.getElementById('rmbz-td-precheck-info');
        info.className = 'rmbz-td-info';
        info.innerHTML = 'A verificar elegibilidade...';

        // Pre-check
        var fd = new FormData();
        fd.append('action', 'rmbz_takedown_precheck');
        fd.append('release_id', _rmbzTdReleaseId);
        fd.append('nonce', rmbzGetDistroNonce());

        fetch(rmbzGetAjaxUrl(), { method: 'POST', body: fd, credentials: 'same-origin' })
            .then(function(r){ return r.json(); })
            .then(function(resp){
                if (!resp || !resp.success) {
                    info.className = 'rmbz-td-info error';
                    // [1.5.126] Sem `&&` (escape WP).
                    var errMsg = 'Erro a verificar elegibilidade.';
                    if (resp) { if (resp.data) { errMsg = resp.data; } }
                    info.innerHTML = '✗ ' + errMsg;
                    _rmbzTdEligible = false;
                    return;
                }
                var d = resp.data;
                _rmbzTdEligible = d.eligible;

                if (!d.eligible) {
                    info.className = 'rmbz-td-info error';
                    info.innerHTML = '⏳ <strong>Ainda não pode pedir takedown.</strong> Faltam <strong>' + d.days_left + ' dia(s)</strong>. ' +
                        'Por política, o takedown só pode ser pedido <strong>' + d.min_days + ' dias</strong> depois do release ficar nas lojas.';
                    document.getElementById('rmbz-td-form-fields').style.display = 'none';
                    document.getElementById('rmbz-td-submit').disabled = true;
                    return;
                }

                // Elegível — mostrar form e (se aplicável) aviso de holdings
                var msg = '<strong>"' + (d.release_title || 'Lançamento') + '"</strong> está elegível para takedown.';
                if (d.has_holdings) {
                    msg += '<br><br>⚠ Aviso: existem <strong>$' + Number(d.holdings_total).toFixed(2) + '</strong> em royalties retidos para colaboradores externos não-registados. Esses valores vão continuar disponíveis para reclamação mesmo depois do takedown — apenas as lojas deixam de gerar receita futura.';
                    info.className = 'rmbz-td-info warning';
                } else {
                    info.className = 'rmbz-td-info';
                }
                info.innerHTML = msg;

                document.getElementById('rmbz-td-form-fields').style.display = 'block';
            })
            .catch(function(){
                info.className = 'rmbz-td-info error';
                info.textContent = '✗ Erro de rede a verificar elegibilidade.';
                _rmbzTdEligible = false;
            });
    }

    function rmbzCloseTakedownModal() {
        document.getElementById('rmbz-td-overlay').classList.remove('active');
    }

    // Habilitar submit quando: elegível + motivo escolhido + (texto se "outro") + checkbox
    function rmbzTdRecheck() {
        if (!_rmbzTdEligible) {
            document.getElementById('rmbz-td-submit').disabled = true;
            return;
        }
        var reason = document.querySelector('input[name="rmbz_td_reason"]:checked');
        var text = document.getElementById('rmbz-td-text').value.trim();
        var confirm = document.getElementById('rmbz-td-confirm').checked;
        var hint = document.getElementById('rmbz-td-text-hint');
        var ok = false;

        // [1.5.126] Sem `&&` (escape WP). Usa if aninhado.
        if (reason) { if (confirm) {
            if (reason.value === 'other') {
                hint.textContent = '(obrigatório, mín. 10 caracteres)';
                hint.style.color = '#f0b90b';
                ok = (text.length >= 10);
            } else {
                hint.textContent = '(opcional)';
                hint.style.color = '#888';
                ok = true;
            }
        } }
        document.getElementById('rmbz-td-submit').disabled = !ok;
    }

    document.addEventListener('change', function(e){
        if (e.target.matches('input[name="rmbz_td_reason"], #rmbz-td-confirm')) rmbzTdRecheck();
    });
    document.addEventListener('input', function(e){
        if (e.target.id === 'rmbz-td-text') rmbzTdRecheck();
    });
    document.addEventListener('keydown', function(e){
        // [1.5.126] Sem `&&` (escape WP). If aninhado.
        if (e.key !== 'Escape') return;
        var overlay = document.getElementById('rmbz-td-overlay');
        if (!overlay) return;
        if (!overlay.classList.contains('active')) return;
        rmbzCloseTakedownModal();
    });

    function rmbzSubmitTakedown() {
        var reason = document.querySelector('input[name="rmbz_td_reason"]:checked');
        if (!reason) return;
        var btn = document.getElementById('rmbz-td-submit');
        var feedback = document.getElementById('rmbz-td-feedback');
        btn.disabled = true;
        btn.textContent = 'A enviar...';
        feedback.style.color = '#ff7b6e';
        feedback.textContent = '';

        var fd = new FormData();
        fd.append('action', 'rmbz_request_takedown');
        fd.append('release_id', _rmbzTdReleaseId);
        fd.append('reason_code', reason.value);
        fd.append('reason', document.getElementById('rmbz-td-text').value.trim());
        fd.append('nonce', rmbzGetDistroNonce());

        fetch(rmbzGetAjaxUrl(), { method: 'POST', body: fd, credentials: 'same-origin' })
            .then(function(r){ return r.json(); })
            .then(function(resp){
                // [1.5.126] Sem `&&` (escape WP).
                var ok = false;
                if (resp) { if (resp.success) { ok = true; } }
                if (ok) {
                    feedback.style.color = '#2ecc71';
                    var msg = 'Pedido enviado.';
                    if (resp.data) { if (resp.data.message) { msg = resp.data.message; } }
                    feedback.textContent = '✓ ' + msg;
                    setTimeout(function(){ location.reload(); }, 1500);
                } else {
                    var err = 'Erro a enviar pedido.';
                    if (resp) { if (resp.data) { err = resp.data; } }
                    feedback.textContent = '✗ ' + err;
                    btn.disabled = false;
                    btn.textContent = 'Enviar pedido';
                }
            })
            .catch(function(){
                feedback.textContent = '✗ Erro de rede.';
                btn.disabled = false;
                btn.textContent = 'Enviar pedido';
            });
    }
    </script>

    <?php
    // [DS 1.5.116] Modal de configuração de splits (só renderiza se o
    // utilizador é owner da release).
    if ( function_exists('rmbz_splits_frontend_render_modal') ) {
        rmbz_splits_frontend_render_modal( $release );
    }

    /* [1.5.144] Hook para módulos externos injectarem conteúdo após o
       single-view (ex: modal de gestão de lojas em distribution-store-requests).
       Passa release_id e user_tel para os hooks fazerem queries. */
    if ( $can_configure_splits ) {
        do_action( 'rmbz_distro_after_single_view', (int) $release->id, $user_telemovel ?? '' );
    }
    ?>
    <?php
}
?>
