<?php
/**
 * includes/distribution/distribution-release-type.php
 *
 * Classificação automática de release_type (Single / EP / Álbum).
 *
 * Antes deste módulo:
 *   - A coluna `release_type` existia (varchar(20) DEFAULT 'single') mas nunca
 *     era calculada. Todos os releases ficavam como "single" por defeito.
 *   - Os filtros "Singles" e "Álbuns" no dashboard eram `<a href="#">` fake.
 *   - Mostrava-se "💿 Single" em todos os detalhes, mesmo para álbuns de 12 faixas.
 *
 * Este módulo resolve:
 *
 *   A. CLASSIFICADOR — `rmbz_classify_release_type($release_id)` aplica as
 *      regras oficiais do Spotify:
 *        • Single  → 1-3 faixas E total < 30min E nenhuma faixa ≥ 10min
 *        • EP      → 4-6 faixas com total < 30min, OU 1-3 faixas com total ≥ 30min
 *        • Álbum   → 7+ faixas, OU total ≥ 30min
 *
 *   B. PERSISTÊNCIA — sempre que um release transita para `pendente` (submissão
 *      pelo artista), o módulo recalcula e persiste o tipo. Respeita override
 *      manual se o artista o tiver forçado.
 *
 *   C. OVERRIDE — o artista pode forçar um tipo no wizard (dropdown opcional).
 *      Guardado em `extra_data.release_type_manual = 1` no release.
 *
 *   D. FILTRO DO DASHBOARD — expõe helper `rmbz_release_type_filter_clause()`
 *      que o main view usa para filtrar a listagem por tipo.
 */

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


/* ============================================================================
 * CONSTANTES E HELPERS
 * ============================================================================ */

// Limites oficiais Spotify (em segundos)
define( 'RMBZ_RELEASE_TYPE_LONG_TRACK_SECONDS',   600 );   // >= 10min torna EP
define( 'RMBZ_RELEASE_TYPE_ALBUM_THRESHOLD_SECS', 1800 );  // >= 30min = álbum
define( 'RMBZ_RELEASE_TYPE_EP_MIN_TRACKS',        4 );
define( 'RMBZ_RELEASE_TYPE_EP_MAX_TRACKS',        6 );
define( 'RMBZ_RELEASE_TYPE_ALBUM_MIN_TRACKS',     7 );


/**
 * Lê as faixas do release e devolve as durações em segundos.
 * Lê da coluna `extra_data.duration_seconds` (populada no upload).
 * Se a duração estiver ausente, tenta re-ler via wp_read_audio_metadata.
 */
function rmbz_release_type_get_durations( $release_id ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_tracks';
    $rows = $wpdb->get_results( $wpdb->prepare(
        "SELECT id, audio_url, extra_data FROM $t WHERE release_id = %d ORDER BY id ASC",
        $release_id
    ) );
    if ( empty($rows) ) return [];

    $out = [];
    foreach ( $rows as $r ) {
        $dur = 0;
        if ( ! empty($r->extra_data) ) {
            $e = json_decode( $r->extra_data, true );
            if ( is_array($e) && ! empty($e['duration_seconds']) ) {
                $dur = (int) $e['duration_seconds'];
            }
        }
        // Fallback: ler do ficheiro directamente (só se necessário)
        if ( $dur === 0 && ! empty($r->audio_url) && function_exists('wp_read_audio_metadata') ) {
            require_once( ABSPATH . 'wp-admin/includes/media.php' );
            $upload = wp_upload_dir();
            $path = str_replace( $upload['baseurl'], $upload['basedir'], $r->audio_url );
            if ( file_exists($path) ) {
                $meta = wp_read_audio_metadata( $path );
                if ( ! empty($meta['length']) ) $dur = (int) round( $meta['length'] );
            }
        }
        $out[] = $dur;
    }
    return $out;
}


/* ============================================================================
 * CLASSIFICADOR PRINCIPAL
 * ============================================================================ */

/**
 * Classifica um release segundo as regras do Spotify.
 *
 * @param int $release_id
 * @return array {
 *   type:        'single' | 'ep' | 'album'
 *   confidence:  'auto' | 'manual' | 'unknown'
 *   reason:      string (human-readable em PT)
 *   track_count: int
 *   total_secs:  int
 *   longest_secs:int
 * }
 */
function rmbz_classify_release_type( $release_id ) {
    $release_id = (int) $release_id;
    if ( $release_id <= 0 ) {
        return [
            'type' => 'single', 'confidence' => 'unknown',
            'reason' => 'ID de release inválido.',
            'track_count' => 0, 'total_secs' => 0, 'longest_secs' => 0,
        ];
    }

    $durations = rmbz_release_type_get_durations( $release_id );
    $track_count = count( $durations );
    $total       = array_sum( $durations );
    $longest     = $track_count > 0 ? max( $durations ) : 0;

    if ( $track_count === 0 ) {
        return [
            'type' => 'single', 'confidence' => 'unknown',
            'reason' => 'Sem faixas — classificado provisoriamente como Single.',
            'track_count' => 0, 'total_secs' => 0, 'longest_secs' => 0,
        ];
    }

    // Regras Spotify — ORDEM IMPORTANTE, avaliar de Álbum → EP → Single
    // porque Álbum é mais permissivo.
    $type = null;
    $reason = '';

    // ÁLBUM primeiro — 7+ faixas OU total >= 30min
    if ( $track_count >= RMBZ_RELEASE_TYPE_ALBUM_MIN_TRACKS ) {
        $type = 'album';
        $reason = sprintf( 'Álbum: %d faixas (≥ 7).', $track_count );
    } elseif ( $total >= RMBZ_RELEASE_TYPE_ALBUM_THRESHOLD_SECS ) {
        $type = 'album';
        $reason = sprintf( 'Álbum: duração total %s (≥ 30min).',
            rmbz_release_type_format_duration( $total ) );
    }

    // EP — 4-6 faixas com total < 30min, OU 1-3 faixas com total ≥ 30min
    if ( $type === null ) {
        if (
            $track_count >= RMBZ_RELEASE_TYPE_EP_MIN_TRACKS
            && $track_count <= RMBZ_RELEASE_TYPE_EP_MAX_TRACKS
        ) {
            $type = 'ep';
            $reason = sprintf( 'EP: %d faixas (4–6).', $track_count );
        } elseif (
            $track_count <= 3 && $longest >= RMBZ_RELEASE_TYPE_LONG_TRACK_SECONDS
        ) {
            // Edge case Spotify: 1-3 faixas mas com uma faixa muito longa (≥10min)
            // entra em território de "mini-EP". Mais prudente marcar EP.
            $type = 'ep';
            $reason = sprintf( 'EP: %d faixa(s) com uma de %s (≥ 10min).',
                $track_count, rmbz_release_type_format_duration( $longest ) );
        }
    }

    // SINGLE — tudo o resto (1-3 faixas curtas)
    if ( $type === null ) {
        $type = 'single';
        if ( $track_count === 1 ) {
            $reason = sprintf( 'Single: 1 faixa (%s).', rmbz_release_type_format_duration( $total ) );
        } else {
            $reason = sprintf( 'Single: %d faixas, total %s.',
                $track_count, rmbz_release_type_format_duration( $total ) );
        }
    }

    return [
        'type'         => $type,
        'confidence'   => 'auto',
        'reason'       => $reason,
        'track_count'  => $track_count,
        'total_secs'   => $total,
        'longest_secs' => $longest,
    ];
}


function rmbz_release_type_format_duration( $secs ) {
    $secs = (int) $secs;
    $m = intdiv( $secs, 60 );
    $s = $secs % 60;
    return sprintf( '%d:%02d', $m, $s );
}


/* ============================================================================
 * PERSISTÊNCIA — aplicar no momento da submissão
 * ----------------------------------------------------------------------------
 * Hook em `rmbz_distro_status_changed`. Quando destino é `pendente`
 * (submissão), reclassifica e guarda. Se o artista tiver forçado
 * override manual (extra_data.release_type_manual=1), respeita a escolha.
 * ============================================================================ */

function rmbz_release_type_on_status_change( $release_id, $from, $to, $opts = [] ) {
    if ( $to !== 'pendente' ) return;

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

    $rel = $wpdb->get_row( $wpdb->prepare(
        "SELECT extra_data, release_type FROM $t WHERE id = %d", $release_id
    ) );
    if ( ! $rel ) return;

    // Respeitar override manual
    $extra = [];
    if ( ! empty($rel->extra_data) ) {
        $decoded = json_decode( $rel->extra_data, true );
        if ( is_array($decoded) ) $extra = $decoded;
    }
    if ( ! empty($extra['release_type_manual']) ) {
        // Admin/artista forçou — não mexer
        return;
    }

    $result = rmbz_classify_release_type( $release_id );
    if ( $result['confidence'] === 'unknown' ) return;

    // Só actualiza se for diferente (evita write desnecessário)
    if ( $rel->release_type === $result['type'] ) return;

    $wpdb->update(
        $t,
        [ 'release_type' => $result['type'] ],
        [ 'id' => $release_id ],
        [ '%s' ], [ '%d' ]
    );
}
add_action( 'rmbz_distro_status_changed', 'rmbz_release_type_on_status_change', 10, 4 );


/**
 * Também hookamos directamente ao evento de submissão bem-sucedida
 * do `rmbz_safe_finalize_release`. Esta função em distribution-security.php
 * NÃO dispara `rmbz_distro_status_changed` (faz UPDATE directo sem passar
 * pelo lifecycle). Por isso, intercetamos via filter no admin_ajax_nopriv.
 *
 * Estratégia: hook posterior à action de finalize. Como a action manda
 * wp_send_json_success e termina, precisamos dum hook MAIS cedo. Usamos
 * `init` para interceptar o request quando chega e registar o classifier
 * para correr depois do INSERT em status_history.
 *
 * Solução mais limpa: hook no `rmbz_distro_status_history` insert? Não
 * existe. Vamos usar uma abordagem oportunística:
 *
 *   Sempre que o dashboard/list-view é aberto, o classifier é re-corrido
 *   para releases em status `pendente`, `approved`, `delivered` que ainda
 *   têm release_type='single' e têm 4+ faixas — estes são os casos mais
 *   prováveis de ficarem mal classificados. Corre 1x por release.
 *
 *   Isto é idempotente e barato.
 */
function rmbz_release_type_sweep_misclassified() {
    static $already_ran = false;
    if ( $already_ran ) return;
    $already_ran = true;

    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_releases';
    $tt = $wpdb->prefix . 'rmbz_distro_tracks';

    // Candidatos: releases não-incomplete com release_type='single' e 4+ faixas
    // (primeiro filtro barato)
    $candidates = $wpdb->get_col(
        "SELECT r.id FROM $t r
         WHERE r.release_type = 'single'
           AND r.status NOT IN ('incomplete','draft','rejected','returned')
           AND (SELECT COUNT(*) FROM $tt WHERE release_id = r.id) >= 4
         LIMIT 20"
    );
    foreach ( (array) $candidates as $rid ) {
        // Não reclassificar se tiver override manual
        $extra_data = $wpdb->get_var( $wpdb->prepare(
            "SELECT extra_data FROM $t WHERE id = %d", $rid
        ) );
        $extra = is_string($extra_data) ? json_decode( $extra_data, true ) : null;
        if ( is_array($extra) && ! empty($extra['release_type_manual']) ) continue;

        $result = rmbz_classify_release_type( (int) $rid );
        if ( $result['confidence'] === 'auto' && $result['type'] !== 'single' ) {
            $wpdb->update( $t,
                [ 'release_type' => $result['type'] ],
                [ 'id' => (int) $rid ],
                [ '%s' ], [ '%d' ]
            );
        }
    }
}


/* ============================================================================
 * FILTRO DO DASHBOARD
 * ----------------------------------------------------------------------------
 * Permite ao main view filtrar a listagem por release_type. Chamado pelo
 * patch em `distribution-main.php`.
 * ============================================================================ */

/**
 * Devolve a cláusula WHERE + formato a passar ao $wpdb->prepare.
 * Se filter='all' ou vazio, devolve string vazia.
 */
function rmbz_release_type_filter_clause( $filter ) {
    $filter = sanitize_key( (string) $filter );
    if ( ! in_array( $filter, ['single','ep','album'], true ) ) return '';
    return $filter;
}

/**
 * Gera a barra de filtros para colar no dashboard.
 * Mostra 4 links: Todos, Singles, EPs, Álbuns — marcando o activo.
 *
 * RESPONSIVE: em desktop (>600px) é uma fila horizontal de chips.
 *             em mobile (≤600px) vira dropdown — só o filtro activo é visível
 *             como "trigger"; toque abre lista; cada link navega normalmente.
 *             Sem JS framework — pequeno toggle vanilla embutido.
 */
function rmbz_release_type_render_filter_bar( $current_filter = 'all' ) {
    $current_filter = sanitize_key( $current_filter ?: 'all' );
    $filters = [
        'all'    => 'Todos',
        'single' => 'Singles',
        'ep'     => 'EPs',
        'album'  => 'Álbuns',
    ];

    $base = remove_query_arg( 'filter', add_query_arg( [] ) );
    $current_label = isset($filters[$current_filter]) ? $filters[$current_filter] : 'Todos';
    ?>
    <div class="rmbz-release-filters" data-rmbz-filter-bar>
        <?php // Trigger: visível APENAS em mobile (CSS) — replica o filtro activo ?>
        <button
            type="button"
            class="rmbz-rf-mobile-trigger"
            data-rmbz-filter-toggle
            aria-haspopup="true"
            aria-expanded="false">
            <span class="rmbz-rf-mobile-trigger__label"><?php echo esc_html($current_label); ?></span>
            <span class="rmbz-rf-mobile-trigger__chevron" aria-hidden="true"></span>
        </button>

        <div class="rmbz-rf-list">
        <?php foreach ( $filters as $slug => $label ):
            $url = esc_url( add_query_arg( [
                'distro_action' => 'dashboard',
                'filter' => $slug,
            ] ) );
            $is_active = ( $current_filter === $slug );
        ?>
            <a href="<?php echo $url; ?>" class="rmbz-rf-link <?php echo $is_active ? 'active' : ''; ?>">
                <?php echo esc_html($label); ?>
            </a>
        <?php endforeach; ?>
        </div>
    </div>
    <style>
    /* ========== DESKTOP (>600px) — fila horizontal de chips ========== */
    .rmbz-release-filters { display:inline-flex; gap:10px; position:relative; }
    .rmbz-rf-list { display:contents; }
    .rmbz-rf-mobile-trigger { display:none; } /* Escondido em desktop */
    .rmbz-rf-link {
        color:#fff;
        font-weight:bold;
        text-decoration:none;
        padding:4px 10px;
        border-radius:4px;
        transition:all 0.15s;
        font-size:14px;
    }
    .rmbz-rf-link:hover { background:rgba(240,185,11,0.15); color:#f0b90b; }
    .rmbz-rf-link.active {
        color:#f0b90b;
        background:rgba(240,185,11,0.1);
        border:1px solid rgba(240,185,11,0.3);
    }

    /* ========== MOBILE (≤600px) — dropdown ==========
     * O mesmo padrão UX que aplicámos nas tabs da Minha Conta:
     * só o filtro activo é visível; toque abre lista; cada link navega. */
    @media (max-width: 600px) {
        .rmbz-release-filters {
            display:block !important;
            position:relative;
            width:100%;
            max-width:200px;
        }

        .rmbz-rf-mobile-trigger {
            display:flex !important;
            align-items:center;
            justify-content:space-between;
            gap:10px;
            width:100%;
            padding:10px 14px;
            background:rgba(240,185,11,0.1);
            border:1px solid rgba(240,185,11,0.3);
            border-radius:6px;
            color:#f0b90b;
            font-weight:bold;
            font-size:14px;
            cursor:pointer;
            min-height:40px;
            font-family:inherit;
            transition:background 0.15s ease;
        }
        .rmbz-rf-mobile-trigger:hover { background:rgba(240,185,11,0.18); }

        .rmbz-rf-mobile-trigger__chevron {
            width:8px; height:8px;
            border-right:2px solid currentColor;
            border-bottom:2px solid currentColor;
            transform:translateY(-2px) rotate(45deg);
            transition:transform 0.2s ease;
        }
        .rmbz-release-filters.is-open .rmbz-rf-mobile-trigger__chevron {
            transform:translateY(2px) rotate(-135deg);
        }

        /* Lista dropdown — escondida por defeito, visível quando .is-open */
        .rmbz-rf-list {
            display:none !important;
            position:absolute;
            top:calc(100% + 4px);
            left:0;
            right:0;
            min-width:100%;
            background:#1e1e22;
            border:1px solid rgba(240,185,11,0.3);
            border-radius:6px;
            padding:6px;
            z-index:50;
            box-shadow:0 8px 24px rgba(0,0,0,0.4);
            flex-direction:column;
            gap:2px;
        }
        .rmbz-release-filters.is-open .rmbz-rf-list {
            display:flex !important;
        }

        /* Cada link como linha completa */
        .rmbz-rf-list .rmbz-rf-link {
            display:block;
            width:100%;
            padding:10px 14px;
            border-radius:4px;
            border:none !important;
            background:transparent !important;
            color:#fff !important;
            text-align:left;
        }
        .rmbz-rf-list .rmbz-rf-link:hover,
        .rmbz-rf-list .rmbz-rf-link:active {
            background:rgba(255,255,255,0.05) !important;
        }
        .rmbz-rf-list .rmbz-rf-link.active {
            background:rgba(240,185,11,0.12) !important;
            color:#f0b90b !important;
        }
    }
    </style>
    <script>
    /* Toggle do dropdown mobile dos filtros de tipo de lançamento.
     * Vanilla JS, defensivo contra duplo-load. */
    (function(){
        if (window.__rmbzFilterBarInit) return;
        window.__rmbzFilterBarInit = true;

        document.addEventListener('click', function(e) {
            const trigger = e.target.closest('[data-rmbz-filter-toggle]');
            const bar = e.target.closest('[data-rmbz-filter-bar]');

            // Clicou no trigger → alternar
            if (trigger) {
                e.preventDefault();
                const parent = trigger.closest('[data-rmbz-filter-bar]');
                if (!parent) return;
                const opening = !parent.classList.contains('is-open');
                // Fechar todos os outros antes de abrir este
                document.querySelectorAll('[data-rmbz-filter-bar].is-open').forEach(function(b){
                    b.classList.remove('is-open');
                    const t = b.querySelector('[data-rmbz-filter-toggle]');
                    if (t) t.setAttribute('aria-expanded', 'false');
                });
                if (opening) {
                    parent.classList.add('is-open');
                    trigger.setAttribute('aria-expanded', 'true');
                }
                return;
            }

            // Clicou fora de qualquer barra → fechar todas
            if (!bar) {
                document.querySelectorAll('[data-rmbz-filter-bar].is-open').forEach(function(b){
                    b.classList.remove('is-open');
                    const t = b.querySelector('[data-rmbz-filter-toggle]');
                    if (t) t.setAttribute('aria-expanded', 'false');
                });
            }
            // Clicou num link da lista → deixa o navegador navegar (não bloquear)
        });

        // Tecla ESC fecha
        document.addEventListener('keydown', function(e) {
            if (e.key === 'Escape') {
                document.querySelectorAll('[data-rmbz-filter-bar].is-open').forEach(function(b){
                    b.classList.remove('is-open');
                    const t = b.querySelector('[data-rmbz-filter-toggle]');
                    if (t) t.setAttribute('aria-expanded', 'false');
                });
            }
        });
    })();
    </script>
    <?php
}


/* ============================================================================
 * OVERRIDE MANUAL — UI do wizard
 * ----------------------------------------------------------------------------
 * Pequeno <select> opcional para o artista forçar o tipo no passo 2
 * (metadata). Se escolher algo que não seja "Auto", grava
 * extra_data.release_type_manual=1 + release_type=<escolhido>.
 * ============================================================================ */

/**
 * Handler AJAX — o artista mudou o release_type no wizard.
 * Aceita 'auto' (limpa manual), 'single', 'ep', 'album'.
 */
function rmbz_release_type_ajax_set_override() {
    if ( ! rmbz_distro_check_nonce() ) {
        wp_send_json_error('Falha de segurança.', 403);
    }
    if ( ! rmbz_is_user_logged_in() ) wp_send_json_error('Sessão expirada.', 401);

    $telemovel  = rmbz_get_current_user_telemovel();
    $release_id = isset($_POST['release_id']) ? absint($_POST['release_id']) : 0;
    $new_type   = sanitize_key( $_POST['release_type'] ?? '' );

    if ( $release_id <= 0 ) wp_send_json_error('ID inválido.');
    if ( ! in_array( $new_type, ['auto','single','ep','album'], true ) ) {
        wp_send_json_error('Tipo inválido.');
    }

    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_releases';
    $rel = $wpdb->get_row( $wpdb->prepare(
        "SELECT id, extra_data FROM $t WHERE id = %d AND artist_telemovel = %s",
        $release_id, $telemovel
    ) );
    if ( ! $rel ) wp_send_json_error('Lançamento não encontrado.', 404);

    $extra = [];
    if ( ! empty($rel->extra_data) ) {
        $decoded = json_decode( $rel->extra_data, true );
        if ( is_array($decoded) ) $extra = $decoded;
    }

    if ( $new_type === 'auto' ) {
        // Limpar override e recalcular
        unset( $extra['release_type_manual'] );
        $classification = rmbz_classify_release_type( $release_id );
        $final_type = $classification['type'];
        $label = 'Auto (recomendado)';
    } else {
        $extra['release_type_manual'] = 1;
        $final_type = $new_type;
        $label = 'Forçado: ' . strtoupper( $new_type );
    }

    $wpdb->update(
        $t,
        [
            'release_type' => $final_type,
            'extra_data'   => wp_json_encode( $extra ),
        ],
        [ 'id' => $release_id ],
        [ '%s', '%s' ], [ '%d' ]
    );

    // Para o artista ver preview actualizado
    $classification = rmbz_classify_release_type( $release_id );

    wp_send_json_success([
        'release_type' => $final_type,
        'is_manual'    => ! empty($extra['release_type_manual']),
        'label'        => $label,
        'auto_would_be' => $classification['type'],
        'auto_reason'   => $classification['reason'],
    ]);
}
add_action( 'wp_ajax_rmbz_release_type_override',        'rmbz_release_type_ajax_set_override' );
add_action( 'wp_ajax_nopriv_rmbz_release_type_override', 'rmbz_release_type_ajax_set_override' );


/**
 * Helper — devolve o tipo actual de um release + metadados de UI.
 */
function rmbz_release_type_get_current( $release_id ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_releases';
    $rel = $wpdb->get_row( $wpdb->prepare(
        "SELECT release_type, extra_data FROM $t WHERE id = %d", $release_id
    ) );
    if ( ! $rel ) {
        return [ 'type' => 'single', 'is_manual' => false ];
    }
    $extra = [];
    if ( ! empty($rel->extra_data) ) {
        $decoded = json_decode( $rel->extra_data, true );
        if ( is_array($decoded) ) $extra = $decoded;
    }
    return [
        'type'      => $rel->release_type ?: 'single',
        'is_manual' => ! empty( $extra['release_type_manual'] ),
    ];
}


/**
 * UI — badge live no wizard mostrando a classificação actual + dropdown.
 * Chamado pelo wizard no passo 3 (tracks) ou noutro sítio conveniente.
 */
/**
 * @deprecated 1.5.0 — Substituído pelo selector de tipo no Passo 1 do wizard
 *             (cards visuais Single/EP/Álbum em distribution-wizard.php).
 *             A função é mantida porque o handler AJAX rmbz_release_type_override
 *             ainda existe (para uso futuro pelo admin), mas já não é renderizada
 *             no fluxo normal. Não chamar em código novo.
 */
function rmbz_release_type_render_wizard_badge( $release_id ) {
    $release_id = (int) $release_id;
    if ( $release_id <= 0 ) return;

    $current = rmbz_release_type_get_current( $release_id );
    $classification = rmbz_classify_release_type( $release_id );
    $auto_type = $classification['type'];

    $type_labels = [
        'single' => '💿 Single',
        'ep'     => '📀 EP',
        'album'  => '💽 Álbum',
    ];
    $active_label = $type_labels[ $current['type'] ] ?? '💿 Single';

    ?>
    <div class="rmbz-release-type-badge"
         data-release-id="<?php echo $release_id; ?>"
         data-nonce="<?php echo esc_attr( wp_create_nonce('rmbz_distro_nonce') ); ?>"
         data-ajax-url="<?php echo esc_attr( admin_url('admin-ajax.php') ); ?>">
        <div class="rtb-head">
            <strong>Tipo de lançamento:</strong>
            <span class="rtb-active-type"><?php echo esc_html( $active_label ); ?></span>
            <?php if ( $current['is_manual'] ): ?>
                <span class="rtb-flag-manual" title="Definido manualmente">🔒 Manual</span>
            <?php else: ?>
                <span class="rtb-flag-auto">Auto</span>
            <?php endif; ?>
        </div>

        <div class="rtb-reason">
            <?php if ( $classification['track_count'] === 0 ): ?>
                <em style="color:#888;">Adicione pelo menos uma faixa para classificar.</em>
            <?php else: ?>
                <?php echo esc_html( $classification['reason'] ); ?>
                <?php if ( $current['is_manual'] && $current['type'] !== $auto_type ): ?>
                    <br><small style="color:#e67e22;">Auto classificaria como <strong><?php echo esc_html( $type_labels[$auto_type] ?? $auto_type ); ?></strong></small>
                <?php endif; ?>
            <?php endif; ?>
        </div>

        <div class="rtb-override">
            <label style="font-size:12px; color:#666;">Forçar tipo:</label>
            <select class="rtb-select" <?php echo $classification['track_count'] === 0 ? 'disabled' : ''; ?>>
                <option value="auto" <?php selected( ! $current['is_manual'] ); ?>>Auto (recomendado)</option>
                <option value="single" <?php selected( $current['is_manual'] && $current['type'] === 'single' ); ?>>Forçar Single</option>
                <option value="ep" <?php selected( $current['is_manual'] && $current['type'] === 'ep' ); ?>>Forçar EP</option>
                <option value="album" <?php selected( $current['is_manual'] && $current['type'] === 'album' ); ?>>Forçar Álbum</option>
            </select>
            <span class="rtb-feedback" style="margin-left:8px; font-size:12px; color:#2ecc71; display:none;">✓ Guardado</span>
        </div>
    </div>

    <style>
    .rmbz-release-type-badge {
        background: #fff;
        border: 1px solid #e0e0e0;
        border-radius: 6px;
        padding: 12px 14px;
        margin: 10px 0;
        font-size: 13px;
    }
    .rtb-head { display:flex; align-items:center; gap:10px; margin-bottom:6px; flex-wrap:wrap; }
    .rtb-active-type { font-size:14px; font-weight:600; color:#333; }
    .rtb-flag-manual { background:#fff3cd; color:#856404; padding:2px 6px; border-radius:3px; font-size:10px; font-weight:600; }
    .rtb-flag-auto { background:rgba(46,204,113,0.12); color:#155724; padding:2px 6px; border-radius:3px; font-size:10px; font-weight:600; }
    .rtb-reason { color:#666; font-size:12px; margin-bottom:8px; }
    .rtb-override { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
    .rtb-select {
        /* [1.5.179] padding-right extra (28px) para o chevron nativo do
           browser não sobrepor o texto da option seleccionada. */
        padding:4px 28px 4px 8px; font-size:12px;
    }
    </style>

    <script>
    (function(){
        var badges = document.querySelectorAll('.rmbz-release-type-badge:not(.rtb-bound)');
        badges.forEach(function(b) {
            b.classList.add('rtb-bound');
            var select = b.querySelector('.rtb-select');
            var feedback = b.querySelector('.rtb-feedback');
            var releaseId = b.getAttribute('data-release-id');
            if ( ! select ) return;
            select.addEventListener('change', function() {
                var val = select.value;
                var ajaxUrl = b.getAttribute('data-ajax-url') || (typeof ajaxurl !== 'undefined' ? ajaxurl : '/wp-admin/admin-ajax.php');
                var nonceVal = b.getAttribute('data-nonce') || '';

                var fd = new FormData();
                fd.append('action', 'rmbz_release_type_override');
                fd.append('release_id', releaseId);
                fd.append('release_type', val);
                fd.append('nonce', nonceVal);

                fetch(ajaxUrl, { method: 'POST', body: fd, credentials: 'same-origin' })
                    .then(function(r){ return r.json(); })
                    .then(function(resp){
                        if ( resp && resp.success ) {
                            feedback.style.display = 'inline';
                            feedback.style.color = '#2ecc71';
                            feedback.textContent = '✓ ' + (resp.data.label || 'Guardado');
                            setTimeout(function(){ location.reload(); }, 800);
                        } else {
                            feedback.style.display = 'inline';
                            feedback.style.color = '#e74c3c';
                            feedback.textContent = '✗ ' + (resp && resp.data ? resp.data : 'Erro');
                        }
                    })
                    .catch(function(){
                        feedback.style.display = 'inline';
                        feedback.style.color = '#e74c3c';
                        feedback.textContent = '✗ Erro de rede';
                    });
            });
        });
    })();
    </script>
    <?php
}
