<?php
/**
 * IMZ Artist Profiles — v4 (Corrigido)
 * Sistema de Perfis de Artistas — CPT, admin meta boxes, card frontend, outras músicas
 *
 * Correcções v4:
 * - N+1 queries resolvido com batch loading de artistas
 * - Bug array_pop no "Ver mais" URL corrigido
 * - Invalidação de transient completa (inclui feats removidos)
 * - Contraste do nome do artista garantido (WCAG AA)
 * - Ícones SVG em vez de emojis para consistência cross-platform
 * - Cor dominante com cache inteligente (só recalcula quando thumbnail muda)
 * - Extracção de cor melhorada com fallback robusto
 */

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

// =============================================================================
// 1. CPT: imz_artista
// =============================================================================

function imz_register_artista_cpt() {
    register_post_type('imz_artista', [
        'labels' => [
            'name'               => 'Art Tracks',
            'singular_name'      => 'Art Track',
            'menu_name'          => 'Art Tracks',
            'add_new'            => 'Criar Art Track',
            'add_new_item'       => 'Criar novo Art Track',
            'edit_item'          => 'Editar Art Track',
            'all_items'          => 'Todos os Art Tracks',
            'search_items'       => 'Pesquisar Art Tracks',
            'not_found'          => 'Nenhum Art Track encontrado.',
        ],
        'public'             => false,
        'show_ui'            => false,
        'show_in_menu'       => false,
        'show_in_rest'       => false,
        'supports'           => ['title', 'thumbnail'],
        'menu_icon'          => 'dashicons-microphone',
        'has_archive'        => false,
    ]);
}
add_action('init', 'imz_register_artista_cpt');

add_filter('enter_title_here', function($title, $post) {
    return $post && $post->post_type === 'imz_artista' ? 'Nome artístico do Art Track' : $title;
}, 10, 2);


// =============================================================================
// 2. META BOX — Dados do Artista (admin)
// =============================================================================

function imz_artista_meta_boxes() {
    add_meta_box(
        'imz_artista_details',
        'Detalhes do Artista',
        'imz_render_artista_details_box',
        'imz_artista',
        'normal',
        'high'
    );
    add_meta_box(
        'imz_artista_photo',
        'Foto / Cor de Destaque',
        'imz_render_artista_photo_box',
        'imz_artista',
        'side',
        'high'
    );
    add_meta_box(
        'imz_artista_catalog',
        'Catálogo deste Art Track',
        'imz_render_art_track_catalog_box',
        'imz_artista',
        'normal',
        'default'
    );
}
add_action('add_meta_boxes', 'imz_artista_meta_boxes');

function imz_render_artista_details_box($post) {
    wp_nonce_field('imz_save_artista_meta', 'imz_artista_nonce');

    $bio        = get_post_meta($post->ID, '_imz_artista_bio', true);
    $instagram  = get_post_meta($post->ID, '_imz_artista_instagram', true);
    $tiktok     = get_post_meta($post->ID, '_imz_artista_tiktok', true);
    $youtube    = get_post_meta($post->ID, '_imz_artista_youtube', true);
    $facebook   = get_post_meta($post->ID, '_imz_artista_facebook', true);
    $spotify    = get_post_meta($post->ID, '_imz_artista_spotify', true);
    $whatsapp   = get_post_meta($post->ID, '_imz_artista_whatsapp', true);
    $genero     = get_post_meta($post->ID, '_imz_artista_genero', true);
    $pais       = get_post_meta($post->ID, '_imz_artista_pais', true);
    $verified   = get_post_meta($post->ID, '_imz_artista_verified', true);
    $linked_user = get_post_meta($post->ID, '_imz_artista_linked_user_id', true);
    $account_phone = get_post_meta($post->ID, '_imz_artista_account_phone', true);
    $account_email = get_post_meta($post->ID, '_imz_artista_account_email', true);
    ?>
    <style>
    .imz-artista-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
    .imz-artista-grid .full { grid-column: 1 / -1; }
    .imz-artista-field label { display: block; font-weight: 600; margin-bottom: 4px; font-size: 13px; }
    .imz-artista-field input, .imz-artista-field textarea, .imz-artista-field select {
        width: 100%; padding: 8px 10px; border: 1px solid #ddd; border-radius: 5px; font-size: 13px; box-sizing: border-box;
    }
    .imz-artista-field textarea { resize: vertical; min-height: 70px; }
    .imz-social-icon { font-size: 16px; margin-right: 4px; }
    .imz-verified-box { background: #f0f7ff; border: 1px solid #bdd7f1; border-radius: 8px; padding: 14px; }
    .imz-verified-box label { display: flex; align-items: center; gap: 8px; cursor: pointer; }
    .imz-verified-box .description { font-size: 11px; color: #666; margin-top: 6px; }
    .imz-auto-verified { display: inline-block; background: #d4edda; color: #155724; padding: 3px 10px; border-radius: 12px; font-size: 11px; font-weight: 600; margin-left: 8px; }
    </style>
    <div class="imz-artista-grid">
        <!-- Verificação e Vinculação -->
        <div class="imz-artista-field full">
            <div class="imz-verified-box">
                <label>
                    <input type="checkbox" name="imz_artista_verified" value="1" <?php checked($verified, '1'); ?>>
                    <strong>✅ Artista Verificado (manual)</strong>
                </label>
                <p class="description">Marcar manualmente este artista como verificado. O selo azul aparecerá ao lado do nome.</p>
                <?php
                // Mostrar estado de auto-verificação
                if ($linked_user && imz_is_artista_auto_verified($post->ID)) {
                    echo '<span class="imz-auto-verified">✓ Auto-verificado via conta vinculada</span>';
                }
                ?>
            </div>
        </div>
        <div class="imz-artista-field full">
            <label>Conta 1MZ For Artists</label>
            <?php if (defined('RMBZ_ARTISTS_EMBEDDED')): ?>
                <?php
                $linked_account = $linked_user ? get_user_by('id', $linked_user) : null;
                $linked_phone = $linked_user ? get_user_meta($linked_user, '_rmbz_artist_telemovel', true) : '';
                ?>
                <div style="border:1px solid <?php echo $linked_account ? '#86efac' : '#f3d37a'; ?>;background:<?php echo $linked_account ? '#f0fdf4' : '#fffbeb'; ?>;border-radius:10px;padding:12px 14px;margin-bottom:12px;">
                    <strong style="display:block;color:<?php echo $linked_account ? '#166534' : '#854d0e'; ?>;">
                        <?php echo $linked_account ? 'Conta vinculada' : 'A aguardar criação ou vínculo da conta'; ?>
                    </strong>
                    <span style="font-size:12px;color:#64748b;">
                        <?php echo $linked_account ? esc_html(($linked_account->display_name ?: 'Artista 1MZ') . ($linked_phone ? ' · ' . $linked_phone : '')) : 'Guarda o telefone ou email que o artista usará na 1MZ. O vínculo será automático.'; ?>
                    </span>
                </div>
                <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
                    <div>
                        <label for="imz_artista_account_phone">Telemóvel previsto</label>
                        <input id="imz_artista_account_phone" type="tel" name="imz_artista_account_phone" value="<?php echo esc_attr($account_phone); ?>" placeholder="Ex: +258 84 000 0000">
                    </div>
                    <div>
                        <label for="imz_artista_account_email">Email previsto</label>
                        <input id="imz_artista_account_email" type="email" name="imz_artista_account_email" value="<?php echo esc_attr($account_email); ?>" placeholder="artista@exemplo.com">
                    </div>
                </div>
                <p class="description" style="font-size:11px;color:#64748b;margin-top:8px;">O telemóvel tem prioridade no vínculo. O nome artístico nunca é usado sozinho para entregar músicas.</p>
                <?php if ($linked_account): ?>
                    <label style="display:flex;align-items:center;gap:7px;margin-top:10px;color:#b91c1c;"><input type="checkbox" name="imz_artista_unlink_account" value="1" style="width:auto;"> Desvincular esta conta</label>
                <?php endif; ?>
            <?php else: ?>
            <select name="imz_artista_linked_user_id" style="width:100%;">
                <option value="">— Nenhuma conta vinculada —</option>
                <?php
                $users = get_users(['orderby' => 'display_name', 'order' => 'ASC', 'number' => 200]);
                foreach ($users as $u) {
                    $selected = selected($linked_user, $u->ID, false);
                    $role_label = implode(', ', $u->roles);
                    echo '<option value="' . $u->ID . '" ' . $selected . '>' . esc_html($u->display_name) . ' (' . esc_html($u->user_email) . ') — ' . esc_html($role_label) . '</option>';
                }
                ?>
            </select>
            <p class="description" style="font-size:11px;color:#888;margin-top:4px;">Vincular a uma conta de utilizador. Se essa conta tiver músicas reivindicadas, o artista é verificado automaticamente.</p>
            <?php endif; ?>
        </div>

        <div class="imz-artista-field full">
            <label>📝 Biografia curta</label>
            <textarea name="imz_artista_bio" placeholder="Uma frase sobre o artista..."><?php echo esc_textarea($bio); ?></textarea>
        </div>
        <div class="imz-artista-field">
            <label>🎵 Género musical</label>
            <input type="text" name="imz_artista_genero" value="<?php echo esc_attr($genero); ?>" placeholder="Ex: Afrohouse, Kuduro, R&B...">
        </div>
        <div class="imz-artista-field">
            <label>🌍 País / Cidade</label>
            <input type="text" name="imz_artista_pais" value="<?php echo esc_attr($pais); ?>" placeholder="Ex: Moçambique, Maputo">
        </div>
        <div class="imz-artista-field">
            <label><span class="imz-social-icon">📸</span> Instagram</label>
            <input type="url" name="imz_artista_instagram" value="<?php echo esc_attr($instagram); ?>" placeholder="https://instagram.com/artista">
        </div>
        <div class="imz-artista-field">
            <label><span class="imz-social-icon">🎵</span> TikTok</label>
            <input type="url" name="imz_artista_tiktok" value="<?php echo esc_attr($tiktok); ?>" placeholder="https://tiktok.com/@artista">
        </div>
        <div class="imz-artista-field">
            <label><span class="imz-social-icon">▶️</span> YouTube</label>
            <input type="url" name="imz_artista_youtube" value="<?php echo esc_attr($youtube); ?>" placeholder="https://youtube.com/@artista">
        </div>
        <div class="imz-artista-field">
            <label><span class="imz-social-icon">🎧</span> Spotify</label>
            <input type="url" name="imz_artista_spotify" value="<?php echo esc_attr($spotify); ?>" placeholder="https://open.spotify.com/artist/...">
        </div>
        <div class="imz-artista-field">
            <label><span class="imz-social-icon">📘</span> Facebook</label>
            <input type="url" name="imz_artista_facebook" value="<?php echo esc_attr($facebook); ?>" placeholder="https://facebook.com/artista">
        </div>
        <div class="imz-artista-field">
            <label><span class="imz-social-icon">💬</span> WhatsApp (link)</label>
            <input type="url" name="imz_artista_whatsapp" value="<?php echo esc_attr($whatsapp); ?>" placeholder="https://wa.me/258...">
        </div>
    </div>
    <?php
}

function imz_render_artista_photo_box($post) {
    $color = get_post_meta($post->ID, '_imz_artista_color', true);
    $photo = get_post_meta($post->ID, '_imz_artista_photo_url', true);
    ?>
    <p style="font-size:12px;color:#666;margin-top:0;">Use a imagem destacada (Featured Image) como foto do artista. A cor de destaque é extraída automaticamente ou pode definir manualmente.</p>
    <label style="font-weight:600;font-size:13px;display:block;margin-bottom:6px;">🎨 Cor de destaque (hex)</label>
    <input type="color" name="imz_artista_color" value="<?php echo esc_attr($color ?: '#ffffff'); ?>" style="width:100%;height:38px;border:1px solid #ddd;border-radius:5px;cursor:pointer;">
    <p style="font-size:11px;color:#888;margin-top:4px;">Deixe a plataforma extrair automaticamente da foto ao gravar, ou escolha manualmente.</p>
    <label style="font-weight:600;font-size:13px;display:block;margin:10px 0 4px;">🔗 URL da foto (alternativo)</label>
    <input type="url" name="imz_artista_photo_url" value="<?php echo esc_attr($photo); ?>" placeholder="https://..." style="width:100%;box-sizing:border-box;padding:7px;border:1px solid #ddd;border-radius:5px;font-size:12px;">
    <p style="font-size:11px;color:#888;margin-top:4px;">Se não usar Featured Image, cole aqui o URL direto da foto.</p>
    <?php
}

function imz_render_art_track_catalog_box($post) {
    $music_ids = function_exists('imz_get_ids_musicas_do_artista') ? imz_get_ids_musicas_do_artista($post->ID) : [];
    $musics = empty($music_ids) ? [] : get_posts([
        'post_type' => 'post',
        'post_status' => ['publish', 'draft', 'pending', 'private', 'future'],
        'post__in' => $music_ids,
        'posts_per_page' => -1,
        'orderby' => 'date',
        'order' => 'DESC',
    ]);
    $site_posts = get_posts([
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'orderby' => 'title',
        'order' => 'ASC',
    ]);
    $site_musics = array_values(array_filter($site_posts, function($music) {
        return get_post_meta($music->ID, '_imz_nao_e_musica', true) !== '1';
    }));
    ?>
    <style>
    .imz-art-track-list{display:grid;gap:8px}.imz-art-track-row{display:grid;grid-template-columns:42px minmax(0,1fr) auto;align-items:center;gap:11px;padding:9px;border:1px solid #e2e8f0;border-radius:10px;background:#fff}.imz-art-track-cover{width:42px;height:42px;border-radius:8px;object-fit:cover;background:#f1f5f9}.imz-art-track-title{font-weight:650;color:#0f172a}.imz-art-track-meta{font-size:11px;color:#64748b;margin-top:2px}.imz-art-track-state{font-size:11px;font-weight:650;padding:4px 8px;border-radius:999px;background:#f1f5f9;color:#475569}.imz-art-track-picker{margin-top:16px;border:1px solid #dbe2ea;border-radius:12px;background:#f8fafc}.imz-art-track-picker>summary{padding:13px 15px;cursor:pointer;font-weight:650;color:#0f172a}.imz-art-track-picker-body{padding:0 13px 13px}.imz-art-track-picker-search{width:100%;margin-bottom:10px;padding:9px 11px!important}.imz-art-track-options{display:grid;grid-template-columns:1fr 1fr;gap:7px;max-height:360px;overflow:auto}.imz-art-track-option{display:flex;align-items:center;gap:9px;padding:9px;border:1px solid #e2e8f0;border-radius:9px;background:#fff}.imz-art-track-option[hidden]{display:none!important}.imz-art-track-option.is-owned{opacity:.58}.imz-art-track-option input{flex:0 0 auto}.imz-art-track-option-copy{min-width:0}.imz-art-track-option-copy strong,.imz-art-track-option-copy small{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.imz-art-track-option-copy small{margin-top:2px;color:#64748b;font-size:10px}@media(max-width:780px){.imz-art-track-options{grid-template-columns:1fr}}
    </style>
    <p style="margin-top:0;color:#64748b;">As músicas aparecem aqui quando o Art Track é selecionado no editor da publicação, como artista principal ou participação.</p>
    <?php if (empty($musics)): ?>
        <div style="padding:20px;border:1px dashed #cbd5e1;border-radius:12px;text-align:center;color:#64748b;">Ainda não existem músicas associadas a este Art Track.</div>
    <?php else: ?>
        <div class="imz-art-track-list">
            <?php foreach ($musics as $music):
                $primary_id = (int)get_post_meta($music->ID, '_imz_artista_id', true);
                $role = $primary_id === (int)$post->ID ? 'Artista principal' : 'Participação';
                $cover = get_the_post_thumbnail_url($music->ID, 'thumbnail');
                $status_object = get_post_status_object($music->post_status);
                $status_label = $status_object ? $status_object->label : $music->post_status;
            ?>
                <div class="imz-art-track-row">
                    <?php if ($cover): ?><img class="imz-art-track-cover" src="<?php echo esc_url($cover); ?>" alt=""><?php else: ?><span class="imz-art-track-cover dashicons dashicons-format-audio" style="display:grid;place-items:center;font-size:21px;"></span><?php endif; ?>
                    <div><a class="imz-art-track-title" href="<?php echo esc_url(get_edit_post_link($music->ID)); ?>"><?php echo esc_html($music->post_title); ?></a><div class="imz-art-track-meta"><?php echo esc_html($role); ?> · <?php echo esc_html(get_the_date('d/m/Y', $music)); ?></div></div>
                    <span class="imz-art-track-state"><?php echo esc_html($status_label); ?></span>
                </div>
            <?php endforeach; ?>
        </div>
    <?php endif;
    ?>
    <input type="hidden" name="imz_art_track_catalog_present" value="1">
    <details class="imz-art-track-picker">
        <summary>Associar músicas publicadas do site (<?php echo count($site_musics); ?> disponíveis)</summary>
        <div class="imz-art-track-picker-body">
            <input type="search" class="imz-art-track-picker-search" placeholder="Pesquisar pelo título da música" data-imz-art-track-search>
            <div class="imz-art-track-options" data-imz-art-track-options>
                <?php foreach ($site_musics as $music):
                    $current_track = (int)get_post_meta($music->ID, '_imz_artista_id', true);
                    $belongs_here = $current_track === (int)$post->ID;
                    $belongs_elsewhere = $current_track > 0 && !$belongs_here;
                    $other_name = $belongs_elsewhere ? get_the_title($current_track) : '';
                ?>
                    <label class="imz-art-track-option<?php echo $belongs_elsewhere ? ' is-owned' : ''; ?>" data-imz-art-track-option data-title="<?php echo esc_attr($music->post_title); ?>">
                        <input type="checkbox" name="imz_art_track_music_ids[]" value="<?php echo (int)$music->ID; ?>" <?php checked($belongs_here); ?> <?php disabled($belongs_elsewhere); ?>>
                        <span class="imz-art-track-option-copy"><strong><?php echo esc_html($music->post_title); ?></strong><small><?php echo $belongs_elsewhere ? 'Já pertence a ' . esc_html($other_name) : ($belongs_here ? 'Associada a este Art Track' : 'Disponível para associar'); ?></small></span>
                    </label>
                <?php endforeach; ?>
            </div>
        </div>
    </details>
    <script>
    (function(){var input=document.querySelector('[data-imz-art-track-search]');var box=document.querySelector('[data-imz-art-track-options]');if(!input||!box)return;input.addEventListener('input',function(){var q=(input.value||'').trim().toLocaleLowerCase('pt');box.querySelectorAll('[data-imz-art-track-option]').forEach(function(row){var title=(row.getAttribute('data-title')||'').toLocaleLowerCase('pt');row.hidden=q!==''&&title.indexOf(q)===-1;});});})();
    </script>
    <?php
}


// =============================================================================
// 3. SAVE META (com invalidação completa de cache)
// =============================================================================

function imz_save_artista_meta($post_id) {
    if (!isset($_POST['imz_artista_nonce']) || !wp_verify_nonce($_POST['imz_artista_nonce'], 'imz_save_artista_meta')) return;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (!current_user_can('edit_post', $post_id)) return;

    if (isset($_POST['imz_art_track_catalog_present'])) {
        $selected_music_ids = isset($_POST['imz_art_track_music_ids'])
            ? array_values(array_unique(array_filter(array_map('absint', (array)$_POST['imz_art_track_music_ids']))))
            : [];
        $previous_primary_ids = get_posts([
            'post_type' => 'post',
            'post_status' => 'publish',
            'posts_per_page' => -1,
            'fields' => 'ids',
            'meta_key' => '_imz_artista_id',
            'meta_value' => $post_id,
        ]);

        foreach ($previous_primary_ids as $music_id) {
            if (!in_array((int)$music_id, $selected_music_ids, true)) {
                delete_post_meta((int)$music_id, '_imz_artista_id');
            }
        }
        foreach ($selected_music_ids as $music_id) {
            if (get_post_type($music_id) === 'post' && get_post_status($music_id) === 'publish') {
                $current_track = (int)get_post_meta($music_id, '_imz_artista_id', true);
                if (!$current_track || $current_track === (int)$post_id) {
                    update_post_meta($music_id, '_imz_artista_id', (int)$post_id);
                }
            }
        }
        delete_transient('imz_artista_ids_' . $post_id);
        delete_transient('imz_auto_verified_' . $post_id);
    }

    $text_fields = [
        'imz_artista_bio'       => '_imz_artista_bio',
        'imz_artista_genero'    => '_imz_artista_genero',
        'imz_artista_pais'      => '_imz_artista_pais',
    ];
    foreach ($text_fields as $key => $meta) {
        if (isset($_POST[$key])) update_post_meta($post_id, $meta, sanitize_textarea_field($_POST[$key]));
    }

    // Verificação manual
    $verified = isset($_POST['imz_artista_verified']) ? '1' : '';
    update_post_meta($post_id, '_imz_artista_verified', $verified);

    // Conta vinculada: no módulo integrado a conta é sempre uma wallet 1MZ.
    if (defined('RMBZ_ARTISTS_EMBEDDED')) {
        $phone = isset($_POST['imz_artista_account_phone']) ? sanitize_text_field(wp_unslash($_POST['imz_artista_account_phone'])) : '';
        $phone = function_exists('rmbz_artists_normalize_phone') ? rmbz_artists_normalize_phone($phone) : $phone;
        $email = isset($_POST['imz_artista_account_email']) ? sanitize_email(wp_unslash($_POST['imz_artista_account_email'])) : '';
        update_post_meta($post_id, '_imz_artista_account_phone', $phone);
        update_post_meta($post_id, '_imz_artista_account_email', $email);

        if (!empty($_POST['imz_artista_unlink_account'])) {
            $old_user = absint(get_post_meta($post_id, '_imz_artista_linked_user_id', true));
            if ($old_user && (int)get_user_meta($old_user, '_imz_art_track_id', true) === (int)$post_id) {
                delete_user_meta($old_user, '_imz_art_track_id');
            }
            delete_post_meta($post_id, '_imz_artista_linked_user_id');
            delete_post_meta($post_id, '_imz_artista_linked_wallet_id');
            delete_post_meta($post_id, '_imz_artista_linked_at');
            delete_post_meta($post_id, '_imz_artista_account_phone');
            delete_post_meta($post_id, '_imz_artista_account_email');
        } elseif (function_exists('rmbz_artists_find_wallet_by_identity') && function_exists('rmbz_artists_ensure_wp_user')) {
            $wallet = rmbz_artists_find_wallet_by_identity($phone, $email);
            if ($wallet) {
                $resolved_user = rmbz_artists_ensure_wp_user($wallet->user_telemovel);
                if ($resolved_user && function_exists('rmbz_artists_link_art_track_for_account')) {
                    rmbz_artists_link_art_track_for_account($wallet->user_telemovel, $resolved_user, $wallet);
                }
            }
        }
    } else {
        $linked_user = isset($_POST['imz_artista_linked_user_id']) ? absint($_POST['imz_artista_linked_user_id']) : 0;
        update_post_meta($post_id, '_imz_artista_linked_user_id', $linked_user ?: '');
    }

    $url_fields = [
        'imz_artista_instagram' => '_imz_artista_instagram',
        'imz_artista_tiktok'    => '_imz_artista_tiktok',
        'imz_artista_youtube'   => '_imz_artista_youtube',
        'imz_artista_facebook'  => '_imz_artista_facebook',
        'imz_artista_spotify'   => '_imz_artista_spotify',
        'imz_artista_whatsapp'  => '_imz_artista_whatsapp',
        'imz_artista_photo_url' => '_imz_artista_photo_url',
    ];
    foreach ($url_fields as $key => $meta) {
        if (isset($_POST[$key])) update_post_meta($post_id, $meta, esc_url_raw($_POST[$key]));
    }

    // Cor: usa manual se não for neutra, caso contrário extrai da imagem
    $manual_color = isset($_POST['imz_artista_color']) ? sanitize_hex_color($_POST['imz_artista_color']) : '';
    $is_neutral   = in_array(strtolower(ltrim($manual_color,'#')), ['ffffff','000000','fff','000','']);
    $final_color  = (!$is_neutral && $manual_color) ? $manual_color : null;

    // Verificar se a thumbnail mudou antes de recalcular
    if (!$final_color) {
        $cached_thumb_id = get_post_meta($post_id, '_imz_color_thumb_id', true);
        $current_thumb_id = get_post_thumbnail_id($post_id);

        if ($cached_thumb_id != $current_thumb_id || !get_post_meta($post_id, '_imz_artista_color', true)) {
            $final_color = imz_extract_dominant_color_from_post($post_id);
            if ($current_thumb_id) {
                update_post_meta($post_id, '_imz_color_thumb_id', $current_thumb_id);
            }
        } else {
            $final_color = get_post_meta($post_id, '_imz_artista_color', true);
        }
    }

    if (!$final_color) {
        $photo_url = isset($_POST['imz_artista_photo_url']) ? esc_url_raw($_POST['imz_artista_photo_url']) : '';
        if ($photo_url) $final_color = imz_extract_dominant_color_from_url($photo_url);
    }

    update_post_meta($post_id, '_imz_artista_color', $final_color ?: '#e8a87c');
    delete_transient('imz_artista_ids_' . $post_id);
}
add_action('save_post_imz_artista', 'imz_save_artista_meta');

add_filter('manage_imz_artista_posts_columns', function($columns) {
    $result = [];
    foreach ($columns as $key => $label) {
        $result[$key] = $label;
        if ($key === 'title') {
            $result['imz_art_track_catalog'] = 'Músicas';
            $result['imz_art_track_account'] = 'Conta 1MZ';
        }
    }
    return $result;
});

add_action('manage_imz_artista_posts_custom_column', function($column, $post_id) {
    if ($column === 'imz_art_track_catalog') {
        $count = function_exists('imz_count_musicas_do_artista') ? imz_count_musicas_do_artista($post_id) : 0;
        echo '<strong>' . (int)$count . '</strong> ' . ($count === 1 ? 'música' : 'músicas');
        return;
    }
    if ($column === 'imz_art_track_account') {
        $user_id = absint(get_post_meta($post_id, '_imz_artista_linked_user_id', true));
        if ($user_id) {
            $phone = get_user_meta($user_id, '_rmbz_artist_telemovel', true);
            echo '<span style="color:#166534;font-weight:650;">Vinculada</span>';
            if ($phone) echo '<br><small>' . esc_html($phone) . '</small>';
        } else {
            $phone = get_post_meta($post_id, '_imz_artista_account_phone', true);
            echo '<span style="color:#854d0e;font-weight:650;">A aguardar</span>';
            if ($phone) echo '<br><small>' . esc_html($phone) . '</small>';
        }
    }
}, 10, 2);

// Re-extrai cor quando Featured Image é trocada
add_action('updated_post_meta', function($meta_id, $post_id, $meta_key) {
    if ($meta_key !== '_thumbnail_id' || get_post_type($post_id) !== 'imz_artista') return;
    $color = imz_extract_dominant_color_from_post($post_id);
    if ($color) {
        update_post_meta($post_id, '_imz_artista_color', $color);
        update_post_meta($post_id, '_imz_color_thumb_id', get_post_thumbnail_id($post_id));
    }
}, 10, 3);

// =============================================================================
// 3b. EXTRACÇÃO DE COR DOMINANTE VIA GD
// =============================================================================

function imz_extract_dominant_color_from_post($post_id) {
    $thumb_id = get_post_thumbnail_id($post_id);
    if (!$thumb_id) return null;
    $file = get_attached_file($thumb_id);
    if (!$file || !file_exists($file)) return null;
    return imz_extract_dominant_color_from_file($file);
}

function imz_extract_dominant_color_from_url($url) {
    if (empty($url)) return null;
    $upload_dir = wp_upload_dir();
    if (strpos($url, $upload_dir['baseurl']) === 0) {
        $local = str_replace($upload_dir['baseurl'], $upload_dir['basedir'], $url);
        if (file_exists($local)) return imz_extract_dominant_color_from_file($local);
    }
    $tmp = download_url($url, 15);
    if (is_wp_error($tmp)) return null;
    $color = imz_extract_dominant_color_from_file($tmp);
    @unlink($tmp);
    return $color;
}

function imz_extract_dominant_color_from_file($file) {
    if (!extension_loaded('gd')) return null;
    $info = @getimagesize($file);
    if (!$info) return null;

    $img = null;
    switch ($info['mime']) {
        case 'image/jpeg': $img = @imagecreatefromjpeg($file); break;
        case 'image/png':  $img = @imagecreatefrompng($file);  break;
        case 'image/webp': $img = function_exists('imagecreatefromwebp') ? @imagecreatefromwebp($file) : null; break;
        case 'image/gif':  $img = @imagecreatefromgif($file);  break;
    }
    if (!$img) return null;

    $small = imagecreatetruecolor(50, 50);
    imagealphablending($small, false);
    imagefill($small, 0, 0, imagecolorallocatealpha($small, 0, 0, 0, 127));
    imagecopyresampled($small, $img, 0, 0, 0, 0, 50, 50, imagesx($img), imagesy($img));
    imagedestroy($img);

    $buckets = [];
    for ($x = 0; $x < 50; $x++) {
        for ($y = 0; $y < 50; $y++) {
            $rgb = imagecolorat($small, $x, $y);
            $r   = ($rgb >> 16) & 0xFF;
            $g   = ($rgb >> 8)  & 0xFF;
            $b   =  $rgb        & 0xFF;

            $lum = 0.299 * $r + 0.587 * $g + 0.114 * $b;
            if ($lum < 30 || $lum > 225) continue;

            $max = max($r, $g, $b);
            $min = min($r, $g, $b);
            $sat = $max > 0 ? ($max - $min) / $max : 0;
            if ($sat < 0.20) continue;

            $key = (($r >> 5) << 16) | (($g >> 5) << 8) | ($b >> 5);
            $buckets[$key] = ($buckets[$key] ?? 0) + 1;
        }
    }
    imagedestroy($small);

    if (empty($buckets)) return null;
    arsort($buckets);
    $top = array_key_first($buckets);

    $r = (($top >> 16) & 0x07) << 5;
    $g = (($top >> 8)  & 0x07) << 5;
    $b = ( $top        & 0x07) << 5;

    $max = max($r, $g, $b);
    if ($max > 0 && $max < 210) {
        $f = min(255 / $max, 1.45);
        $r = (int) min(255, $r * $f);
        $g = (int) min(255, $g * $f);
        $b = (int) min(255, $b * $f);
    }

    return sprintf('#%02x%02x%02x', $r, $g, $b);
}


// =============================================================================
// 4. META BOX — Associar Artista ao Post (com invalidação completa)
// =============================================================================

function imz_music_artista_meta_box() {
    add_meta_box(
        'imz_music_artista',
        'Art Track desta Música',
        'imz_render_music_artista_box',
        'post',
        'side',
        'high'
    );
}
add_action('add_meta_boxes', 'imz_music_artista_meta_box');

function imz_render_music_artista_box($post) {
    wp_nonce_field('imz_save_music_artista', 'imz_music_artista_nonce');

    $artista_id     = get_post_meta($post->ID, '_imz_artista_id', true);
    $feat_ids       = get_post_meta($post->ID, '_imz_feat_artista_ids', true);
    if (!is_array($feat_ids)) $feat_ids = [];

    $artistas = get_posts([
        'post_type'      => 'imz_artista',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
        'orderby'        => 'title',
        'order'          => 'ASC',
    ]);

    if (empty($artistas)) {
        echo '<p style="font-size:12px;color:#888;">Ainda não há Art Tracks criados. <a href="' . admin_url('post-new.php?post_type=imz_artista') . '">Criar Art Track</a>.</p>';
        return;
    }
    ?>
    <style>
    .imz-artista-select { width:100%; padding:6px; border:1px solid #ddd; border-radius:5px; font-size:13px; margin-bottom:10px; }
    .imz-feat-check-list { max-height:150px; overflow-y:auto; border:1px solid #eee; border-radius:5px; padding:6px 8px; background:#fafafa; }
    .imz-feat-check-list label { display:flex; align-items:center; gap:6px; font-size:12px; padding:3px 0; cursor:pointer; }
    .imz-feat-check-list label:hover { color:#2271b1; }
    </style>

    <p style="font-size:12px;font-weight:600;margin:0 0 4px;">Art Track principal</p>
    <select name="imz_artista_id" class="imz-artista-select">
        <option value="">— Nenhum (usa autor do post) —</option>
        <?php foreach ($artistas as $a): ?>
            <option value="<?php echo $a->ID; ?>" <?php selected($artista_id, $a->ID); ?>>
                <?php echo esc_html($a->post_title); ?>
            </option>
        <?php endforeach; ?>
    </select>

    <p style="font-size:12px;font-weight:600;margin:8px 0 4px;">Feat / Participações</p>
    <div class="imz-feat-check-list">
        <?php foreach ($artistas as $a): ?>
            <label>
                <input type="checkbox" name="imz_feat_artista_ids[]" value="<?php echo $a->ID; ?>"
                    <?php checked(in_array($a->ID, $feat_ids)); ?>>
                <?php echo esc_html($a->post_title); ?>
            </label>
        <?php endforeach; ?>
    </div>
    <p style="font-size:11px;color:#888;margin-top:6px;">Artistas que aparecem na música (feat.).</p>
    <?php
}

function imz_save_music_artista_meta($post_id) {
    if (!isset($_POST['imz_music_artista_nonce']) || !wp_verify_nonce($_POST['imz_music_artista_nonce'], 'imz_save_music_artista')) return;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (!current_user_can('edit_post', $post_id)) return;
    if (get_post_type($post_id) !== 'post') return;

    $artista_id = isset($_POST['imz_artista_id']) ? absint($_POST['imz_artista_id']) : 0;

    // CORRECÇÃO: Guardar feats antigos para invalidar os seus caches
    $old_feat_ids = get_post_meta($post_id, '_imz_feat_artista_ids', true);
    if (!is_array($old_feat_ids)) $old_feat_ids = [];
    $old_artista_id = get_post_meta($post_id, '_imz_artista_id', true);

    update_post_meta($post_id, '_imz_artista_id', $artista_id);

    $feat_ids = isset($_POST['imz_feat_artista_ids']) ? array_map('absint', (array)$_POST['imz_feat_artista_ids']) : [];
    update_post_meta($post_id, '_imz_feat_artista_ids', $feat_ids);

    // Limpa caches: artista novo + velho + todos feats novos + todos feats removidos
    $all_ids_to_invalidate = array_unique(array_filter(array_merge(
        [$artista_id, (int) $old_artista_id],
        $feat_ids,
        array_map('intval', $old_feat_ids)
    )));

    foreach ($all_ids_to_invalidate as $aid) {
        if ($aid > 0) {
            delete_transient('imz_artista_ids_' . $aid);
            delete_transient('imz_auto_verified_' . $aid);
        }
    }
}
add_action('save_post_post', 'imz_save_music_artista_meta');


// =============================================================================
// 5. HELPERS
// =============================================================================

/**
 * Verifica se um artista está verificado.
 * Retorna true se:
 *  1. O admin marcou manualmente (_imz_artista_verified = '1'), OU
 *  2. O artista tem conta vinculada com músicas reivindicadas (auto-verificação)
 */
function imz_is_artista_verified($artista_id) {
    // 1. Verificação manual pelo admin
    if (get_post_meta($artista_id, '_imz_artista_verified', true) === '1') {
        return true;
    }
    // 2. Auto-verificação via conta vinculada
    return imz_is_artista_auto_verified($artista_id);
}

/**
 * Auto-verificação: o Art Track tem conta 1MZ vinculada e pelo menos uma
 * música publicada no catálogo, como principal ou participação.
 */
function imz_is_artista_auto_verified($artista_id) {
    $linked_user_id = get_post_meta($artista_id, '_imz_artista_linked_user_id', true);
    if (empty($linked_user_id)) return false;

    $linked_user_id = (int) $linked_user_id;
    if (!get_userdata($linked_user_id)) return false;

    // Verificar se o Art Track tem pelo menos uma música publicada.
    $cache_key = 'imz_auto_verified_' . $artista_id;
    $cached = get_transient($cache_key);
    if (false !== $cached) return $cached === 'yes';

    $music_ids = function_exists('imz_get_ids_musicas_do_artista') ? imz_get_ids_musicas_do_artista($artista_id) : [];
    $published = empty($music_ids) ? [] : get_posts([
        'post_type' => 'post',
        'post_status' => 'publish',
        'post__in' => $music_ids,
        'posts_per_page' => 1,
        'fields' => 'ids',
        'no_found_rows' => true,
    ]);

    $result = !empty($published);
    set_transient($cache_key, $result ? 'yes' : 'no', 2 * HOUR_IN_SECONDS);
    return $result;
}

/**
 * Retorna o SVG do selo de verificado (badge azul).
 */
function imz_get_verified_badge_svg($size = 16) {
    return '<svg class="imz-verified-badge" width="' . $size . '" height="' . $size . '" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M9 12l2 2 4-4" stroke="#fff" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
        <path d="M12 2l2.4 3.6L18 4.5l-.9 3.9L21 12l-3.9 3.6.9 3.9-3.6-.9L12 22l-2.4-3.6L6 19.5l.9-3.9L3 12l3.9-3.6L6 4.5l3.6.9L12 2z" fill="#1d9bf0" stroke="#1d9bf0" stroke-width="0.5"/>
        <path d="M9 12l2 2 4-4" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
    </svg>';
}

/**
 * Retorna os dados completos de um artista pelo ID do CPT.
 */
function imz_get_artista($artista_id) {
    if (!$artista_id) return null;
    $post = get_post($artista_id);
    if (!$post || $post->post_type !== 'imz_artista') return null;

    $photo_url = get_post_meta($artista_id, '_imz_artista_photo_url', true);
    if (!$photo_url && has_post_thumbnail($artista_id)) {
        $photo_url = get_the_post_thumbnail_url($artista_id, 'medium');
    }

    return [
        'id'        => $artista_id,
        'nome'      => $post->post_title,
        'bio'       => get_post_meta($artista_id, '_imz_artista_bio', true),
        'genero'    => get_post_meta($artista_id, '_imz_artista_genero', true),
        'pais'      => get_post_meta($artista_id, '_imz_artista_pais', true),
        'photo'     => $photo_url,
        'color'     => get_post_meta($artista_id, '_imz_artista_color', true) ?: '#ffffff',
        'verified'  => imz_is_artista_verified($artista_id),
        'instagram' => get_post_meta($artista_id, '_imz_artista_instagram', true),
        'tiktok'    => get_post_meta($artista_id, '_imz_artista_tiktok', true),
        'youtube'   => get_post_meta($artista_id, '_imz_artista_youtube', true),
        'facebook'  => get_post_meta($artista_id, '_imz_artista_facebook', true),
        'spotify'   => get_post_meta($artista_id, '_imz_artista_spotify', true),
        'whatsapp'  => get_post_meta($artista_id, '_imz_artista_whatsapp', true),
    ];
}

/**
 * NOVO: Batch load de múltiplos artistas de uma vez (resolve N+1).
 * Devolve array associativo [artista_id => dados].
 */
function imz_get_artistas_batch(array $artista_ids) {
    $artista_ids = array_filter(array_unique(array_map('intval', $artista_ids)));
    if (empty($artista_ids)) return [];

    // Pré-carregar posts e meta de uma vez
    _prime_post_caches($artista_ids, true, true);

    $result = [];
    foreach ($artista_ids as $aid) {
        $data = imz_get_artista($aid);
        if ($data) $result[$aid] = $data;
    }
    return $result;
}

/**
 * Retorna o artista principal associado a um post de música.
 */
function imz_get_artista_do_post($post_id) {
    $artista_id = get_post_meta($post_id, '_imz_artista_id', true);
    if ($artista_id) return imz_get_artista($artista_id);
    return null;
}

/**
 * Retorna IDs de músicas de um artista (principal ou feat).
 * Resultado cacheado por 6h.
 */
function imz_get_ids_musicas_do_artista($artista_id) {
    global $wpdb;

    $artista_id = (int) $artista_id;
    $cache_key  = 'imz_artista_ids_' . $artista_id;
    $cached     = get_transient($cache_key);
    if (false !== $cached) return $cached;

    // 1. Artista principal — meta guardado como string do ID
    $principal_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT post_id FROM {$wpdb->postmeta}
         WHERE meta_key = '_imz_artista_id' AND meta_value = %s",
        (string) $artista_id
    ));

    // 2. Feat — meta guardado como array serializado PHP.
    //    O formato pode ser:
    //    - Inteiros: a:2:{i:0;i:123;i:1;i:456;}  → padrão "i:123;"
    //    - Strings:  a:2:{i:0;s:3:"123";...}      → padrão '"123"'
    //    Precisamos cobrir AMBOS os formatos.
    $like_string = '%' . $wpdb->esc_like('"' . $artista_id . '"') . '%';
    $like_int    = '%' . $wpdb->esc_like('i:' . $artista_id . ';') . '%';

    $feat_candidates = $wpdb->get_col($wpdb->prepare(
        "SELECT DISTINCT post_id FROM {$wpdb->postmeta}
         WHERE meta_key = '_imz_feat_artista_ids'
         AND (meta_value LIKE %s OR meta_value LIKE %s)",
        $like_string,
        $like_int
    ));

    $feat_ids = [];
    foreach ($feat_candidates as $pid) {
        $ids = get_post_meta((int)$pid, '_imz_feat_artista_ids', true);
        if (is_array($ids) && in_array($artista_id, array_map('intval', $ids), true)) {
            $feat_ids[] = (int) $pid;
        }
    }

    $all_ids = array_values(array_unique(array_merge(
        array_map('intval', (array) $principal_ids),
        $feat_ids
    )));

    set_transient($cache_key, $all_ids, 6 * HOUR_IN_SECONDS);
    return $all_ids;
}

/**
 * Retorna posts de músicas de um artista, excluindo o post atual.
 */
function imz_get_musicas_do_artista($artista_id, $exclude_id = 0, $limit = 5) {
    $all_ids = imz_get_ids_musicas_do_artista($artista_id);

    if ($exclude_id) {
        $all_ids = array_values(array_filter($all_ids, fn($id) => $id !== (int)$exclude_id));
    }
    if (empty($all_ids)) return [];

    return get_posts([
        'post__in'            => $all_ids,
        'post_type'           => 'post',
        'post_status'         => 'publish',
        'posts_per_page'      => $limit,
        'orderby'             => 'post__in',
        'no_found_rows'       => true,
        'update_post_term_cache' => false,
    ]);
}

function imz_count_musicas_do_artista($artista_id) {
    return count(imz_get_ids_musicas_do_artista($artista_id));
}

function imz_hex_to_rgba($hex, $alpha = 0.15) {
    $hex = ltrim($hex, '#');
    if (strlen($hex) === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
    $r = hexdec(substr($hex, 0, 2));
    $g = hexdec(substr($hex, 2, 2));
    $b = hexdec(substr($hex, 4, 2));
    return "rgba($r, $g, $b, $alpha)";
}

function imz_is_dark_color($hex) {
    $hex = ltrim($hex, '#');
    if (strlen($hex) === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
    $r = hexdec(substr($hex, 0, 2));
    $g = hexdec(substr($hex, 2, 2));
    $b = hexdec(substr($hex, 4, 2));
    $luminance = (0.299 * $r + 0.587 * $g + 0.114 * $b) / 255;
    return $luminance < 0.5;
}

/**
 * NOVO: Calcula a cor do nome do artista garantindo contraste WCAG AA
 * no fundo escuro (~#141414). Se a cor original for demasiado escura
 * ou com baixo contraste, clareia-a.
 */
function imz_get_nome_display_color($hex) {
    $hex = ltrim($hex, '#');
    if (strlen($hex) === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
    $r = hexdec(substr($hex, 0, 2));
    $g = hexdec(substr($hex, 2, 2));
    $b = hexdec(substr($hex, 4, 2));

    // Luminância relativa da cor
    $lum = (0.299 * $r + 0.587 * $g + 0.114 * $b) / 255;

    // Se a cor é suficientemente clara para o fundo escuro (lum > 0.45), usar como está
    if ($lum > 0.45) {
        return sprintf('#%02x%02x%02x', $r, $g, $b);
    }

    // Caso contrário, clarear a cor mantendo o matiz
    $factor = 0.50 / max($lum, 0.01); // Quanto clarear
    $factor = min($factor, 2.5); // Limitar para não ficar branco puro

    $r = (int) min(255, $r * $factor + 40);
    $g = (int) min(255, $g * $factor + 40);
    $b = (int) min(255, $b * $factor + 40);

    return sprintf('#%02x%02x%02x', $r, $g, $b);
}

/**
 * NOVO: Ícones SVG das redes sociais (substitui emojis)
 * Retorna SVG inline compacto para cada plataforma.
 */
function imz_get_social_icon_svg($platform) {
    $icons = [
        'instagram' => '<svg class="imz-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="20" rx="5"/><circle cx="12" cy="12" r="5"/><circle cx="17.5" cy="6.5" r="1.5" fill="currentColor" stroke="none"/></svg>',
        'tiktok'    => '<svg class="imz-icon" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M19.59 6.69a4.83 4.83 0 01-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 01-2.88 2.5 2.89 2.89 0 01-2.88-2.88 2.89 2.89 0 012.88-2.88c.28 0 .56.04.82.12v-3.49a6.37 6.37 0 00-.82-.05A6.34 6.34 0 003.15 15.3 6.34 6.34 0 009.49 21.64a6.34 6.34 0 006.34-6.34V9.08a8.16 8.16 0 003.76.92V6.69z"/></svg>',
        'youtube'   => '<svg class="imz-icon" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M23.5 6.19a3.02 3.02 0 00-2.12-2.14C19.5 3.5 12 3.5 12 3.5s-7.5 0-9.38.55A3.02 3.02 0 00.5 6.19 31.6 31.6 0 000 12a31.6 31.6 0 00.5 5.81 3.02 3.02 0 002.12 2.14c1.88.55 9.38.55 9.38.55s7.5 0 9.38-.55a3.02 3.02 0 002.12-2.14A31.6 31.6 0 0024 12a31.6 31.6 0 00-.5-5.81zM9.75 15.02V8.98L15.5 12l-5.75 3.02z"/></svg>',
        'spotify'   => '<svg class="imz-icon" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.52 17.34c-.24.36-.66.48-1.02.24-2.82-1.74-6.36-2.1-10.56-1.14-.42.12-.78-.18-.9-.54-.12-.42.18-.78.54-.9 4.56-1.02 8.52-.6 11.64 1.32.42.18.48.66.3 1.02zm1.44-3.3c-.3.42-.84.6-1.26.3-3.24-1.98-8.16-2.58-11.94-1.38-.48.12-.96-.12-1.08-.6-.12-.48.12-.96.6-1.08 4.38-1.32 9.78-.66 13.5 1.62.36.18.54.78.18 1.14zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.3c-.6.18-1.14-.18-1.32-.72-.18-.6.18-1.14.72-1.32 4.2-1.26 11.28-.96 15.72 1.62.54.3.72 1.02.42 1.56-.3.42-.96.6-1.62.24z"/></svg>',
        'facebook'  => '<svg class="imz-icon" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.79-4.7 4.53-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.51c-1.49 0-1.95.93-1.95 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z"/></svg>',
        'whatsapp'  => '<svg class="imz-icon" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M17.47 14.38c-.3-.15-1.76-.87-2.03-.97-.28-.1-.48-.15-.68.15-.2.3-.77.97-.95 1.17-.17.2-.35.22-.65.07-.3-.15-1.27-.47-2.42-1.49-.9-.8-1.5-1.78-1.67-2.08-.18-.3-.02-.46.13-.61.14-.14.3-.35.45-.52.15-.18.2-.3.3-.5.1-.2.05-.37-.02-.52-.08-.15-.68-1.65-.93-2.25-.25-.6-.5-.52-.68-.53h-.58c-.2 0-.52.07-.8.37-.27.3-1.04 1.02-1.04 2.49s1.07 2.89 1.22 3.09c.15.2 2.1 3.22 5.1 4.51.71.31 1.27.49 1.7.63.72.23 1.37.2 1.88.12.58-.08 1.76-.72 2.01-1.41.25-.7.25-1.3.18-1.42-.08-.12-.28-.2-.58-.35zM12.05 21.8a9.88 9.88 0 01-5.03-1.38l-.36-.21-3.74.98 1-3.65-.24-.38a9.86 9.86 0 01-1.51-5.26c0-5.45 4.44-9.88 9.9-9.88a9.88 9.88 0 019.89 9.9c-.01 5.45-4.44 9.88-9.9 9.88zM20.52 3.48A11.78 11.78 0 0012.05 0C5.46 0 .1 5.35.1 11.93a11.9 11.9 0 001.6 5.96L0 24l6.3-1.65a11.87 11.87 0 005.74 1.46h.01c6.59 0 11.95-5.35 11.95-11.94a11.87 11.87 0 00-3.48-8.39z"/></svg>',
    ];
    return $icons[$platform] ?? '';
}


// =============================================================================
// 6. CARD DO ARTISTA (HTML para usar no frontend)
// =============================================================================

function imz_render_artista_card($post_id) {
    $artista = imz_get_artista_do_post($post_id);
    $feat_ids = get_post_meta($post_id, '_imz_feat_artista_ids', true);
    if (!is_array($feat_ids)) $feat_ids = [];

    if (!$artista && empty($feat_ids)) return '';

    $color      = $artista ? $artista['color'] : '#ffffff';
    $color_bg   = imz_hex_to_rgba($color, 0.08);
    $color_mid  = imz_hex_to_rgba($color, 0.18);
    $color_bdr  = imz_hex_to_rgba($color, 0.35);

    // CORRECÇÃO: Calcular cor do nome com contraste garantido
    $nome_color = imz_get_nome_display_color($color);

    // Redes sociais do artista principal (com ícones SVG)
    $redes = [];
    if ($artista) {
        $rede_map = [
            'instagram' => 'Instagram',
            'tiktok'    => 'TikTok',
            'youtube'   => 'YouTube',
            'spotify'   => 'Spotify',
            'facebook'  => 'Facebook',
            'whatsapp'  => 'WhatsApp',
        ];
        foreach ($rede_map as $key => $label) {
            if (!empty($artista[$key])) {
                $redes[] = ['url' => $artista[$key], 'icon' => imz_get_social_icon_svg($key), 'label' => $label];
            }
        }
    }

    // CORRECÇÃO: Batch load de feats em vez de N+1
    $feat_artistas = [];
    if (!empty($feat_ids)) {
        $feat_data = imz_get_artistas_batch($feat_ids);
        foreach ($feat_ids as $fid) {
            if (isset($feat_data[$fid])) $feat_artistas[] = $feat_data[$fid];
        }
    }

    $card_id = 'imz-artista-card-' . $post_id;

    ob_start();
    ?>
    <div class="imz-artista-card" id="<?php echo $card_id; ?>"
         style="--artista-color: <?php echo esc_attr($color); ?>;
                --artista-color-bg: <?php echo $color_bg; ?>;
                --artista-color-mid: <?php echo $color_mid; ?>;
                --artista-color-bdr: <?php echo $color_bdr; ?>;
                --artista-nome-color: <?php echo esc_attr($nome_color); ?>;">

        <?php if ($artista): ?>
        <div class="imz-artista-main" id="<?php echo $card_id; ?>-trigger">
            <?php if ($artista['photo']): ?>
                <div class="imz-artista-foto-ring">
                    <img src="<?php echo esc_url($artista['photo']); ?>"
                         alt="<?php echo esc_attr($artista['nome']); ?>"
                         class="imz-artista-foto"
                         loading="lazy">
                </div>
            <?php else: ?>
                <div class="imz-artista-foto-ring">
                    <div class="imz-artista-foto-placeholder" style="background: <?php echo esc_attr($color); ?>; color: <?php echo imz_is_dark_color($color) ? '#ffffff' : '#1c1b1f'; ?>;">
                        <?php echo esc_html(mb_strtoupper(mb_substr($artista['nome'], 0, 2))); ?>
                    </div>
                </div>
            <?php endif; ?>

            <div class="imz-artista-info">
                <div class="imz-artista-nome-row">
                    <span class="imz-artista-nome">
                        <?php echo esc_html($artista['nome']); ?>
                        <?php if (!empty($artista['verified'])): ?>
                            <?php echo imz_get_verified_badge_svg(18); ?>
                        <?php endif; ?>
                    </span>
                    <?php if ($artista['genero']): ?>
                        <span class="imz-artista-genero-badge"><?php echo esc_html($artista['genero']); ?></span>
                    <?php endif; ?>
                </div>
                <?php if ($artista['bio']): ?>
                    <p class="imz-artista-bio"><?php echo esc_html($artista['bio']); ?></p>
                <?php endif; ?>
                <div class="imz-artista-meta-row">
                    <?php if ($artista['pais']): ?>
                        <span class="imz-artista-pais">
                            <svg class="imz-pin-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" width="13" height="13">
                                <path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/>
                            </svg>
                            <?php echo esc_html($artista['pais']); ?>
                        </span>
                    <?php endif; ?>
                    <span class="imz-artista-followers" data-follow-count>
                        <strong data-follow-num><?php echo esc_html(imz_format_follow_count(imz_get_follow_count($artista['id']))); ?></strong>
                        <span data-follow-word><?php echo (imz_get_follow_count($artista['id']) === 1) ? 'seguidor' : 'seguidores'; ?></span>
                    </span>
                </div>
            </div>

            <?php $is_following = imz_is_following($artista['id']); ?>
            <div class="imz-artista-actions">
                <button class="imz-artista-follow-btn<?php echo $is_following ? ' following' : ''; ?>"
                        data-artista-id="<?php echo (int) $artista['id']; ?>"
                        aria-pressed="<?php echo $is_following ? 'true' : 'false'; ?>"
                        style="--btn-color: <?php echo esc_attr($color); ?>;">
                    <svg class="imz-follow-icon-plus" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" width="15" height="15"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
                    <svg class="imz-follow-icon-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" width="15" height="15"><polyline points="20 6 9 17 4 12"/></svg>
                    <span class="imz-follow-label"><?php echo $is_following ? 'A seguir' : 'Seguir'; ?></span>
                </button>

                <?php if (!empty($redes)): ?>
                    <button class="imz-artista-toggle-btn"
                            aria-label="Ver redes sociais de <?php echo esc_attr($artista['nome']); ?>"
                            aria-expanded="false"
                            aria-controls="<?php echo $card_id; ?>-redes"
                            style="--btn-color: <?php echo esc_attr($color); ?>; --btn-color-bg: <?php echo $color_bg; ?>; --btn-color-bdr: <?php echo $color_bdr; ?>;">
                        <svg class="imz-toggle-icon" viewBox="0 0 24 24" fill="currentColor" width="16" height="16">
                            <circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/>
                        </svg>
                    </button>
                <?php endif; ?>
            </div>
        </div>

        <?php if (!empty($redes)): ?>
        <div class="imz-artista-redes" id="<?php echo $card_id; ?>-redes" hidden role="region" aria-label="Redes sociais">
            <p class="imz-artista-redes-titulo">Seguir <?php echo esc_html($artista['nome']); ?></p>
            <div class="imz-artista-redes-grid">
                <?php foreach ($redes as $rede): ?>
                    <a href="<?php echo esc_url($rede['url']); ?>"
                       target="_blank" rel="noopener noreferrer nofollow"
                       class="imz-artista-rede-btn"
                       style="border-color: <?php echo $color_bdr; ?>; color: <?php echo esc_attr($color); ?>;">
                        <?php echo $rede['icon']; ?>
                        <?php echo esc_html($rede['label']); ?>
                    </a>
                <?php endforeach; ?>
            </div>
        </div>
        <?php endif; ?>
        <?php endif; ?>

        <!-- Feats -->
        <?php if (!empty($feat_artistas)): ?>
        <div class="imz-artista-feats">
            <span class="imz-artista-feat-label">feat.</span>
            <?php foreach ($feat_artistas as $fa): ?>
                <button class="imz-artista-feat-pill"
                        data-artista-id="<?php echo $fa['id']; ?>"
                        aria-expanded="false"
                        aria-controls="imz-feat-popup-<?php echo $fa['id']; ?>"
                        style="border-color: <?php echo imz_hex_to_rgba($fa['color'], 0.4); ?>; color: <?php echo esc_attr($fa['color']); ?>;">
                    <?php if ($fa['photo']): ?>
                        <img src="<?php echo esc_url($fa['photo']); ?>" alt="" class="imz-feat-mini-foto" loading="lazy">
                    <?php else: ?>
                        <span class="imz-feat-mini-foto imz-feat-mini-placeholder" style="background: <?php echo esc_attr($fa['color']); ?>; color: <?php echo imz_is_dark_color($fa['color']) ? '#ffffff' : '#1c1b1f'; ?>;"><?php echo esc_html(mb_strtoupper(mb_substr($fa['nome'], 0, 2))); ?></span>
                    <?php endif; ?>
                    <?php echo esc_html($fa['nome']); ?>
                    <?php if (!empty($fa['verified'])): ?>
                        <?php echo imz_get_verified_badge_svg(14); ?>
                    <?php endif; ?>
                </button>
            <?php endforeach; ?>
        </div>

        <?php foreach ($feat_artistas as $fa):
            $fa_redes = [];
            foreach (['instagram'=>'Instagram','tiktok'=>'TikTok','youtube'=>'YouTube','spotify'=>'Spotify','facebook'=>'Facebook','whatsapp'=>'WhatsApp'] as $k => $lb) {
                if (!empty($fa[$k])) $fa_redes[] = ['url'=>$fa[$k],'icon'=>imz_get_social_icon_svg($k),'label'=>$lb];
            }
            if (empty($fa_redes)) continue;
        ?>
        <div class="imz-feat-redes-popup" id="imz-feat-popup-<?php echo $fa['id']; ?>" hidden
             role="region" aria-label="Redes de <?php echo esc_attr($fa['nome']); ?>"
             style="border-color: <?php echo imz_hex_to_rgba($fa['color'], 0.4); ?>;">
            <div class="imz-feat-popup-header">
                <?php if ($fa['photo']): ?>
                    <img src="<?php echo esc_url($fa['photo']); ?>" alt="" class="imz-feat-popup-foto">
                <?php else: ?>
                    <span class="imz-feat-popup-foto imz-feat-mini-placeholder" style="background: <?php echo esc_attr($fa['color']); ?>; color: <?php echo imz_is_dark_color($fa['color']) ? '#ffffff' : '#1c1b1f'; ?>;font-size:12px;"><?php echo esc_html(mb_strtoupper(mb_substr($fa['nome'], 0, 2))); ?></span>
                <?php endif; ?>
                <span style="color:<?php echo esc_attr($fa['color']); ?>;font-weight:700;"><?php echo esc_html($fa['nome']); ?></span>
                <button class="imz-feat-popup-close" aria-label="Fechar">✕</button>
            </div>
            <div class="imz-artista-redes-grid">
                <?php foreach ($fa_redes as $r): ?>
                    <a href="<?php echo esc_url($r['url']); ?>" target="_blank" rel="noopener noreferrer nofollow"
                       class="imz-artista-rede-btn"
                       style="border-color: <?php echo imz_hex_to_rgba($fa['color'], 0.35); ?>; color: <?php echo esc_attr($fa['color']); ?>;">
                        <?php echo $r['icon']; ?><?php echo esc_html($r['label']); ?>
                    </a>
                <?php endforeach; ?>
            </div>
        </div>
        <?php endforeach; ?>
        <?php endif; ?>

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


// =============================================================================
// 7. SECÇÃO "OUTRAS MÚSICAS DO ARTISTA" (com batch loading)
// =============================================================================

function imz_render_outras_musicas($post_id) {
    $artista_id = (int) get_post_meta($post_id, '_imz_artista_id', true);
    $feat_ids   = get_post_meta($post_id, '_imz_feat_artista_ids', true);
    if (!is_array($feat_ids)) $feat_ids = [];
    $feat_ids = array_map('intval', $feat_ids);

    if (!$artista_id && empty($feat_ids)) return '';

    // Recolhe músicas de todos os artistas associados
    $seen_ids = [];
    $all_artist_ids = array_values(array_filter(array_unique(array_merge([$artista_id], $feat_ids))));

    foreach ($all_artist_ids as $aid) {
        foreach (imz_get_ids_musicas_do_artista($aid) as $mid) {
            if ($mid !== (int)$post_id && !in_array($mid, $seen_ids)) {
                $seen_ids[] = $mid;
            }
        }
    }

    if (empty($seen_ids)) return '';

    $total    = count($seen_ids);
    $show_ids = array_slice($seen_ids, 0, 5);

    $musicas = get_posts([
        'post__in'               => $show_ids,
        'post_type'              => 'post',
        'post_status'            => 'publish',
        'posts_per_page'         => 5,
        'orderby'                => 'post__in',
        'no_found_rows'          => true,
        'update_post_term_cache' => false,
    ]);

    if (empty($musicas)) return '';

    // =========================================================
    // TÍTULO DINÂMICO (corrigido — sem array_pop antes de usar)
    // =========================================================
    $artista = $artista_id ? imz_get_artista($artista_id) : null;
    $nomes_envolvidos = [];

    if ($artista) {
        $nomes_envolvidos[] = $artista['nome'];
    }
    foreach ($feat_ids as $fid) {
        $fa = imz_get_artista($fid);
        if ($fa) {
            $nomes_envolvidos[] = $fa['nome'];
        }
    }

    // CORRECÇÃO: Usar cópia para o título, manter original para o URL
    $nomes_para_titulo = $nomes_envolvidos; // cópia
    if (count($nomes_para_titulo) === 1) {
        $titulo_exibicao = 'Mais de ' . $nomes_para_titulo[0];
    } elseif (count($nomes_para_titulo) > 1) {
        $ultimo_nome = array_pop($nomes_para_titulo); // pop na CÓPIA
        $titulo_exibicao = 'Mais de ' . implode(', ', $nomes_para_titulo) . ' e ' . $ultimo_nome;
    } else {
        $titulo_exibicao = 'Outras músicas';
    }

    // Define a cor de destaque
    $header_color = '#888888';
    if ($artista && $artista['color']) {
        $header_color = $artista['color'];
    } elseif (!empty($feat_ids)) {
        $primeiro_feat = imz_get_artista($feat_ids[0]);
        if ($primeiro_feat && $primeiro_feat['color']) {
            $header_color = $primeiro_feat['color'];
        }
    }

    $header_color_bg  = imz_hex_to_rgba($header_color, 0.06);
    $header_color_bdr = imz_hex_to_rgba($header_color, 0.3);

    // CORRECÇÃO: URL do "Ver mais" usa o array ORIGINAL (não modificado pelo pop)
    $nome_pesquisa = !empty($nomes_envolvidos) ? $nomes_envolvidos[0] : '';
    $ver_mais_url = $nome_pesquisa
        ? add_query_arg('s', urlencode($nome_pesquisa), home_url('/'))
        : '';

    $slider_id = 'imz-slider-' . $post_id;

    // CORRECÇÃO: Batch load de todos os artistas das músicas do slider
    $all_sub_artist_ids = [];
    $all_sub_feat_ids = [];
    foreach ($musicas as $musica) {
        $sub_id = (int) get_post_meta($musica->ID, '_imz_artista_id', true);
        if ($sub_id) $all_sub_artist_ids[] = $sub_id;
        $sub_feats = get_post_meta($musica->ID, '_imz_feat_artista_ids', true);
        if (is_array($sub_feats)) {
            $all_sub_feat_ids = array_merge($all_sub_feat_ids, array_map('intval', $sub_feats));
        }
    }
    // Um único batch load para todos os artistas do slider
    $all_slider_artists = imz_get_artistas_batch(array_merge($all_sub_artist_ids, $all_sub_feat_ids));

    ob_start();
    ?>
    <div class="imz-outras-musicas"
         style="--outras-color:<?php echo esc_attr($header_color); ?>;--outras-color-bg:<?php echo $header_color_bg; ?>;--outras-color-bdr:<?php echo $header_color_bdr; ?>;">

        <div class="imz-outras-musicas-header">
            <div class="imz-outras-musicas-icon">
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="16" height="16">
                    <path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/>
                </svg>
            </div>
            <div class="imz-outras-musicas-titulo-wrap">
                <p class="imz-outras-musicas-titulo">
                    <?php echo esc_html($titulo_exibicao); ?>
                </p>
                <p class="imz-outras-musicas-sub"><?php echo $total; ?> música<?php echo $total !== 1 ? 's' : ''; ?></p>
            </div>
            <?php if ($total > 5 && $ver_mais_url): ?>
            <a href="<?php echo esc_url($ver_mais_url); ?>"
               class="imz-outras-ver-mais-btn">
                Ver todas →
            </a>
            <?php endif; ?>
        </div>

        <div class="imz-slider-outer" id="<?php echo $slider_id; ?>" role="region" aria-label="Mais músicas do artista" tabindex="0">
            <div class="imz-slider-track">
                <?php foreach ($musicas as $musica):
                    $thumb          = get_the_post_thumbnail_url($musica->ID, 'medium');
                    $link           = get_permalink($musica->ID);
                    // CORRECÇÃO: Usar post_title directo para evitar filtros
                    // que injectam <img> badges (verificado, etc.)
                    $titulo         = get_post_field('post_title', $musica->ID);
                    $sub_artista_id = (int) get_post_meta($musica->ID, '_imz_artista_id', true);
                    // Usar dados do batch em vez de query individual
                    $sub_artista    = isset($all_slider_artists[$sub_artista_id]) ? $all_slider_artists[$sub_artista_id] : null;
                    $sub_color      = ($sub_artista && $sub_artista['color']) ? $sub_artista['color'] : '#888';
                    $sub_nome       = $sub_artista ? $sub_artista['nome'] : '';
                    $sub_feat_ids   = get_post_meta($musica->ID, '_imz_feat_artista_ids', true);
                    if (!is_array($sub_feat_ids)) $sub_feat_ids = [];
                    $feat_nomes = [];
                    foreach ($sub_feat_ids as $fid) {
                        $fid = (int)$fid;
                        if (isset($all_slider_artists[$fid])) {
                            $feat_nomes[] = $all_slider_artists[$fid]['nome'];
                        }
                    }
                ?>
                <a href="<?php echo esc_url($link); ?>"
                   class="imz-outra-musica-card imz-slide"
                   style="--outra-color:<?php echo esc_attr($sub_color); ?>;">
                    <div class="imz-outra-musica-thumb">
                        <?php if ($thumb): ?>
                            <img src="<?php echo esc_url($thumb); ?>"
                                 alt="<?php echo esc_attr($titulo); ?>"
                                 loading="lazy">
                        <?php else: ?>
                            <div class="imz-outra-musica-thumb-placeholder">🎵</div>
                        <?php endif; ?>
                        <div class="imz-outra-musica-play-icon">▶</div>
                    </div>
                    <div class="imz-outra-musica-info">
                        <p class="imz-outra-musica-titulo"><?php echo esc_html($titulo); ?></p>
                    </div>
                </a>
                <?php endforeach; ?>
            </div>

            <button class="imz-slider-btn imz-slider-prev" aria-label="Música anterior">‹</button>
            <button class="imz-slider-btn imz-slider-next" aria-label="Próxima música">›</button>

            <div class="imz-slider-dots" role="tablist" aria-label="Navegação do slider">
                <?php for ($i = 0; $i < count($musicas); $i++): ?>
                <button class="imz-slider-dot<?php echo $i === 0 ? ' active' : ''; ?>"
                        data-index="<?php echo $i; ?>"
                        aria-label="Ir para slide <?php echo $i + 1; ?>"
                        aria-selected="<?php echo $i === 0 ? 'true' : 'false'; ?>"></button>
                <?php endfor; ?>
            </div>
        </div>

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


// =============================================================================
// 8. SHORTCODES
// =============================================================================

add_shortcode('imz_artista_card', function($atts) {
    global $post;
    if (empty($post)) return '';
    return imz_render_artista_card($post->ID);
});

add_shortcode('imz_outras_musicas', function($atts) {
    global $post;
    if (empty($post)) return '';
    return imz_render_outras_musicas($post->ID);
});


// =============================================================================
// 9. INJEÇÃO AUTOMÁTICA NO CONTEÚDO
// =============================================================================

function imz_auto_inject_artista($content) {
    if (!is_singular('post') || is_admin()) return $content;

    global $post;
    $artista_id = get_post_meta($post->ID, '_imz_artista_id', true);
    $feat_ids   = get_post_meta($post->ID, '_imz_feat_artista_ids', true);
    $nao_musica = get_post_meta($post->ID, '_imz_nao_e_musica', true);

    if ($nao_musica === '1') return $content;
    if (!$artista_id && empty($feat_ids)) return $content;

    $card          = imz_render_artista_card($post->ID);
    $outras        = imz_render_outras_musicas($post->ID);
    $content       = $card . $content;
    if ($outras) $content .= $outras;

    return $content;
}
add_filter('the_content', 'imz_auto_inject_artista', 5);


// =============================================================================
// 10. ENQUEUE ASSETS DO ARTISTA
// =============================================================================

function imz_enqueue_artista_assets() {
    if (!is_singular('post')) return;
    global $post;
    $artista_id = get_post_meta($post->ID, '_imz_artista_id', true);
    $feat_ids   = get_post_meta($post->ID, '_imz_feat_artista_ids', true);
    if (!$artista_id && empty($feat_ids)) return;

    wp_enqueue_style(
        'imz-artista-styles',
        IMZ_URL . 'assets/artista-card.css',
        wp_style_is('imz-design-tokens', 'registered') ? ['imz-design-tokens'] : [],
        imz_asset_version('assets/artista-card.css')
    );
    wp_enqueue_script(
        'imz-artista-script',
        IMZ_URL . 'assets/artista-card.js',
        [],
        imz_asset_version('assets/artista-card.js'),
        true
    );
    wp_localize_script('imz-artista-script', 'imz_follow_data', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('imz_follow_nonce'),
    ]);
}
add_action('wp_enqueue_scripts', 'imz_enqueue_artista_assets', 999);


// =============================================================================
// 11. AJAX — Pesquisa de artista no admin
// =============================================================================

add_action('wp_ajax_imz_search_artistas', function() {
    check_ajax_referer('imz_search_artistas_nonce', 'nonce');
    $s = sanitize_text_field($_POST['s'] ?? '');
    $posts = get_posts(['post_type'=>'imz_artista','post_status'=>'publish','s'=>$s,'posts_per_page'=>20]);
    $results = array_map(fn($p) => ['id'=>$p->ID,'text'=>$p->post_title], $posts);
    wp_send_json_success($results);
});


// =============================================================================
// 12. SISTEMA DE SEGUIDORES (FOLLOW) — NOVO
// -----------------------------------------------------------------------------
// "Seguir" a sério: guarda seguidores numa tabela própria e mostra a contagem.
// Funciona para utilizadores autenticados (por user_id) e visitantes anónimos
// (por um identificador guardado em cookie). Impede duplicados via UNIQUE KEY.
// =============================================================================

/**
 * Cria a tabela de seguidores se ainda não existir.
 */
function imz_install_follows_table() {
    global $wpdb;
    $table = $wpdb->prefix . 'imz_artist_follows';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        artista_id bigint(20) NOT NULL,
        follower_key varchar(64) NOT NULL,
        follower_type varchar(10) NOT NULL DEFAULT 'guest',
        user_id bigint(20) NOT NULL DEFAULT 0,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY unique_follow (artista_id, follower_key),
        INDEX idx_artista (artista_id),
        INDEX idx_user (user_id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(IMZ_DIR . 'impulsionamento-musicas.php', 'imz_install_follows_table');

// Auto-criar a tabela se faltar (uma verificação barata por opção).
add_action('init', function () {
    if (get_option('imz_follows_db_ready') === '1') return;
    global $wpdb;
    $table = $wpdb->prefix . 'imz_artist_follows';
    if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $table)) !== $table) {
        imz_install_follows_table();
    }
    update_option('imz_follows_db_ready', '1', false);
});

/**
 * Devolve um identificador estável para o visitante atual.
 * Autenticado -> 'u:<user_id>'. Anónimo -> 'g:<token-cookie>'.
 */
function imz_get_follower_identity() {
    if (is_user_logged_in()) {
        return ['key' => 'u:' . get_current_user_id(), 'type' => 'user', 'user_id' => get_current_user_id()];
    }
    $cookie = 'imz_fid';
    if (!empty($_COOKIE[$cookie]) && preg_match('/^[a-f0-9]{32}$/', $_COOKIE[$cookie])) {
        $token = $_COOKIE[$cookie];
    } else {
        $token = md5(wp_generate_uuid4() . microtime());
        // Cookie de 1 ano; só servidor não, precisa ser lido pelo PHP.
        @setcookie($cookie, $token, time() + YEAR_IN_SECONDS, COOKIEPATH ?: '/', COOKIE_DOMAIN);
        $_COOKIE[$cookie] = $token;
    }
    return ['key' => 'g:' . $token, 'type' => 'guest', 'user_id' => 0];
}

/**
 * Conta os seguidores de um artista.
 */
function imz_get_follow_count($artista_id) {
    global $wpdb;
    $artista_id = (int) $artista_id;
    if (!$artista_id) return 0;
    $table = $wpdb->prefix . 'imz_artist_follows';
    $count = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM $table WHERE artista_id = %d", $artista_id
    ));
    return (int) $count;
}

/**
 * Verifica se o visitante atual já segue este artista.
 */
function imz_is_following($artista_id) {
    global $wpdb;
    $artista_id = (int) $artista_id;
    if (!$artista_id) return false;
    $identity = imz_get_follower_identity();
    $table = $wpdb->prefix . 'imz_artist_follows';
    $found = $wpdb->get_var($wpdb->prepare(
        "SELECT id FROM $table WHERE artista_id = %d AND follower_key = %s",
        $artista_id, $identity['key']
    ));
    return !empty($found);
}

/**
 * Formata um número de seguidores (1234 -> "1.2K").
 */
function imz_format_follow_count($n) {
    $n = (int) $n;
    if ($n >= 1000000) return rtrim(rtrim(number_format($n / 1000000, 1), '0'), '.') . 'M';
    if ($n >= 1000)    return rtrim(rtrim(number_format($n / 1000, 1), '0'), '.') . 'K';
    return (string) $n;
}

/**
 * AJAX: alternar seguir/deixar de seguir.
 */
add_action('wp_ajax_imz_toggle_follow', 'imz_ajax_toggle_follow');
add_action('wp_ajax_nopriv_imz_toggle_follow', 'imz_ajax_toggle_follow');
function imz_ajax_toggle_follow() {
    check_ajax_referer('imz_follow_nonce', 'nonce');

    $artista_id = isset($_POST['artista_id']) ? (int) $_POST['artista_id'] : 0;
    $post = $artista_id ? get_post($artista_id) : null;
    if (!$post || $post->post_type !== 'imz_artista') {
        wp_send_json_error(['message' => 'Artista inválido.']);
    }

    global $wpdb;
    $table = $wpdb->prefix . 'imz_artist_follows';
    $identity = imz_get_follower_identity();

    $existing = $wpdb->get_var($wpdb->prepare(
        "SELECT id FROM $table WHERE artista_id = %d AND follower_key = %s",
        $artista_id, $identity['key']
    ));

    if ($existing) {
        $wpdb->delete($table, ['id' => (int) $existing], ['%d']);
        $following = false;
    } else {
        $wpdb->insert($table, [
            'artista_id'    => $artista_id,
            'follower_key'  => $identity['key'],
            'follower_type' => $identity['type'],
            'user_id'       => $identity['user_id'],
        ], ['%d', '%s', '%s', '%d']);
        $following = true;
    }

    $count = imz_get_follow_count($artista_id);
    wp_send_json_success([
        'following'     => $following,
        'count'         => $count,
        'count_display' => imz_format_follow_count($count),
    ]);
}
