<?php
/**
 * includes/distribution/distribution-artist-profiles.php
 *
 * Gere os perfis do artista nas 8 DSPs principais.
 *
 * O QUE RESOLVE:
 *
 *   Antes deste módulo, a single-view dos releases mostrava "Perfis de
 *   artistas — Spotify | Apple Music — Perfil Mapeado" como UI fake (link
 *   "#"). Não havia onde o artista colar o seu perfil real, e os DSPs
 *   muitas vezes têm vários artistas com o mesmo nome — sem o artista
 *   especificar o seu perfil correcto, os royalties podem ser pagos a
 *   outra pessoa.
 *
 * COMO FUNCIONA:
 *
 *   • Tabela nova `rmbz_artist_profiles` guarda 1 linha por (artista, dsp).
 *   • Página dedicada `?distro_action=profiles` para o artista colar/editar
 *     os 8 URLs UMA VEZ (não por release).
 *   • Validação por DSP (cada um tem prefixo URL próprio).
 *   • Os perfis são depois consumidos:
 *       - Pela single-view do release (mostra os perfis confirmados).
 *       - Pelo wizard / submissão (avisa se faltam para os DSPs essenciais).
 *
 * 8 DSPs SUPORTADOS:
 *   spotify, apple_music, youtube_music, amazon_music, deezer, tidal,
 *   tiktok, instagram
 *
 * VALIDAÇÃO:
 *   Cada DSP tem regex que verifica se o URL pertence ao DSP correcto e
 *   é um link de PERFIL (não de música, não de playlist). Se o artista
 *   colar o link de uma faixa em vez do perfil, dá erro útil.
 */

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


/* ============================================================================
 * SCHEMA
 * ============================================================================ */

function rmbz_artist_profiles_maybe_install() {
    $stored = get_option('rmbz_artist_profiles_schema_v', '0');
    if ( version_compare( $stored, '1.0', '<' ) ) {
        global $wpdb;
        $charset_collate = $wpdb->get_charset_collate();
        $sql = "CREATE TABLE {$wpdb->prefix}rmbz_artist_profiles (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            artist_telemovel varchar(20) NOT NULL,
            dsp_slug varchar(40) NOT NULL,
            url varchar(500) NOT NULL,
            artist_id_extracted varchar(80) DEFAULT NULL,
            verified tinyint(1) DEFAULT 0 NOT NULL,
            created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            updated_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            PRIMARY KEY  (id),
            UNIQUE KEY uniq_artist_dsp (artist_telemovel, dsp_slug),
            KEY idx_artist (artist_telemovel)
        ) ENGINE=InnoDB $charset_collate;";
        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );
        update_option('rmbz_artist_profiles_schema_v', '1.0');
    }
}
add_action('admin_init', 'rmbz_artist_profiles_maybe_install', 7);
add_action('init',       'rmbz_artist_profiles_maybe_install', 7);


/* ============================================================================
 * CATÁLOGO DOS 8 DSPs ESSENCIAIS
 * ----------------------------------------------------------------------------
 * Cada entrada tem:
 *   - name       : nome bonito para mostrar
 *   - icon       : emoji simples (sem dependências)
 *   - color      : cor da pill
 *   - regex      : valida que URL é do DSP CORRECTO + é PERFIL (não música)
 *   - extract    : grupo do regex que captura o ID/handle do artista
 *   - example    : URL exemplo para o placeholder
 *   - hint       : ajuda contextual ao artista
 *   - essential  : se é obrigatório (avisa se faltar)
 * ============================================================================ */

function rmbz_artist_profiles_catalog() {
    return [
        'spotify' => [
            'name'      => 'Spotify',
            'icon'      => '🎧',
            'color'     => '#1DB954',
            'regex'     => '#^https?://open\.spotify\.com/artist/([A-Za-z0-9]+)(?:[/?].*)?$#',
            'extract'   => 1,
            'example'   => 'https://open.spotify.com/artist/4Z8W4fKeB5YxbusRsdQVPb',
            'hint'      => 'Vai ao Spotify → procura o teu nome → 3 pontos → "Compartilhar" → "Copiar link do artista".',
            'essential' => true,
        ],
        'apple_music' => [
            'name'      => 'Apple Music',
            'icon'      => '🍎',
            'color'     => '#FA243C',
            'regex'     => '#^https?://music\.apple\.com/[a-z]{2}/artist/[^/]+/(\d+)(?:[/?].*)?$#',
            'extract'   => 1,
            'example'   => 'https://music.apple.com/us/artist/ed-sheeran/183313439',
            'hint'      => 'No Apple Music ou iTunes → procura o teu nome → "Compartilhar artista" → "Copiar link".',
            'essential' => true,
        ],
        'youtube_music' => [
            'name'      => 'YouTube Music',
            'icon'      => '▶️',
            'color'     => '#FF0000',
            'regex'     => '#^https?://music\.youtube\.com/channel/([A-Za-z0-9_-]+)(?:[/?].*)?$#',
            'extract'   => 1,
            'example'   => 'https://music.youtube.com/channel/UCqECaJ8Gagnn7YCbPEzWH6g',
            'hint'      => 'No YouTube Music vai ao teu canal → 3 pontos → "Partilhar" → copia o link.',
            'essential' => true,
        ],
        'amazon_music' => [
            'name'      => 'Amazon Music',
            'icon'      => '🛒',
            'color'     => '#FF9900',
            'regex'     => '#^https?://music\.amazon\.[a-z.]+/artists/([A-Z0-9]+)(?:/.*)?$#',
            'extract'   => 1,
            'example'   => 'https://music.amazon.com/artists/B00B96LD2A',
            'hint'      => 'No Amazon Music → procura o teu nome → "Mais opções" → copia o URL.',
            'essential' => false,
        ],
        'deezer' => [
            'name'      => 'Deezer',
            'icon'      => '🎵',
            'color'     => '#a238ff',
            'regex'     => '#^https?://(?:www\.)?deezer\.com/(?:[a-z]{2}/)?artist/(\d+)(?:[/?].*)?$#',
            'extract'   => 1,
            'example'   => 'https://www.deezer.com/us/artist/384236',
            'hint'      => 'No Deezer → vai ao teu perfil → menu → "Partilhar artista" → "Copiar link".',
            'essential' => false,
        ],
        'tidal' => [
            'name'      => 'TIDAL',
            'icon'      => '🌊',
            'color'     => '#000000',
            'regex'     => '#^https?://(?:www\.)?tidal\.com/(?:browse/)?artist/(\d+)(?:[/?].*)?$#',
            'extract'   => 1,
            'example'   => 'https://tidal.com/browse/artist/3514898',
            'hint'      => 'No TIDAL → vai ao teu perfil → 3 pontos → "Partilhar".',
            'essential' => false,
        ],
        'tiktok' => [
            'name'      => 'TikTok',
            'icon'      => '🎬',
            'color'     => '#010101',
            'regex'     => '#^https?://(?:www\.)?tiktok\.com/@([A-Za-z0-9_.]+)(?:[/?].*)?$#',
            'extract'   => 1,
            'example'   => 'https://www.tiktok.com/@nomedoartista',
            'hint'      => 'O teu URL do TikTok é tiktok.com/@nome.',
            'essential' => false,
        ],
        'instagram' => [
            'name'      => 'Instagram',
            'icon'      => '📷',
            'color'     => '#E1306C',
            'regex'     => '#^https?://(?:www\.)?instagram\.com/([A-Za-z0-9_.]+)/?(?:\?.*)?$#',
            'extract'   => 1,
            'example'   => 'https://www.instagram.com/nomedoartista/',
            'hint'      => 'O teu URL do Instagram é instagram.com/nome.',
            'essential' => false,
        ],
    ];
}


/* ============================================================================
 * VALIDADOR
 * ============================================================================ */

/**
 * Valida um URL contra o regex do DSP correspondente.
 *
 * @return array {
 *   valid:    bool
 *   error:    string (se inválido)
 *   id:       string (se válido, o handle/ID extraído)
 * }
 */
function rmbz_artist_profiles_validate( $dsp_slug, $url ) {
    $catalog = rmbz_artist_profiles_catalog();
    if ( ! isset($catalog[$dsp_slug]) ) {
        return [ 'valid' => false, 'error' => 'DSP desconhecido.' ];
    }
    $url = trim( (string) $url );
    if ( $url === '' ) {
        return [ 'valid' => false, 'error' => 'URL vazio.' ];
    }
    if ( strlen($url) > 500 ) {
        return [ 'valid' => false, 'error' => 'URL demasiado longo (máx. 500 caracteres).' ];
    }

    $meta = $catalog[$dsp_slug];
    if ( ! preg_match( $meta['regex'], $url, $m ) ) {
        return [
            'valid' => false,
            'error' => sprintf(
                'URL inválido para %s. Tem de ser do tipo "%s". Cola o URL do PERFIL, não o da música.',
                $meta['name'], $meta['example']
            ),
        ];
    }

    return [
        'valid' => true,
        'id'    => $m[ $meta['extract'] ] ?? '',
    ];
}


/* ============================================================================
 * QUERIES
 * ============================================================================ */

/**
 * Devolve todos os perfis de um artista, indexados por dsp_slug.
 */
function rmbz_artist_profiles_get_all( $artist_telemovel ) {
    if ( empty($artist_telemovel) ) return [];
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_artist_profiles';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t'") !== $t ) return [];

    $rows = $wpdb->get_results( $wpdb->prepare(
        "SELECT * FROM $t WHERE artist_telemovel = %s",
        $artist_telemovel
    ) );
    $out = [];
    foreach ( (array) $rows as $r ) {
        $out[ $r->dsp_slug ] = $r;
    }
    return $out;
}


/* ============================================================================
 * HANDLER AJAX — guardar/limpar perfil
 * ============================================================================ */

function rmbz_artist_profiles_ajax_save() {
    if ( ! check_ajax_referer('rmbz_distro_nonce', 'nonce', false) ) {
        wp_send_json_error('Segurança.', 403);
    }
    if ( ! rmbz_is_user_logged_in() ) wp_send_json_error('Sessão expirada.', 401);

    $telemovel = rmbz_get_current_user_telemovel();
    $dsp       = sanitize_key( $_POST['dsp'] ?? '' );
    $url       = trim( wp_unslash( (string) ($_POST['url'] ?? '') ) );

    $catalog = rmbz_artist_profiles_catalog();
    if ( ! isset($catalog[$dsp]) ) {
        wp_send_json_error('DSP desconhecido.');
    }

    if ( function_exists('rmbz_rate_limit')
         && ! rmbz_rate_limit( 'profile_save_' . $telemovel, 30 ) ) {
        wp_send_json_error('Demasiados pedidos. Aguarda um pouco.', 429);
    }

    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_artist_profiles';

    // Acção CLEAR — apagar perfil existente
    if ( $url === '' ) {
        $wpdb->delete( $t, [
            'artist_telemovel' => $telemovel,
            'dsp_slug'         => $dsp,
        ], [ '%s', '%s' ] );
        wp_send_json_success([
            'cleared' => true,
            'message' => sprintf( 'Perfil de %s removido.', $catalog[$dsp]['name'] ),
        ]);
    }

    // Validar formato
    $result = rmbz_artist_profiles_validate( $dsp, $url );
    if ( ! $result['valid'] ) {
        wp_send_json_error( $result['error'] );
    }

    // Upsert
    $existing = $wpdb->get_var( $wpdb->prepare(
        "SELECT id FROM $t WHERE artist_telemovel = %s AND dsp_slug = %s",
        $telemovel, $dsp
    ) );
    $now = current_time('mysql');

    if ( $existing ) {
        $wpdb->update( $t,
            [
                'url'                 => $url,
                'artist_id_extracted' => $result['id'],
                'updated_at'          => $now,
            ],
            [ 'id' => (int) $existing ],
            [ '%s', '%s', '%s' ], [ '%d' ]
        );
    } else {
        $wpdb->insert( $t, [
            'artist_telemovel'    => $telemovel,
            'dsp_slug'            => $dsp,
            'url'                 => $url,
            'artist_id_extracted' => $result['id'],
            'created_at'          => $now,
            'updated_at'          => $now,
        ], [ '%s', '%s', '%s', '%s', '%s', '%s' ] );
    }

    wp_send_json_success([
        'cleared'      => false,
        'url'          => $url,
        'extracted_id' => $result['id'],
        'message'      => sprintf( 'Perfil de %s guardado.', $catalog[$dsp]['name'] ),
    ]);
}
add_action( 'wp_ajax_rmbz_artist_profile_save',        'rmbz_artist_profiles_ajax_save' );
add_action( 'wp_ajax_nopriv_rmbz_artist_profile_save', 'rmbz_artist_profiles_ajax_save' );


/* ============================================================================
 * UI — Página de perfis (?distro_action=profiles)
 * ============================================================================ */

function rmbz_render_artist_profiles_view( $telemovel ) {
    if ( empty($telemovel) ) {
        echo '<div class="distro-dashboard"><p style="color:#fff;">Sessão inválida.</p></div>';
        return;
    }

    $catalog = rmbz_artist_profiles_catalog();
    $saved   = rmbz_artist_profiles_get_all( $telemovel );

    // Stats — quantos essenciais faltam
    $missing_essential = 0;
    foreach ( $catalog as $slug => $meta ) {
        if ( $meta['essential'] && empty($saved[$slug]) ) $missing_essential++;
    }
    ?>
    <div class="distro-dashboard rmbz-profiles-page rmbz-fullbleed">
        <div class="distro-header">
            <h1>Perfis de Artistas</h1>
            <a href="?distro_action=dashboard" class="back-link">&larr; Voltar ao Painel</a>
        </div>

        <div class="rmbz-profiles-intro">
            <h3>Porque é importante?</h3>
            <p>
                Quando há vários artistas com o mesmo nome nos DSPs, sem o teu perfil
                exacto os royalties podem ir para outra pessoa. Cola aqui os links
                directos do <strong>teu</strong> perfil em cada loja.
            </p>
            <?php if ( $missing_essential > 0 ): ?>
                <div class="rmbz-profiles-warn">
                    ⚠ Tens <strong><?php echo $missing_essential; ?> perfil(is) essencial(is)</strong> por configurar.
                </div>
            <?php else: ?>
                <div class="rmbz-profiles-ok">
                    ✓ Todos os perfis essenciais estão configurados.
                </div>
            <?php endif; ?>
        </div>

        <div class="rmbz-profiles-grid"
             data-nonce="<?php echo esc_attr( wp_create_nonce('rmbz_distro_nonce') ); ?>"
             data-ajax-url="<?php echo esc_attr( admin_url('admin-ajax.php') ); ?>">
            <?php foreach ( $catalog as $slug => $meta ):
                $current = $saved[$slug] ?? null;
                $has = ! empty($current);
            ?>
                <div class="rmbz-profile-card <?php echo $has ? 'has-url' : 'empty'; ?>" data-dsp="<?php echo esc_attr($slug); ?>">
                    <div class="rpc-head">
                        <div class="rpc-icon" style="background:<?php echo esc_attr($meta['color']); ?>20;"><?php
                            // [1.6.118.120] Logótipo REAL (SVG) com fallback ao emoji.
                            $rmbz_logo = function_exists('rmbz_dsp_logo_svg') ? rmbz_dsp_logo_svg($slug, 26) : '';
                            echo $rmbz_logo !== '' ? $rmbz_logo : $meta['icon'];
                        ?></div>
                        <div class="rpc-meta">
                            <strong>
                                <?php echo esc_html($meta['name']); ?>
                                <?php if ( $meta['essential'] ): ?>
                                    <span class="rpc-essential" title="Essencial">★</span>
                                <?php endif; ?>
                            </strong>
                            <small><?php echo esc_html($meta['hint']); ?></small>
                        </div>
                        <div class="rpc-status">
                            <?php if ( $has ): ?>
                                <span class="rpc-pill ok">✓ Configurado</span>
                            <?php elseif ( $meta['essential'] ): ?>
                                <span class="rpc-pill warn">! Em falta</span>
                            <?php else: ?>
                                <span class="rpc-pill neutral">opcional</span>
                            <?php endif; ?>
                        </div>
                    </div>

                    <div class="rpc-form">
                        <input type="url"
                               class="rpc-input"
                               placeholder="<?php echo esc_attr($meta['example']); ?>"
                               value="<?php echo esc_attr( $current->url ?? '' ); ?>"
                               maxlength="500">
                        <button type="button" class="rpc-btn save">💾 Guardar</button>
                        <?php if ( $has ): ?>
                            <button type="button" class="rpc-btn clear" title="Remover este perfil">🗑</button>
                            <a href="<?php echo esc_url($current->url); ?>" target="_blank" rel="noopener" class="rpc-btn open" title="Abrir perfil">↗</a>
                        <?php endif; ?>
                    </div>
                    <div class="rpc-feedback"></div>
                </div>
            <?php endforeach; ?>
        </div>

    </div>

    <style>
    .rmbz-profiles-page { color:#fff; }
    .rmbz-profiles-intro { background:#1a1a1a; border:1px solid #2a2a2a; border-radius:8px; padding:16px 20px; margin-bottom:18px; }
    .rmbz-profiles-intro h3 { margin:0 0 6px 0; color:#fff; font-size:16px; }
    .rmbz-profiles-intro p { color:#bbb; font-size:13px; margin:0 0 10px 0; line-height:1.5; }
    .rmbz-profiles-warn { background:rgba(240,185,11,0.1); border-left:3px solid #f0b90b; padding:10px 14px; border-radius:4px; color:#f0b90b; font-size:13px; }
    .rmbz-profiles-ok { background:rgba(46,204,113,0.08); border-left:3px solid #2ecc71; padding:10px 14px; border-radius:4px; color:#2ecc71; font-size:13px; }

    .rmbz-profiles-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(360px, 1fr)); gap:12px; }
    .rmbz-profile-card { background:#1f1f1f; border:1px solid #333; border-radius:8px; padding:14px 16px; transition:border-color 0.15s; }
    .rmbz-profile-card.has-url { border-color: rgba(46,204,113,0.4); }
    .rmbz-profile-card.empty { border-color:#3a3a3a; }
    .rpc-head { display:flex; align-items:flex-start; gap:12px; margin-bottom:10px; }
    .rpc-icon { width:38px; height:38px; border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:20px; flex-shrink:0; }
    .rpc-meta { flex:1; min-width:0; }
    .rpc-meta strong { display:block; color:#fff; font-size:14px; margin-bottom:3px; }
    .rpc-meta small { color:#888; font-size:11px; line-height:1.4; display:block; }
    .rpc-essential { color:#f0b90b; font-size:11px; margin-left:4px; }
    .rpc-status { flex-shrink:0; }
    .rpc-pill { display:inline-block; padding:3px 8px; border-radius:3px; font-size:10px; font-weight:600; text-transform:uppercase; letter-spacing:0.4px; white-space:nowrap; }
    .rpc-pill.ok { background:rgba(46,204,113,0.15); color:#2ecc71; }
    .rpc-pill.warn { background:rgba(240,185,11,0.15); color:#f0b90b; }
    .rpc-pill.neutral { background:rgba(136,136,136,0.15); color:#999; }

    .rpc-form { display:flex; gap:6px; align-items:stretch; }
    .rpc-input { flex:1; min-width:0; background:#111; border:1px solid #333; color:#fff; padding:8px 10px; border-radius:5px; font-family:monospace; font-size:11px; box-sizing:border-box; }
    .rpc-input:focus { outline:none; border-color:#f0b90b; }
    .rpc-btn { padding:8px 12px; border:1px solid #333; background:#222; color:#fff; border-radius:5px; cursor:pointer; font-size:12px; white-space:nowrap; transition:all 0.12s; text-decoration:none; display:inline-flex; align-items:center; }
    .rpc-btn:hover { border-color:#f0b90b; color:#f0b90b; }
    .rpc-btn.save { background:#f0b90b; color:#000; border-color:#f0b90b; font-weight:600; }
    .rpc-btn.save:hover { background:#d4a000; color:#000; }
    .rpc-btn.clear:hover { border-color:#e74c3c; color:#e74c3c; }
    .rpc-feedback { margin-top:6px; font-size:11px; min-height:14px; }
    .rpc-feedback.success { color:#2ecc71; }
    .rpc-feedback.error { color:#e74c3c; }
    </style>

    <script>
    (function(){
        var grid = document.querySelector('.rmbz-profiles-grid');
        var ajaxUrl = (grid && grid.getAttribute('data-ajax-url'))
                      || (typeof ajaxurl !== 'undefined' ? ajaxurl : '/wp-admin/admin-ajax.php');
        var nonceVal = (grid && grid.getAttribute('data-nonce')) || '';

        function ajaxSave(card, dsp, url) {
            var feedback = card.querySelector('.rpc-feedback');
            var saveBtn = card.querySelector('.rpc-btn.save');
            saveBtn.disabled = true;
            saveBtn.textContent = '...';
            feedback.className = 'rpc-feedback';
            feedback.textContent = '';

            var fd = new FormData();
            fd.append('action', 'rmbz_artist_profile_save');
            fd.append('dsp', dsp);
            fd.append('url', url);
            fd.append('nonce', nonceVal);

            fetch(ajaxUrl, { method: 'POST', body: fd, credentials: 'same-origin' })
                .then(function(r){ return r.json(); })
                .then(function(resp){
                    saveBtn.disabled = false;
                    saveBtn.textContent = '💾 Guardar';
                    if (resp && resp.success) {
                        feedback.className = 'rpc-feedback success';
                        feedback.textContent = '✓ ' + (resp.data.message || 'Guardado.');
                        setTimeout(function(){ location.reload(); }, 700);
                    } else {
                        feedback.className = 'rpc-feedback error';
                        feedback.textContent = '✗ ' + (resp && resp.data ? resp.data : 'Erro a guardar.');
                    }
                })
                .catch(function(){
                    saveBtn.disabled = false;
                    saveBtn.textContent = '💾 Guardar';
                    feedback.className = 'rpc-feedback error';
                    feedback.textContent = '✗ Erro de rede.';
                });
        }

        document.querySelectorAll('.rmbz-profile-card').forEach(function(card){
            var dsp = card.getAttribute('data-dsp');
            var input = card.querySelector('.rpc-input');
            var saveBtn = card.querySelector('.rpc-btn.save');
            var clearBtn = card.querySelector('.rpc-btn.clear');

            saveBtn.addEventListener('click', function(){
                ajaxSave(card, dsp, input.value.trim());
            });
            input.addEventListener('keydown', function(e){
                if (e.key === 'Enter') { e.preventDefault(); saveBtn.click(); }
            });
            if (clearBtn) {
                clearBtn.addEventListener('click', function(){
                    if ( ! confirm('Remover este perfil?') ) return;
                    input.value = '';
                    ajaxSave(card, dsp, '');
                });
            }
        });
    })();
    </script>
    <?php
}
