<?php
/**
 * includes/distribution/distribution-splits-phases.php
 *
 * ============================================================================
 * GESTÃO DE FASES DE EDIÇÃO DE SPLITS — 1.5.120
 * ============================================================================
 *
 * Os splits NÃO são uma preferência — são um contrato de distribuição de
 * receita. Mudanças têm de ter fricção proporcional ao impacto.
 *
 * 3 FASES:
 *
 *   FASE 1 — Pre-live (release ainda em wizard/review/aprovação, sem royalties)
 *     - Edição livre.
 *     - Limite: máximo 3 alterações por release nos primeiros 30 dias após
 *       a primeira edição (anti-abuso, não anti-uso). Reset automático fora
 *       da janela.
 *
 *   FASE 2 — Live mas sem royalties (release nas lojas, ainda nada chegou)
 *     - Edição com confirmação dupla no UI ("Esta release já está nas lojas").
 *     - Sem limite de alterações (raramente acontecem nesta fase).
 *
 *   FASE 3 — Royalties já gerados (qualquer holding existe, paga ou não)
 *     - Edição direta BLOQUEADA.
 *     - Artista vê splits actuais read-only + botão "Pedir alteração".
 *     - Pedido vai para tabela `rmbz_split_change_requests`.
 *     - Admin avalia e decide caso-a-caso o que fazer com holdings antigas
 *       (devolver ao owner / manter com colaborador / redistribuir).
 *
 * PERMISSÕES:
 *   - Só o artista principal (owner da release) pode editar OU pedir alteração.
 *
 * NOTAS DE ARQUITECTURA:
 *   - Detecção de fase via `rmbz_splits_get_release_phase($release_id)`.
 *     Único ponto de verdade — se mudar regra, muda aqui.
 *   - Tabela nova: `rmbz_split_change_requests` (criada via maybe_install).
 *   - Hooks: respeita o padrão `rmbz_track_splits_saved` para classificação
 *     pós-aprovação.
 */

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


/* ============================================================================
 * SCHEMA — tabela de pedidos de alteração
 * ============================================================================ */

function rmbz_splits_phases_maybe_install() {
    $stored = get_option('rmbz_splits_phases_schema_v', '0');
    if ( version_compare( $stored, '1.0', '>=' ) ) return;

    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE {$wpdb->prefix}rmbz_split_change_requests (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        release_id bigint(20) NOT NULL,
        track_id bigint(20) NOT NULL,
        requester_telemovel varchar(20) NOT NULL,
        reason text DEFAULT NULL,
        proposed_splits longtext NOT NULL,
        current_splits_snapshot longtext DEFAULT NULL,
        phase_at_request varchar(20) DEFAULT NULL,
        status varchar(20) DEFAULT 'pending' NOT NULL,
        admin_decision varchar(40) DEFAULT NULL,
        admin_note text DEFAULT NULL,
        admin_actor varchar(80) DEFAULT NULL,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        decided_at datetime DEFAULT NULL,
        PRIMARY KEY  (id),
        KEY idx_release (release_id),
        KEY idx_track (track_id),
        KEY idx_requester (requester_telemovel),
        KEY idx_status (status)
    ) ENGINE=InnoDB $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );

    update_option('rmbz_splits_phases_schema_v', '1.0');
}
add_action('admin_init', 'rmbz_splits_phases_maybe_install', 8);
add_action('init', 'rmbz_splits_phases_maybe_install', 9);


/* ============================================================================
 * DETECÇÃO DE FASE
 * ============================================================================ */

/**
 * Devolve a fase actual de uma release.
 *
 * @param int $release_id
 * @return string 'phase1' | 'phase2' | 'phase3' | 'unknown'
 */
function rmbz_splits_get_release_phase( $release_id ) {
    global $wpdb;
    $release_id = (int) $release_id;
    if ( $release_id <= 0 ) return 'unknown';

    // 1. Status da release
    $status = $wpdb->get_var( $wpdb->prepare(
        "SELECT status FROM {$wpdb->prefix}rmbz_distro_releases WHERE id = %d",
        $release_id
    ) );
    if ( ! $status ) return 'unknown';

    // 2. Há holdings registadas para esta release?
    //    Qualquer holding (mesmo pending_approval=1) significa que royalties
    //    já chegaram à plataforma e foram afectados a colaboradores. Mudar
    //    splits depois deste ponto sem decisão admin é destrutivo.
    $has_holdings = (int) $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_splits_holdings
         WHERE release_id = %d
           AND ( reverted_at IS NULL )",
        $release_id
    ) );

    if ( $has_holdings > 0 ) return 'phase3';

    // Fase 2 — release nas lojas mas ainda sem royalties.
    $is_live = in_array( $status, [ 'live', 'distribuido' ], true );
    if ( $is_live ) return 'phase2';

    // Fase 1 — wizard / review / aprovação / etc.
    return 'phase1';
}


/**
 * Helper: a release pode ser editada directamente neste momento?
 * (Falso para fase 3.)
 */
function rmbz_splits_can_edit_directly( $release_id ) {
    $phase = rmbz_splits_get_release_phase( $release_id );
    return in_array( $phase, [ 'phase1', 'phase2' ], true );
}


/* ============================================================================
 * RATE LIMIT — Fase 1
 * ============================================================================ */

/**
 * Verifica e regista uma alteração na janela de rate-limit (3 por 30 dias).
 *
 * @return array [ 'ok' => bool, 'count' => int, 'limit' => int, 'message' => string ]
 */
function rmbz_splits_phase1_rate_check( $release_id, $register = false ) {
    global $wpdb;
    $limit = 3;
    $window_days = 30;

    $tbl_audit = $wpdb->prefix . 'rmbz_splits_audit';

    // Conta alterações da release dentro da janela (action LIKE 'frontend_save%').
    $count = (int) $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM $tbl_audit
         WHERE release_id = %d
           AND action LIKE 'frontend_save%%'
           AND created_at >= DATE_SUB(NOW(), INTERVAL %d DAY)",
        (int) $release_id, $window_days
    ) );

    if ( $count >= $limit ) {
        return [
            'ok'      => false,
            'count'   => $count,
            'limit'   => $limit,
            'message' => sprintf(
                'Atingiste o limite de %d alterações de splits nos últimos %d dias para esta release. ' .
                'Esta restrição existe para proteger os teus colaboradores. Se precisas mesmo de mudar, ' .
                'usa "Pedir alteração" para o admin avaliar.',
                $limit, $window_days
            ),
        ];
    }

    return [ 'ok' => true, 'count' => $count, 'limit' => $limit, 'message' => '' ];
}


/* ============================================================================
 * AJAX — Pedido de alteração (Fase 3)
 * ============================================================================ */

function rmbz_ajax_splits_request_change() {
    $release_id = isset($_POST['release_id']) ? (int) $_POST['release_id'] : 0;
    $track_id   = isset($_POST['track_id'])   ? (int) $_POST['track_id']   : 0;
    $nonce      = $_POST['nonce'] ?? '';
    $reason     = isset($_POST['reason']) ? sanitize_textarea_field( wp_unslash($_POST['reason']) ) : '';

    if ( ! wp_verify_nonce($nonce, 'rmbz_splits_frontend_' . $release_id) ) {
        wp_send_json_error('Erro de segurança.', 403);
    }
    if ( $release_id <= 0 || $track_id <= 0 ) {
        wp_send_json_error('IDs inválidos.', 400);
    }
    if ( ! function_exists('rmbz_splits_user_owns_release')
         || ! rmbz_splits_user_owns_release($release_id) ) {
        wp_send_json_error('Sem permissão para esta release.', 403);
    }

    // Só faz sentido pedir alteração se estamos em fase que bloqueia edição.
    // Em fase 1/2 o utilizador devia editar directamente.
    $phase = rmbz_splits_get_release_phase( $release_id );
    if ( $phase !== 'phase3' ) {
        wp_send_json_error(
            'Esta release ainda permite edição directa. Usa o botão de editar splits em vez de pedir alteração.',
            400
        );
    }

    if ( strlen($reason) < 10 ) {
        wp_send_json_error('Descreve a razão da alteração (mínimo 10 caracteres).', 400);
    }

    // Decode dos splits propostos
    $proposed_raw = $_POST['proposed_splits'] ?? '[]';
    $proposed = json_decode( wp_unslash($proposed_raw), true );
    if ( ! is_array($proposed) ) {
        wp_send_json_error('Formato dos splits propostos inválido.', 400);
    }

    // Validação básica do payload (mesma lógica do save normal).
    $sum = 0.0;
    $clean = [];
    foreach ( $proposed as $s ) {
        $name = trim( sanitize_text_field( $s['name'] ?? '' ) );
        $tel  = trim( sanitize_text_field( $s['telemovel'] ?? '' ) );
        $role = sanitize_key( $s['role'] ?? 'feature' );
        $pct  = (float) ( $s['percentage'] ?? 0 );

        if ( empty($name) ) continue;
        if ( $pct <= 0 ) continue;
        if ( $pct > 100 ) {
            wp_send_json_error('Percentagem inválida em "' . $name . '".', 400);
        }
        if ( empty($tel) ) {
            wp_send_json_error('Telemóvel obrigatório para "' . $name . '".', 400);
        }
        if ( function_exists('rmbz_splits_normalize_telemovel') ) {
            $norm = rmbz_splits_normalize_telemovel($tel);
            if ( ! empty($norm) ) $tel = $norm;
        }
        $clean[] = [
            'name'       => $name,
            'telemovel'  => $tel,
            'role'       => $role,
            'percentage' => round($pct, 2),
        ];
        $sum += $pct;
    }
    if ( $sum > 100.01 ) {
        wp_send_json_error('Soma das percentagens propostas excede 100%.', 400);
    }

    // Snapshot dos splits actuais (para o admin comparar)
    global $wpdb;
    $current = [];
    if ( function_exists('rmbz_track_get_splits') ) {
        $current = rmbz_track_get_splits( $track_id );
    }

    // Verificar se já existe pedido pendente para esta track
    $existing = (int) $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_split_change_requests
         WHERE track_id = %d AND status = 'pending'",
        $track_id
    ) );
    if ( $existing > 0 ) {
        wp_send_json_error(
            'Já existe um pedido pendente para esta faixa. Aguarda decisão do admin antes de submeter outro.',
            409
        );
    }

    $tel_owner = function_exists('rmbz_get_current_user_telemovel')
        ? rmbz_get_current_user_telemovel() : '';

    $ok = $wpdb->insert(
        $wpdb->prefix . 'rmbz_split_change_requests',
        [
            'release_id'              => $release_id,
            'track_id'                => $track_id,
            'requester_telemovel'     => $tel_owner,
            'reason'                  => $reason,
            'proposed_splits'         => wp_json_encode( $clean ),
            'current_splits_snapshot' => wp_json_encode( $current ),
            'phase_at_request'        => $phase,
            'status'                  => 'pending',
        ],
        [ '%d', '%d', '%s', '%s', '%s', '%s', '%s', '%s' ]
    );

    if ( ! $ok ) {
        wp_send_json_error('Erro ao registar o pedido. Tenta de novo.', 500);
    }

    $request_id = (int) $wpdb->insert_id;

    // Notificar admin (reusa email-manager se existir, senão usa wp_mail simples)
    rmbz_splits_phases_notify_admin_new_request( $request_id );

    wp_send_json_success([
        'request_id' => $request_id,
        'message'    => 'Pedido enviado. O admin vai avaliar e contactar-te.',
    ]);
}
add_action('wp_ajax_rmbz_splits_request_change', 'rmbz_ajax_splits_request_change');
// [1.5.208] Sem nopriv, pedir mudança de splits no painel artista falhava
// para users com sessão telefone (sem conta WP).
add_action('wp_ajax_nopriv_rmbz_splits_request_change', 'rmbz_ajax_splits_request_change');


/**
 * Notifica o admin sobre novo pedido.
 */
function rmbz_splits_phases_notify_admin_new_request( $request_id ) {
    $admin_email = get_option('admin_email');
    if ( empty($admin_email) ) return;

    global $wpdb;
    $req = $wpdb->get_row( $wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}rmbz_split_change_requests WHERE id = %d",
        (int) $request_id
    ) );
    if ( ! $req ) return;

    /* [1.5.158] Mesmo fix do bug das tabs: slug correcto é
       rmbz-admin-distribution&tab=split_requests. */
    $admin_url = admin_url('admin.php?page=rmbz-admin-distribution&tab=split_requests');

    $subject = sprintf( '[1MZ] Novo pedido de alteração de splits #%d', $req->id );
    $body  = "Novo pedido de alteração de splits:\n\n";
    $body .= "ID do pedido: #" . $req->id . "\n";
    $body .= "Release ID: " . $req->release_id . "\n";
    $body .= "Track ID: " . $req->track_id . "\n";
    $body .= "Requerente: " . $req->requester_telemovel . "\n";
    $body .= "Razão:\n" . $req->reason . "\n\n";
    $body .= "Avaliar em: " . $admin_url . "\n";

    wp_mail( $admin_email, $subject, $body );
}


/* ============================================================================
 * ADMIN UI — listagem e decisão
 * ============================================================================ */

/**
 * Render da tabela de pedidos pendentes/históricos no admin.
 * Chamado a partir de admin-distribution-advanced.php (tab nova).
 */
function rmbz_splits_phases_render_admin_panel() {
    if ( ! current_user_can('manage_options') ) {
        echo '<p>Sem permissões.</p>';
        return;
    }

    // Decisão submetida?
    if ( isset($_POST['rmbz_split_req_decide']) && check_admin_referer('rmbz_split_req_decide') ) {
        rmbz_splits_phases_handle_admin_decision();
    }

    global $wpdb;
    $tbl = $wpdb->prefix . 'rmbz_split_change_requests';

    /* [1.5.157] Whitelist de filtros para defesa em profundidade.
       'all' → sem filtro (mostra tudo).
       [1.5.158] Param renomeado para `split_filter` para evitar conflito
       com qualquer outro `filter` consumido pelo controller. */
    $allowed_filters = ['pending', 'approved', 'rejected', 'all'];
    $filter_raw = isset($_GET['split_filter']) ? sanitize_key($_GET['split_filter']) : 'pending';
    $filter = in_array($filter_raw, $allowed_filters, true) ? $filter_raw : 'pending';

    $where = '';
    $params = [];
    if ( in_array($filter, ['pending', 'approved', 'rejected'], true) ) {
        $where = 'WHERE status = %s';
        $params[] = $filter;
    }

    $sql = "SELECT * FROM $tbl $where ORDER BY created_at DESC LIMIT 100";
    $rows = $params
        ? $wpdb->get_results( $wpdb->prepare($sql, ...$params) )
        : $wpdb->get_results($sql);

    /* [1.5.157] Contagens por estado para mostrar nas tabs. */
    $counts = [
        'pending'  => (int) $wpdb->get_var("SELECT COUNT(*) FROM $tbl WHERE status = 'pending'"),
        'approved' => (int) $wpdb->get_var("SELECT COUNT(*) FROM $tbl WHERE status = 'approved'"),
        'rejected' => (int) $wpdb->get_var("SELECT COUNT(*) FROM $tbl WHERE status = 'rejected'"),
        'all'      => (int) $wpdb->get_var("SELECT COUNT(*) FROM $tbl"),
    ];

    echo '<div class="wrap">';
    echo '<h1 style="display:flex;align-items:center;gap:10px;">🤝 Pedidos de Alteração de Splits</h1>';
    echo '<p style="color:var(--rmbz-text-muted, #666); margin-top:4px;">Aprovar ou rejeitar pedidos de alteração de divisão de royalties enviados pelos artistas (Fase 3 do sistema de splits).</p>';

    /* [1.5.158] Bug fix igual ao 1.5.155 mas para splits:
       Antes apontava para `rmbz-distribution-advanced&tab=split-requests`
       que NÃO EXISTE — a página real é `rmbz-admin-distribution&tab=split_requests`
       (com underscore, conforme switch case em admin-distribution-controller.php:145).
       Usamos `split_filter` (não `filter`) para evitar conflito com qualquer
       outro `filter` que o controller possa consumir. */
    $base = admin_url('admin.php?page=rmbz-admin-distribution&tab=split_requests');
    $tabs = [
        'pending'  => ['⏳ Pendentes', $counts['pending']],
        'approved' => ['✓ Aprovados', $counts['approved']],
        'rejected' => ['✗ Rejeitados', $counts['rejected']],
        'all'      => ['📋 Todos', $counts['all']],
    ];
    echo '<h2 class="nav-tab-wrapper" style="margin-top:14px;">';
    foreach ( $tabs as $k => $info ) {
        $url = esc_url( $base . '&split_filter=' . $k );
        $active = ($filter === $k) ? ' nav-tab-active' : '';
        printf(
            '<a href="%s" class="nav-tab%s">%s (%d)</a>',
            $url, $active, esc_html($info[0]), (int) $info[1]
        );
    }
    echo '</h2>';

    if ( empty($rows) ) {
        echo '<div style="background:#fff;border:1px solid var(--rmbz-border-subtle, #e5e5e5);border-radius:6px;padding:32px;text-align:center;color:var(--rmbz-text-muted, #888);margin-top:14px;">';
        echo '<p style="margin:0;font-size:14px;">📭 Nenhum pedido encontrado neste filtro.</p>';
        echo '</div>';
        echo '</div>';
        return;
    }

    echo '<table class="widefat striped"><thead><tr>';
    echo '<th>ID</th><th>Release</th><th>Track</th><th>Requerente</th>';
    echo '<th>Razão</th><th>Estado</th><th>Quando</th><th>Acção</th>';
    echo '</tr></thead><tbody>';

    foreach ( $rows as $r ) {
        $rel_title = $wpdb->get_var( $wpdb->prepare(
            "SELECT title FROM {$wpdb->prefix}rmbz_distro_releases WHERE id = %d", $r->release_id
        ) );
        $track_title = $wpdb->get_var( $wpdb->prepare(
            "SELECT track_title FROM {$wpdb->prefix}rmbz_distro_tracks WHERE id = %d", $r->track_id
        ) );

        echo '<tr>';
        echo '<td>#' . (int) $r->id . '</td>';
        echo '<td>' . esc_html( $rel_title ?: '(removida)' ) . ' <small>#' . (int) $r->release_id . '</small></td>';
        echo '<td>' . esc_html( $track_title ?: '(removida)' ) . '</td>';
        echo '<td><code>' . esc_html( $r->requester_telemovel ) . '</code></td>';
        echo '<td><div style="max-width:300px;">' . esc_html( wp_trim_words( $r->reason, 25 ) ) . '</div></td>';

        /* [1.5.157] Cores das badges via tokens DS (consistência visual). */
        $badge_color = [
            'pending'  => 'var(--rmbz-warning, #f59e0b)',
            'approved' => 'var(--rmbz-success-strong, #059669)',
            'rejected' => 'var(--rmbz-danger-strong, #dc2626)',
        ];
        $bc = $badge_color[$r->status] ?? 'var(--rmbz-text-muted, #888)';
        echo '<td><span style="background:' . esc_attr($bc) . ';color:#fff;padding:2px 8px;border-radius:3px;font-size:11px;font-weight:600;">'
             . esc_html(ucfirst($r->status)) . '</span></td>';
        echo '<td>' . esc_html( $r->created_at ) . '</td>';
        echo '<td><a href="#" class="button button-small" onclick="rmbzSplitReqOpen(' . (int) $r->id . '); return false;">Ver / Decidir</a></td>';
        echo '</tr>';

        // Linha expandida (esconder por defeito)
        echo '<tr id="rmbz-split-req-row-' . (int) $r->id . '" style="display:none;background:#fafafa;"><td colspan="8">';
        rmbz_splits_phases_render_request_detail( $r );
        echo '</td></tr>';
    }
    echo '</tbody></table>';

    // JS toggle
    ?>
    <script>
    function rmbzSplitReqOpen(id) {
        var row = document.getElementById('rmbz-split-req-row-' + id);
        if (!row) return;
        row.style.display = (row.style.display === 'none' || !row.style.display) ? '' : 'none';
    }
    </script>
    <?php

    echo '</div>';
}


function rmbz_splits_phases_render_request_detail( $req ) {
    $current = json_decode( $req->current_splits_snapshot, true ) ?: [];
    $proposed = json_decode( $req->proposed_splits, true ) ?: [];

    echo '<div style="display:grid;grid-template-columns:1fr 1fr;gap:20px;padding:14px;">';

    // Coluna 1 — splits actuais
    echo '<div>';
    echo '<h4>Splits actuais (snapshot)</h4>';
    if ( empty($current) ) {
        echo '<p style="color:#888;">Nenhum split actual.</p>';
    } else {
        echo '<table class="widefat striped" style="font-size:12px;"><thead><tr>';
        echo '<th>Nome</th><th>Tel</th><th>Função</th><th>%</th>';
        echo '</tr></thead><tbody>';
        foreach ( $current as $s ) {
            echo '<tr>';
            echo '<td>' . esc_html( $s['collaborator_name'] ?? $s['name'] ?? '' ) . '</td>';
            echo '<td><code>' . esc_html( $s['collaborator_telemovel'] ?? $s['telemovel'] ?? '' ) . '</code></td>';
            echo '<td>' . esc_html( $s['role'] ?? '' ) . '</td>';
            echo '<td>' . esc_html( number_format( (float) ($s['percentage'] ?? 0), 2 ) ) . '%</td>';
            echo '</tr>';
        }
        echo '</tbody></table>';
    }
    echo '</div>';

    // Coluna 2 — splits propostos
    echo '<div>';
    echo '<h4>Splits propostos</h4>';
    if ( empty($proposed) ) {
        echo '<p style="color:#888;">Nenhum split proposto (artista quer remover todos).</p>';
    } else {
        echo '<table class="widefat striped" style="font-size:12px;"><thead><tr>';
        echo '<th>Nome</th><th>Tel</th><th>Função</th><th>%</th>';
        echo '</tr></thead><tbody>';
        foreach ( $proposed as $s ) {
            echo '<tr>';
            echo '<td>' . esc_html( $s['name'] ?? '' ) . '</td>';
            echo '<td><code>' . esc_html( $s['telemovel'] ?? '' ) . '</code></td>';
            echo '<td>' . esc_html( $s['role'] ?? '' ) . '</td>';
            echo '<td>' . esc_html( number_format( (float) ($s['percentage'] ?? 0), 2 ) ) . '%</td>';
            echo '</tr>';
        }
        echo '</tbody></table>';
    }
    echo '</div>';

    echo '</div>'; // grid

    // Holdings existentes (informativo)
    global $wpdb;
    $holdings = $wpdb->get_results( $wpdb->prepare(
        "SELECT h.*, s.collaborator_name FROM {$wpdb->prefix}rmbz_splits_holdings h
         LEFT JOIN {$wpdb->prefix}rmbz_track_splits s ON h.split_id = s.id
         WHERE h.track_id = %d AND h.reverted_at IS NULL
         ORDER BY h.created_at DESC LIMIT 50",
        (int) $req->track_id
    ) );

    if ( ! empty($holdings) ) {
        echo '<div style="margin:14px;padding:12px;background:#fff8e1;border-left:4px solid #f0b90b;">';
        echo '<strong>⚠ Holdings existentes nesta faixa:</strong><br>';
        echo '<table class="widefat" style="font-size:11px;margin-top:8px;"><thead><tr>';
        echo '<th>Colaborador</th><th>Tel</th><th>USD</th><th>Status</th><th>Quando</th>';
        echo '</tr></thead><tbody>';
        foreach ( $holdings as $h ) {
            $st = $h->claimed_at ? 'reclamado' : ( $h->pending_approval ? 'pending' : 'disponível' );
            echo '<tr>';
            echo '<td>' . esc_html( $h->collaborator_name ?: '—' ) . '</td>';
            echo '<td><code>' . esc_html($h->collaborator_telemovel) . '</code></td>';
            echo '<td>$' . esc_html( number_format( (float) $h->amount_usd, 4 ) ) . '</td>';
            echo '<td>' . esc_html($st) . '</td>';
            echo '<td>' . esc_html($h->created_at) . '</td>';
            echo '</tr>';
        }
        echo '</tbody></table>';
        echo '<p style="margin:6px 0 0;font-size:11px;color:#666;">Decide o que fazer com estas holdings ao escolher a acção abaixo.</p>';
        echo '</div>';
    }

    // Razão completa
    echo '<div style="margin:14px;padding:12px;background:#fff;border:1px solid #ddd;">';
    echo '<strong>Razão completa do pedido:</strong>';
    echo '<p style="white-space:pre-wrap;margin:6px 0 0;">' . esc_html( $req->reason ) . '</p>';
    echo '</div>';

    // Form de decisão (só se pendente)
    if ( $req->status !== 'pending' ) {
        echo '<div style="margin:14px;padding:12px;background:#f0f0f0;">';
        echo '<strong>Decisão:</strong> ' . esc_html( ucfirst($req->status) );
        if ( $req->admin_decision ) {
            echo ' <em>(' . esc_html($req->admin_decision) . ')</em>';
        }
        if ( $req->admin_note ) {
            echo '<p style="white-space:pre-wrap;margin:6px 0 0;">' . esc_html($req->admin_note) . '</p>';
        }
        echo '<small>Por: ' . esc_html($req->admin_actor) . ' em ' . esc_html($req->decided_at) . '</small>';
        echo '</div>';
        return;
    }

    ?>
    <div style="margin:14px;padding:14px;background:#eef5ff;border:1px solid #b3d4f5;">
        <strong>Decidir este pedido</strong>
        <form method="post" style="margin-top:10px;">
            <?php wp_nonce_field('rmbz_split_req_decide'); ?>
            <input type="hidden" name="rmbz_split_req_decide" value="1">
            <input type="hidden" name="request_id" value="<?php echo (int) $req->id; ?>">

            <p>
                <label><strong>Acção sobre os splits:</strong></label><br>
                <label><input type="radio" name="decision" value="approve_replace" required>
                    ✅ <strong>Aprovar e substituir</strong> — splits propostos passam a vigorar; splits antigos são apagados.
                </label><br>
                <label><input type="radio" name="decision" value="reject">
                    ❌ <strong>Rejeitar</strong> — manter splits actuais como estão.
                </label>
            </p>

            <p>
                <label><strong>Acção sobre holdings já existentes (se houver):</strong></label><br>
                <label><input type="radio" name="holdings_action" value="keep" checked>
                    🔒 <strong>Manter</strong> — holdings já alocadas ficam com colaboradores actuais. Splits novos só aplicam a royalties futuros.
                </label><br>
                <label><input type="radio" name="holdings_action" value="return_to_owner">
                    ↩ <strong>Devolver ao artista principal</strong> — converte holdings antigas para wallet do owner (USD→MT via taxa).
                </label><br>
                <label><input type="radio" name="holdings_action" value="revert">
                    🗑 <strong>Reverter</strong> — marca holdings antigas como `reverted_at` (não pagam a ninguém; ficam no log).
                </label><br>
                <small style="color:#666;">Aplica-se só se a decisão acima for "Aprovar e substituir".</small>
            </p>

            <p>
                <label for="admin_note"><strong>Nota interna / mensagem para o artista:</strong></label><br>
                <textarea name="admin_note" id="admin_note" rows="3" style="width:100%;" required></textarea>
            </p>

            <p>
                <button type="submit" class="button button-primary">Confirmar decisão</button>
            </p>
        </form>
    </div>
    <?php
}


function rmbz_splits_phases_handle_admin_decision() {
    if ( ! current_user_can('manage_options') ) return;

    $request_id = isset($_POST['request_id']) ? (int) $_POST['request_id'] : 0;
    $decision   = isset($_POST['decision']) ? sanitize_key($_POST['decision']) : '';
    $holdings_action = isset($_POST['holdings_action']) ? sanitize_key($_POST['holdings_action']) : 'keep';
    $note       = isset($_POST['admin_note']) ? sanitize_textarea_field( wp_unslash($_POST['admin_note']) ) : '';

    if ( $request_id <= 0 ) return;
    if ( ! in_array($decision, ['approve_replace', 'reject'], true) ) return;
    if ( ! in_array($holdings_action, ['keep', 'return_to_owner', 'revert'], true) ) {
        $holdings_action = 'keep';
    }

    global $wpdb;
    $tbl = $wpdb->prefix . 'rmbz_split_change_requests';
    $req = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $tbl WHERE id = %d", $request_id) );
    if ( ! $req ) return;
    if ( $req->status !== 'pending' ) {
        echo '<div class="notice notice-warning"><p>Este pedido já tinha sido decidido.</p></div>';
        return;
    }

    $current_user = wp_get_current_user();
    $actor = $current_user ? $current_user->user_login : 'admin';

    $new_status = ($decision === 'approve_replace') ? 'approved' : 'rejected';
    $admin_decision_full = $decision . ($decision === 'approve_replace' ? '+' . $holdings_action : '');

    // Aplicar mudança se aprovado
    if ( $decision === 'approve_replace' ) {
        $proposed = json_decode( $req->proposed_splits, true ) ?: [];

        // 1. Tratar holdings antigas conforme escolha
        if ( $holdings_action === 'revert' ) {
            $wpdb->query( $wpdb->prepare(
                "UPDATE {$wpdb->prefix}rmbz_splits_holdings
                 SET reverted_at = NOW()
                 WHERE track_id = %d AND reverted_at IS NULL",
                (int) $req->track_id
            ) );
        } elseif ( $holdings_action === 'return_to_owner' ) {
            // Converter holdings em USD para wallet MT do owner (via função existente).
            // NOTA: respeita a regra arquitectural — USD nunca vai directo para MT;
            // tem de passar por rmbz_secure_transfer_usd_to_mt.
            $owner_tel = $wpdb->get_var( $wpdb->prepare(
                "SELECT artist_telemovel FROM {$wpdb->prefix}rmbz_distro_releases WHERE id = %d",
                (int) $req->release_id
            ) );

            $holdings = $wpdb->get_results( $wpdb->prepare(
                "SELECT * FROM {$wpdb->prefix}rmbz_splits_holdings
                 WHERE track_id = %d AND reverted_at IS NULL AND claimed_at IS NULL",
                (int) $req->track_id
            ) );

            $total_returned_usd = 0.0;
            foreach ( $holdings as $h ) {
                $total_returned_usd += (float) $h->amount_usd;
            }

            if ( $total_returned_usd > 0 && function_exists('rmbz_secure_transfer_usd_to_mt') ) {
                $marker = '[split_change_request:' . $request_id . ']';
                $result = rmbz_secure_transfer_usd_to_mt( $owner_tel, $total_returned_usd, $marker );
                if ( ! $result || ( is_array($result) && empty($result['ok']) ) ) {
                    $note .= "\n\n⚠ ATENÇÃO: tentativa de devolver $" . number_format($total_returned_usd, 4) .
                             " ao owner falhou. Verificar manualmente.";
                }
            }

            // Marcar holdings como revertidas
            $wpdb->query( $wpdb->prepare(
                "UPDATE {$wpdb->prefix}rmbz_splits_holdings
                 SET reverted_at = NOW()
                 WHERE track_id = %d AND reverted_at IS NULL AND claimed_at IS NULL",
                (int) $req->track_id
            ) );
        }
        // 'keep' = nada a fazer com holdings existentes

        // 2. Substituir splits — delete antigos + insert novos (mesmo padrão do save normal)
        $t_splits = $wpdb->prefix . 'rmbz_track_splits';
        $wpdb->delete( $t_splits, [ 'track_id' => (int) $req->track_id ], [ '%d' ] );
        foreach ( (array) $proposed as $sp ) {
            $wpdb->insert( $t_splits, [
                'track_id'               => (int) $req->track_id,
                'release_id'             => (int) $req->release_id,
                'collaborator_name'      => $sp['name'],
                'collaborator_telemovel' => $sp['telemovel'],
                'role'                   => $sp['role'],
                'percentage'             => (float) $sp['percentage'],
                'invite_status'          => 'pending',
            ], [ '%d', '%d', '%s', '%s', '%s', '%f', '%s' ] );
        }

        // 3. Hook de classificação/notificação dos novos colaboradores
        do_action( 'rmbz_track_splits_saved', (int) $req->track_id );

        // 4. Audit
        if ( function_exists('rmbz_splits_audit') ) {
            rmbz_splits_audit(
                'change_request_approved',
                (int) $req->track_id,
                (int) $req->release_id,
                null,
                $req->current_splits_snapshot,
                $req->proposed_splits,
                'Pedido #' . $request_id . ' aprovado por ' . $actor . '. Holdings: ' . $holdings_action
            );
        }
    } else {
        // Rejected — só audit
        if ( function_exists('rmbz_splits_audit') ) {
            rmbz_splits_audit(
                'change_request_rejected',
                (int) $req->track_id,
                (int) $req->release_id,
                null,
                $req->current_splits_snapshot,
                $req->proposed_splits,
                'Pedido #' . $request_id . ' rejeitado por ' . $actor . '. Nota: ' . $note
            );
        }
    }

    // Actualizar registo do pedido
    $wpdb->update(
        $tbl,
        [
            'status'         => $new_status,
            'admin_decision' => $admin_decision_full,
            'admin_note'     => $note,
            'admin_actor'    => $actor,
            'decided_at'     => current_time('mysql'),
        ],
        [ 'id' => $request_id ],
        [ '%s', '%s', '%s', '%s', '%s' ],
        [ '%d' ]
    );

    // Notificar requerente por SMS/email se houver helpers
    if ( function_exists('rmbz_notify_user') ) {
        $msg = $new_status === 'approved'
            ? "✅ O teu pedido de alteração de splits #{$request_id} foi aprovado. " . $note
            : "❌ O teu pedido de alteração de splits #{$request_id} foi rejeitado. " . $note;
        rmbz_notify_user( $req->requester_telemovel, $msg );
    }

    echo '<div class="notice notice-success"><p>Decisão registada com sucesso.</p></div>';
}
