<?php
/**
 * includes/admin/admin-distribution-settings.php
 *
 * Página de configurações dedicada à distribuição musical.
 *
 * O QUE RESOLVE:
 *   Ao longo das versões fui acrescentando várias options WP (taxa do
 *   artista, prefixos UPC/ISRC, janela de takedown, listas de fraude,
 *   etc.) com a nota "podes editar via update_option, settings page no
 *   futuro". Este ficheiro é essa settings page.
 *
 * ONDE FICA:
 *   Aparece como sub-menu do "1MZ Distribuição" no admin: tab "⚙ Configurações".
 *   Para chegar lá: WP-Admin → 1MZ Distribuição → Configurações.
 *
 * COMO FUNCIONA:
 *   - Usa a Settings API do WordPress (mesmo padrão do admin-settings.php
 *     existente, mas em grupo separado para não interferir).
 *   - Cada secção tem hint textual a explicar o impacto da option.
 *   - Validação por callback de sanitize por campo.
 *   - Botão "Restaurar valor por defeito" em cada campo crítico.
 */

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


/* ============================================================================
 * REGISTAR OPTIONS + CAMPOS
 * ============================================================================ */

function rmbz_distro_settings_register() {
    $group = 'rmbz_distro_settings_group';
    $page  = 'rmbz-distro-settings';

    /* ---------- ROYALTIES & CÓDIGOS ---------- */

    register_setting( $group, 'rmbz_artist_share_pct', [
        'sanitize_callback' => 'rmbz_distro_settings_sanitize_pct',
        'default'           => 70,
    ]);
    register_setting( $group, 'rmbz_upc_prefix', [
        'sanitize_callback' => 'rmbz_distro_settings_sanitize_digits',
        'default'           => '858',
    ]);
    register_setting( $group, 'rmbz_isrc_country', [
        'sanitize_callback' => 'rmbz_distro_settings_sanitize_iso2',
        'default'           => 'MZ',
    ]);
    register_setting( $group, 'rmbz_isrc_registrant', [
        'sanitize_callback' => 'rmbz_distro_settings_sanitize_alnum_upper',
        'default'           => '0AB',
    ]);

    add_settings_section(
        'rmbz_distro_section_codes',
        '💰 Royalties & Códigos',
        function() {
            echo '<p style="font-size:13px; color:#555; max-width:760px;">
                Define a tua quota como plataforma e os prefixos usados para gerar UPCs e ISRCs.
                <strong>Atenção:</strong> mudar estes valores afecta apenas releases <em>futuros</em> —
                releases já existentes mantêm os códigos que tinham.
            </p>';
        },
        $page
    );
    add_settings_field( 'rmbz_artist_share_pct', '% que o artista recebe',
        'rmbz_distro_settings_field_artist_share_pct', $page, 'rmbz_distro_section_codes' );
    add_settings_field( 'rmbz_upc_prefix', 'Prefixo UPC (GS1)',
        'rmbz_distro_settings_field_upc_prefix', $page, 'rmbz_distro_section_codes' );
    add_settings_field( 'rmbz_isrc_country', 'País do ISRC',
        'rmbz_distro_settings_field_isrc_country', $page, 'rmbz_distro_section_codes' );
    add_settings_field( 'rmbz_isrc_registrant', 'Registrant ISRC',
        'rmbz_distro_settings_field_isrc_registrant', $page, 'rmbz_distro_section_codes' );


    /* ---------- TAKEDOWN ---------- */

    register_setting( $group, 'rmbz_takedown_min_days_after_live', [
        'sanitize_callback' => 'absint',
        'default'           => 30,
    ]);

    add_settings_section(
        'rmbz_distro_section_takedown',
        '🗑 Pedidos de Takedown',
        function() {
            echo '<p style="font-size:13px; color:#555; max-width:760px;">
                Configura quando os artistas podem pedir para retirar uma música das lojas.
            </p>';
        },
        $page
    );
    add_settings_field( 'rmbz_takedown_min_days_after_live', 'Janela mínima depois de live (dias)',
        'rmbz_distro_settings_field_takedown_min_days', $page, 'rmbz_distro_section_takedown' );


    /* ---------- FRAUD DETECTION ---------- */

    register_setting( $group, 'rmbz_fraud_blocked_words', [
        'sanitize_callback' => 'rmbz_distro_settings_sanitize_word_list',
        'default'           => null, // usa default da função
    ]);
    register_setting( $group, 'rmbz_fraud_famous_artists_hint', [
        'sanitize_callback' => 'rmbz_distro_settings_sanitize_word_list',
        'default'           => null,
    ]);

    add_settings_section(
        'rmbz_distro_section_fraud',
        '🚨 Detecção de Fraude (Lote 3)',
        function() {
            echo '<p style="font-size:13px; color:#555; max-width:760px;">
                Listas que alimentam o painel "Análise de risco" no detalhe de cada release.
                Os flags são <strong>heurísticos</strong> — não bloqueiam aprovação automaticamente,
                apenas alertam o revisor. Ampliar estas listas com termos relevantes para PT-MZ
                (changana, macua, etc.) torna o sistema mais útil.
            </p>';
        },
        $page
    );
    add_settings_field( 'rmbz_fraud_blocked_words', 'Palavras problemáticas (drogas, ódio)',
        'rmbz_distro_settings_field_blocked_words', $page, 'rmbz_distro_section_fraud' );
    add_settings_field( 'rmbz_fraud_famous_artists_hint', 'Artistas famosos (copycat detection)',
        'rmbz_distro_settings_field_famous_artists', $page, 'rmbz_distro_section_fraud' );


    /* ---------- [1.5.211] PLAGIARISM DETECTION (FINGERPRINTING) ---------- */

    register_setting( $group, 'rmbz_fp_acoustid_key', [
        'sanitize_callback' => 'sanitize_text_field',
        'default'           => '',
    ]);

    add_settings_section(
        'rmbz_distro_section_fingerprint',
        '🔍 Detecção de Plágio (Fingerprinting)',
        function() {
            $env = function_exists('rmbz_fp_check_environment') ? rmbz_fp_check_environment() : null;
            ?>
            <p style="font-size:13px; color:#555; max-width:760px;">
                Análise acústica das faixas submetidas para detectar fraude/plágio.
                Combina <strong>3 estratégias gratuitas</strong>: SHA256 (duplicados exactos),
                Chromaprint (fingerprint acústico) e <a href="https://acoustid.org" target="_blank">AcoustID</a> (base global de ~50M tracks via MusicBrainz).
            </p>
            <p style="font-size:13px; color:#555; max-width:760px;">
                <strong>Limitações:</strong> NÃO é Content ID. Não detecta beats roubados nem samples curtos. Cobertura limitada para artistas africanos não-globais.
            </p>
            <?php if ( $env ): ?>
                <table style="background:#f9fafb; border:1px solid #e5e7eb; padding:8px 12px; font-size:12px; border-radius:4px; max-width:760px; border-collapse:collapse;">
                    <tr>
                        <td style="padding:4px 8px; color:#666;">fpcalc (Chromaprint)</td>
                        <td style="padding:4px 8px;">
                            <?php if ( $env['fpcalc'] ): ?>
                                <span style="color:#10b981;">✓ Instalado</span> <small style="color:#888;"><?php echo esc_html($env['fpcalc_path']); ?></small>
                            <?php else: ?>
                                <span style="color:#dc2626;">✗ Não instalado</span> — <code>apt install libchromaprint-tools</code>
                            <?php endif; ?>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding:4px 8px; color:#666;">cURL</td>
                        <td style="padding:4px 8px;"><?php echo $env['curl'] ? '<span style="color:#10b981;">✓ Disponível</span>' : '<span style="color:#dc2626;">✗ Faltando</span>'; ?></td>
                    </tr>
                    <tr>
                        <td style="padding:4px 8px; color:#666;">exec()</td>
                        <td style="padding:4px 8px;"><?php echo $env['exec'] ? '<span style="color:#10b981;">✓ Disponível</span>' : '<span style="color:#dc2626;">✗ Bloqueado</span>'; ?></td>
                    </tr>
                </table>
            <?php endif; ?>
            <?php
        },
        $page
    );
    add_settings_field( 'rmbz_fp_acoustid_key', 'API key AcoustID',
        'rmbz_distro_settings_field_acoustid_key', $page, 'rmbz_distro_section_fingerprint' );
}
add_action( 'admin_init', 'rmbz_distro_settings_register' );


/* ============================================================================
 * SANITIZE CALLBACKS
 * ============================================================================ */

function rmbz_distro_settings_sanitize_pct( $val ) {
    $n = (float) $val;
    if ( $n < 0 ) $n = 0;
    if ( $n > 100 ) $n = 100;
    return round( $n, 2 );
}

function rmbz_distro_settings_sanitize_digits( $val ) {
    $clean = preg_replace('/\D/', '', (string) $val);
    if ( $clean === '' ) $clean = '858';
    // UPC prefix tem entre 3 e 12 dígitos (GS1)
    if ( strlen($clean) > 12 ) $clean = substr($clean, 0, 12);
    return $clean;
}

function rmbz_distro_settings_sanitize_iso2( $val ) {
    $val = strtoupper( preg_replace('/[^A-Za-z]/', '', (string) $val) );
    if ( strlen($val) !== 2 ) return 'MZ';
    return $val;
}

function rmbz_distro_settings_sanitize_alnum_upper( $val ) {
    $val = strtoupper( preg_replace('/[^A-Za-z0-9]/', '', (string) $val) );
    if ( strlen($val) > 5 ) $val = substr($val, 0, 5);
    if ( $val === '' ) $val = '0AB';
    return $val;
}

function rmbz_distro_settings_sanitize_word_list( $val ) {
    if ( is_string($val) ) {
        // Tem que vir do textarea — uma palavra por linha
        $lines = preg_split('/\r\n|\r|\n/', $val);
        $clean = [];
        foreach ( $lines as $line ) {
            $line = trim( $line );
            if ( $line === '' ) continue;
            if ( strlen($line) > 100 ) $line = substr($line, 0, 100);
            $clean[] = $line;
        }
        return array_values( array_unique( $clean ) );
    }
    if ( is_array($val) ) {
        return array_values( array_unique( array_filter( array_map('trim', $val) ) ) );
    }
    return [];
}


/* ============================================================================
 * FIELD CALLBACKS
 * ============================================================================ */

function rmbz_distro_settings_field_artist_share_pct() {
    $v = (float) get_option('rmbz_artist_share_pct', 70);
    ?>
    <input type="number" name="rmbz_artist_share_pct" value="<?php echo esc_attr($v); ?>"
           min="0" max="100" step="0.01" style="width:80px;"> %
    <p class="description">
        Percentagem dos royalties paga ao artista. A 1MZ fica com o restante (<?php echo number_format(100 - $v, 2); ?>%).
        Default <strong>70%</strong>. Aplicado a partir do próximo import de royalties.
    </p>
    <?php
}

function rmbz_distro_settings_field_upc_prefix() {
    $v = (string) get_option('rmbz_upc_prefix', '858');
    ?>
    <input type="text" name="rmbz_upc_prefix" value="<?php echo esc_attr($v); ?>"
           pattern="[0-9]{3,12}" style="width:120px; font-family:monospace;">
    <p class="description">
        Prefixo GS1 usado quando a 1MZ gera UPCs automaticamente. Default <strong>858</strong>
        (prefixo genérico). Se tens prefixo GS1 próprio registado em nome da 1MZ Records, usa-o.
        Apenas dígitos, 3–12 caracteres.
    </p>
    <?php
}

function rmbz_distro_settings_field_isrc_country() {
    $v = (string) get_option('rmbz_isrc_country', 'MZ');
    ?>
    <input type="text" name="rmbz_isrc_country" value="<?php echo esc_attr($v); ?>"
           maxlength="2" style="width:60px; font-family:monospace; text-transform:uppercase;">
    <p class="description">
        Código ISO 3166-1 alpha-2 do país. Default <strong>MZ</strong> (Moçambique).
        Sempre 2 letras maiúsculas. Faz parte do ISRC: <code>MZ-0AB-26-00001</code>.
    </p>
    <?php
}

function rmbz_distro_settings_field_isrc_registrant() {
    $v = (string) get_option('rmbz_isrc_registrant', '0AB');
    ?>
    <input type="text" name="rmbz_isrc_registrant" value="<?php echo esc_attr($v); ?>"
           maxlength="5" style="width:80px; font-family:monospace; text-transform:uppercase;">
    <p class="description">
        Código de registrant emitido pela IFPI Moçambique para a 1MZ Records.
        Default <strong>0AB</strong> (placeholder — substitui pelo código real assim que o tiveres).
        3 caracteres alfanuméricos.
    </p>
    <?php
}

function rmbz_distro_settings_field_takedown_min_days() {
    $v = (int) get_option('rmbz_takedown_min_days_after_live', 30);
    ?>
    <input type="number" name="rmbz_takedown_min_days_after_live" value="<?php echo esc_attr($v); ?>"
           min="0" max="365" step="1" style="width:80px;"> dias
    <p class="description">
        Quantos dias o release tem que estar live nas lojas antes do artista poder
        pedir takedown. Default <strong>30</strong> dias. Põe <strong>0</strong> para
        desactivar a regra (artista pode pedir a qualquer momento).
    </p>
    <?php
}

function rmbz_distro_settings_field_blocked_words() {
    $v = get_option('rmbz_fraud_blocked_words', null);
    if ( ! is_array($v) && function_exists('rmbz_fraud_default_blocked_words') ) {
        $v = rmbz_fraud_default_blocked_words();
    }
    if ( ! is_array($v) ) $v = [];
    $text = implode("\n", $v);
    ?>
    <textarea name="rmbz_fraud_blocked_words" rows="8" style="width:100%; max-width:480px; font-family:monospace; font-size:12px;"
              placeholder="Uma palavra ou expressão por linha&#10;Ex:&#10;cocaina&#10;heroina"><?php echo esc_textarea($text); ?></textarea>
    <p class="description">
        Uma palavra ou expressão por linha. Detecta termos em títulos de release/faixa.
        <strong>Match por palavra inteira</strong> (não disparam dentro de outra palavra).
        Currentemente <strong><?php echo count($v); ?></strong> termos.
    </p>
    <?php
}

function rmbz_distro_settings_field_famous_artists() {
    $v = get_option('rmbz_fraud_famous_artists_hint', null);
    if ( ! is_array($v) && function_exists('rmbz_fraud_default_famous_artists') ) {
        $v = rmbz_fraud_default_famous_artists();
    }
    if ( ! is_array($v) ) $v = [];
    $text = implode("\n", $v);
    ?>
    <textarea name="rmbz_fraud_famous_artists_hint" rows="8" style="width:100%; max-width:480px; font-family:monospace; font-size:12px;"
              placeholder="Um nome de artista por linha&#10;Ex:&#10;Mr. Bow&#10;Beyoncé"><?php echo esc_textarea($text); ?></textarea>
    <p class="description">
        Um nome por linha. Usado para detectar copycats — submissões com nome idêntico
        ou muito parecido (Levenshtein ≤ 2) com qualquer destes nomes.
        Currentemente <strong><?php echo count($v); ?></strong> nomes.
    </p>
    <?php
}


/* ============================================================================
 * UI — RENDER DA PÁGINA
 * ----------------------------------------------------------------------------
 * Chamada pelo admin-distribution-controller.php quando tab=settings.
 * Devolve via output buffer (controller é que faz echo).
 * ============================================================================ */

function rmbz_render_admin_distribution_settings() {
    if ( ! current_user_can('manage_options') ) {
        echo '<div class="notice notice-error"><p>Sem permissão.</p></div>';
        return;
    }

    // Mensagem de save (Settings API)
    if ( isset($_GET['settings-updated']) ) {
        echo '<div class="notice notice-success is-dismissible"><p>✓ Configurações guardadas.</p></div>';
    }

    ?>
    <div class="wrap" style="max-width:980px;">
        <form method="post" action="options.php">
            <?php
            settings_fields( 'rmbz_distro_settings_group' );
            do_settings_sections( 'rmbz-distro-settings' );
            submit_button( '💾 Guardar configurações' );
            ?>
        </form>

        <hr style="margin:30px 0;">

        <h3>🔍 Ver valores actuais</h3>
        <p style="font-size:12px; color:#666;">
            Tabela de referência rápida — útil para auditar o estado actual antes de mudar.
        </p>
        <table class="widefat striped" style="max-width:680px;">
            <thead>
                <tr>
                    <th style="width:280px;">Option</th>
                    <th>Valor actual</th>
                </tr>
            </thead>
            <tbody>
                <?php
                $rows = [
                    'rmbz_artist_share_pct'             => (float) get_option('rmbz_artist_share_pct', 70) . ' %',
                    'rmbz_upc_prefix'                   => esc_html( get_option('rmbz_upc_prefix', '858') ),
                    'rmbz_isrc_country'                 => esc_html( get_option('rmbz_isrc_country', 'MZ') ),
                    'rmbz_isrc_registrant'              => esc_html( get_option('rmbz_isrc_registrant', '0AB') ),
                    'rmbz_takedown_min_days_after_live' => (int) get_option('rmbz_takedown_min_days_after_live', 30) . ' dias',
                    'rmbz_fraud_blocked_words'          => count( (array) get_option('rmbz_fraud_blocked_words', []) ) . ' termos',
                    'rmbz_fraud_famous_artists_hint'    => count( (array) get_option('rmbz_fraud_famous_artists_hint', []) ) . ' nomes',
                ];
                foreach ( $rows as $opt => $val ): ?>
                    <tr>
                        <td><code><?php echo esc_html($opt); ?></code></td>
                        <td><strong><?php echo $val; ?></strong></td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </div>
    <?php
}

/**
 * [1.5.211] Field: AcoustID API key
 */
function rmbz_distro_settings_field_acoustid_key() {
    $val = (string) get_option('rmbz_fp_acoustid_key', '');
    $masked = $val ? str_repeat('•', max(0, strlen($val) - 4)) . substr($val, -4) : '';
    ?>
    <input type="text" name="rmbz_fp_acoustid_key" id="rmbz_fp_acoustid_key"
           value="<?php echo esc_attr($val); ?>"
           class="regular-text"
           placeholder="Ex: aBcDeFgHiJ"
           style="font-family:monospace;">
    <p class="description" style="max-width:680px;">
        API key gratuita do AcoustID. Obter em <a href="https://acoustid.org/api-key" target="_blank">acoustid.org/api-key</a>
        (registo de 1 minuto, 100% grátis, sem cartão de crédito).
        Sem key, só funciona detecção interna (1MZ vs 1MZ).
        <?php if ( $masked ): ?>
            <br><strong>Key actual:</strong> <code><?php echo esc_html($masked); ?></code>
        <?php endif; ?>
    </p>
    <?php
}
