<?php
// includes/distribution/distribution-return-workflow.php
//
// Sistema de "devolver ao artista para correcção".
// Adiciona um novo status `returned` entre `pendente` e `rejected`/`live`.
// O artista recebe lista de problemas e prazo para corrigir.
//
// Schema adicional em rmbz_distro_releases:
//   - returned_at        datetime
//   - return_deadline    datetime   (geralmente +7 dias após returned_at)
//   - return_problems    longtext   (JSON: array de {code, label, note})
//   - return_count       int        (quantas vezes já foi devolvido)
//
// Workflow:
//   pendente ──(devolver)──> returned ──(artista corrige)──> pendente
//                              │
//                              └──(prazo expira)──> incomplete

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


/* ============================================================================
 * SCHEMA — adicionar colunas via ALTER TABLE seguro
 *
 * [BUG-SCHEMA3 2026-04-23] Hardening:
 *   - Antes: marcava versão 1.0 mesmo se o ALTER falhasse silenciosamente
 *     (sem permissão, tabela bloqueada, etc.). Resultado: instalações onde
 *     o ALTER falhou ficavam com a opção em 1.0 mas sem as colunas, e o
 *     guard impedia nova tentativa. Erro só aparecia quando o admin tentava
 *     "devolver" um release.
 *   - Agora: bumpada versão para 1.1 (força re-correr nas instalações
 *     afectadas) e só grava a versão depois de **confirmar** que TODAS as
 *     colunas existem após os ALTERs.
 *   - Também: o functions-setup.php passou a ter estas colunas no CREATE
 *     TABLE, portanto este patch é agora um fallback secundário (caso o
 *     dbDelta principal não corra por algum motivo).
 * ============================================================================ */
function rmbz_return_workflow_schema_install() {
    $stored = get_option('rmbz_return_workflow_schema_v', '0');
    if ( version_compare( $stored, '1.1', '>=' ) ) return;

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

    // Se a tabela ainda não existe (instalação muito antiga), sair silenciosamente.
    // O dbDelta principal cria-a e este patch volta a correr depois.
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$table'" ) !== $table ) return;

    // Verificar colunas existentes
    $existing_cols = $wpdb->get_col( "SHOW COLUMNS FROM $table" );

    $to_add = [
        'returned_at'     => "ADD COLUMN returned_at DATETIME DEFAULT NULL",
        'return_deadline' => "ADD COLUMN return_deadline DATETIME DEFAULT NULL",
        'return_problems' => "ADD COLUMN return_problems LONGTEXT DEFAULT NULL",
        'return_count'    => "ADD COLUMN return_count INT NOT NULL DEFAULT 0",
    ];

    foreach ( $to_add as $col => $ddl ) {
        if ( ! in_array($col, $existing_cols, true) ) {
            $wpdb->query( "ALTER TABLE $table $ddl" );
        }
    }

    // [BUG-SCHEMA3] Verificar se TODAS as colunas existem antes de marcar
    // versão como instalada. Se alguma falhou, deixar como está para tentar
    // de novo na próxima carga do admin.
    $cols_after = $wpdb->get_col( "SHOW COLUMNS FROM $table" );
    $all_present = true;
    foreach ( array_keys($to_add) as $col ) {
        if ( ! in_array($col, $cols_after, true) ) {
            $all_present = false;
            error_log( '[1MZ] return_workflow: ALTER TABLE falhou para ' . $col . ' (' . $wpdb->last_error . ')' );
            break;
        }
    }

    if ( $all_present ) {
        update_option('rmbz_return_workflow_schema_v', '1.1');
    }
}
add_action('admin_init', 'rmbz_return_workflow_schema_install', 7);
add_action('init',       'rmbz_return_workflow_schema_install', 7);


/* ============================================================================
 * LISTA DE CÓDIGOS DE PROBLEMAS
 * ============================================================================ */
function rmbz_return_problem_codes() {
    return [
        // Áudio
        'audio_low_quality'      => ['group' => 'Áudio', 'label' => 'Qualidade de áudio baixa ou inconsistente'],
        'audio_clipping'         => ['group' => 'Áudio', 'label' => 'Clipping ou distorção audível'],
        'audio_silence'          => ['group' => 'Áudio', 'label' => 'Silêncio longo no início/fim'],
        'audio_wrong_version'    => ['group' => 'Áudio', 'label' => 'Versão errada da faixa (instrumental, rascunho, etc.)'],
        'audio_noise'            => ['group' => 'Áudio', 'label' => 'Ruído de fundo ou chiado'],

        // Capa
        'cover_low_resolution'   => ['group' => 'Capa', 'label' => 'Resolução baixa (mínimo 1400×1400)'],
        'cover_not_square'       => ['group' => 'Capa', 'label' => 'Capa não é quadrada (1:1)'],
        'cover_third_party_logo' => ['group' => 'Capa', 'label' => 'Contém logos de terceiros (Spotify, Apple, etc.)'],
        'cover_offensive'        => ['group' => 'Capa', 'label' => 'Conteúdo ofensivo ou inapropriado'],
        'cover_blurry'           => ['group' => 'Capa', 'label' => 'Imagem borrada ou comprimida'],
        'cover_misleading'       => ['group' => 'Capa', 'label' => 'Capa enganosa ou imita artista famoso'],

        // Metadata
        'metadata_title_wrong'   => ['group' => 'Metadata', 'label' => 'Título mal escrito ou com erros'],
        'metadata_artist_wrong'  => ['group' => 'Metadata', 'label' => 'Nome do artista mal escrito'],
        'metadata_feat_missing'  => ['group' => 'Metadata', 'label' => 'Falta "feat." nos colaboradores'],
        'metadata_songwriter'    => ['group' => 'Metadata', 'label' => 'Compositores (songwriters) em falta ou errados'],
        'metadata_language'      => ['group' => 'Metadata', 'label' => 'Idioma declarado não corresponde à letra'],
        'metadata_explicit'      => ['group' => 'Metadata', 'label' => 'Conteúdo explícito não declarado'],
        'metadata_isrc_conflict' => ['group' => 'Metadata', 'label' => 'ISRC já existe no sistema'],

        // Direitos
        'rights_unclear_cover'   => ['group' => 'Direitos', 'label' => 'É cover mas não declarado'],
        'rights_sample_issue'    => ['group' => 'Direitos', 'label' => 'Contém sample não autorizado'],
        'rights_copyright'       => ['group' => 'Direitos', 'label' => 'Possível violação de direitos autorais'],

        // Outro
        'other'                  => ['group' => 'Outro', 'label' => 'Outro problema (ver nota)'],
    ];
}

function rmbz_return_problem_label( $code ) {
    $codes = rmbz_return_problem_codes();
    return $codes[$code]['label'] ?? $code;
}


/* ============================================================================
 * ACÇÃO — devolver ao artista
 * ============================================================================ */
function rmbz_distro_return_release( $release_id, $problems, $note, $deadline_days = 7 ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_releases';

    $current = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $t WHERE id = %d", $release_id) );
    if ( ! $current ) return new WP_Error('not_found', 'Lançamento não encontrado.');

    // Sanitizar lista de problemas
    $valid_codes = array_keys( rmbz_return_problem_codes() );
    $problems_clean = [];
    foreach ( (array) $problems as $p ) {
        $code = sanitize_key( $p['code'] ?? '' );
        if ( ! in_array($code, $valid_codes, true) ) continue;
        $problems_clean[] = [
            'code'  => $code,
            'label' => rmbz_return_problem_label($code),
            'note'  => sanitize_text_field( $p['note'] ?? '' ),
        ];
    }

    if ( empty($problems_clean) ) {
        return new WP_Error('no_problems', 'Seleccione pelo menos um problema.');
    }

    $now      = current_time('mysql');
    $deadline = date('Y-m-d H:i:s', strtotime('+' . (int) $deadline_days . ' days', strtotime($now)));

    $updated = $wpdb->update( $t,
        [
            'status'          => 'returned',
            'returned_at'     => $now,
            'return_deadline' => $deadline,
            'return_problems' => wp_json_encode([
                'problems'  => $problems_clean,
                'note'      => sanitize_textarea_field( $note ),
                'issued_by' => ( $u = wp_get_current_user() ) && $u->exists() ? $u->user_login : 'admin',
                'issued_at' => $now,
            ]),
            'return_count'    => (int) ( $current->return_count ?? 0 ) + 1,
        ],
        [ 'id' => $release_id ],
        [ '%s','%s','%s','%s','%d' ],
        [ '%d' ]
    );

    if ( $updated === false ) {
        return new WP_Error('db_error', 'Erro na base de dados: ' . $wpdb->last_error);
    }

    // Log de auditoria
    if ( function_exists('rmbz_admin_log_status_change') ) {
        $summary = count($problems_clean) . ' problema(s): ' . implode(', ', array_map(fn($p) => $p['code'], $problems_clean));
        if ( $note ) $summary .= ' | ' . $note;
        rmbz_admin_log_status_change( $release_id, $current->status, 'returned', $summary );
    }

    do_action('rmbz_distro_status_changed', $release_id, $current->status, 'returned');
    do_action('rmbz_distro_release_returned', $release_id, $problems_clean, $note);

    return true;
}


/* ============================================================================
 * ACÇÃO — artista reabrir (ao editar, muda de returned → pendente)
 * Chamada pelo handler de finalizar / re-submit
 * ============================================================================ */
function rmbz_distro_resubmit_release( $release_id, $telemovel ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_distro_releases';

    $current = $wpdb->get_row( $wpdb->prepare(
        "SELECT * FROM $t WHERE id = %d AND artist_telemovel = %s",
        $release_id, $telemovel
    ) );
    if ( ! $current ) return new WP_Error('not_found', 'Sem permissão ou não encontrado.');
    if ( $current->status !== 'returned' ) {
        return new WP_Error('bad_status', 'Apenas lançamentos devolvidos podem ser re-submetidos.');
    }

    $updated = $wpdb->update( $t,
        [
            'status'       => 'pendente',
            'submitted_at' => current_time('mysql'),
        ],
        [ 'id' => $release_id ],
        [ '%s', '%s' ],
        [ '%d' ]
    );

    if ( $updated === false ) {
        return new WP_Error('db_error', $wpdb->last_error);
    }

    if ( function_exists('rmbz_admin_log_status_change') ) {
        rmbz_admin_log_status_change(
            $release_id, 'returned', 'pendente',
            'Re-submetido pelo artista após correcções (tentativa #' . ( (int) ( $current->return_count ?? 0 ) + 1 ) . ')'
        );
    }

    // [1.5.188] Hook para sistemas que dependem do estado de "returned"
    // (notificações inline com banner "X foi devolvido" — agora obsoletas).
    do_action( 'rmbz_release_resubmitted', (int) $release_id, (string) $telemovel );

    return true;
}


/* ============================================================================
 * HELPER — ler problemas do release
 * ============================================================================ */
function rmbz_distro_get_return_data( $release ) {
    if ( empty($release->return_problems) ) return null;
    $decoded = json_decode( $release->return_problems, true );
    if ( ! is_array($decoded) ) return null;
    return $decoded;
}

function rmbz_distro_return_is_overdue( $release ) {
    if ( empty($release->return_deadline) ) return false;
    return strtotime($release->return_deadline) < time();
}

function rmbz_distro_return_days_left( $release ) {
    if ( empty($release->return_deadline) ) return 0;
    $diff = strtotime($release->return_deadline) - time();
    return max(0, (int) ceil( $diff / 86400 ));
}


/* ============================================================================
 * PAINEL PARA O ARTISTA — mostra problemas no topo do wizard
 * ============================================================================ */
function rmbz_render_return_panel_for_artist( $release ) {
    if ( empty($release) || $release->status !== 'returned' ) return;
    $data = rmbz_distro_get_return_data( $release );
    if ( ! $data ) return;

    $problems = $data['problems'] ?? [];
    $note     = $data['note'] ?? '';
    $issued_by = $data['issued_by'] ?? 'admin';
    $issued_at = $data['issued_at'] ?? '';
    $deadline  = $release->return_deadline ?? '';
    $days_left = rmbz_distro_return_days_left( $release );
    $overdue   = rmbz_distro_return_is_overdue( $release );

    // Agrupar problemas por grupo
    $codes = rmbz_return_problem_codes();
    $by_group = [];
    foreach ( $problems as $p ) {
        $grp = $codes[ $p['code'] ]['group'] ?? 'Outro';
        $by_group[ $grp ][] = $p;
    }

    // [DS 1.5.47] Ícone SVG inline (em vez do emoji ⟲) — consistente com
    // o resto do plugin modernizado.
    $icon_return = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="22" height="22">'
                 . '<path d="M3 12a9 9 0 109-9M3 12l4-4M3 12l4 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>'
                 . '</svg>';
    $icon_clock = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" width="14" height="14" style="vertical-align:-2px;margin-right:6px;">'
                . '<circle cx="10" cy="10" r="8" stroke="currentColor" stroke-width="1.6"/>'
                . '<path d="M10 5v5l3 2" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>'
                . '</svg>';
    $icon_chat  = '<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" width="14" height="14" style="vertical-align:-2px;margin-right:6px;">'
                . '<path d="M3 5a2 2 0 012-2h10a2 2 0 012 2v7a2 2 0 01-2 2H8l-4 3v-3a2 2 0 01-2-2V5z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>'
                . '</svg>';
    ?>
    <div class="rmbz-return-panel">
        <div class="rmbz-return-head">
            <div class="rmbz-return-icon" aria-hidden="true"><?php echo $icon_return; ?></div>
            <div class="rmbz-return-title">
                <h2><?php esc_html_e( 'Este lançamento foi devolvido para correcção', '1mz-for-artists' ); ?></h2>
                <p>
                    <?php
                    printf(
                        /* translators: %s = nome do admin que devolveu */
                        esc_html__( 'Devolvido por %s', '1mz-for-artists' ),
                        '<strong>' . esc_html( $issued_by ) . '</strong>'
                    );
                    ?>
                    <?php if ( $issued_at ): ?>
                        · <?php echo esc_html( date('d/m/Y H:i', strtotime($issued_at)) ); ?>
                    <?php endif; ?>
                    <?php $rc = (int) ( $release->return_count ?? 0 ); ?>
                    <?php if ( $rc > 1 ): ?>
                        ·
                        <?php
                        printf(
                            /* translators: %d = número de vezes devolvido */
                            esc_html__( '%d.ª vez devolvido', '1mz-for-artists' ),
                            $rc
                        );
                        ?>
                    <?php endif; ?>
                </p>
            </div>
        </div>

        <?php if ( $deadline ): ?>
            <div class="rmbz-return-deadline <?php echo $overdue ? 'overdue' : ($days_left <= 2 ? 'urgent' : ''); ?>">
                <?php echo $icon_clock; ?>
                <?php if ( $overdue ): ?>
                    <strong><?php esc_html_e( 'Prazo expirado!', '1mz-for-artists' ); ?></strong>
                    <?php esc_html_e( 'O lançamento pode ser movido para arquivado se não corrigir.', '1mz-for-artists' ); ?>
                <?php elseif ( $days_left === 0 ): ?>
                    <strong><?php esc_html_e( 'Prazo expira hoje!', '1mz-for-artists' ); ?></strong>
                <?php else: ?>
                    <?php
                    printf(
                        /* translators: %1$s = "X dia(s)" em strong, %2$s = data formatada */
                        esc_html__( 'Tem %1$s para corrigir (até %2$s)', '1mz-for-artists' ),
                        '<strong>' . sprintf(
                            /* translators: %d = número de dias */
                            esc_html( _n( '%d dia', '%d dias', $days_left, '1mz-for-artists' ) ),
                            $days_left
                        ) . '</strong>',
                        esc_html( date('d/m/Y', strtotime($deadline)) )
                    );
                    ?>
                <?php endif; ?>
            </div>
        <?php endif; ?>

        <h3><?php esc_html_e( 'Problemas a corrigir:', '1mz-for-artists' ); ?></h3>
        <?php foreach ( $by_group as $group => $items ): ?>
            <div class="rmbz-return-group">
                <strong class="rmbz-return-group-title"><?php echo esc_html($group); ?></strong>
                <ul>
                <?php foreach ( $items as $p ): ?>
                    <li>
                        <span class="problem-label"><?php echo esc_html($p['label']); ?></span>
                        <?php if ( ! empty($p['note']) ): ?>
                            <em class="problem-note">— <?php echo esc_html($p['note']); ?></em>
                        <?php endif; ?>
                    </li>
                <?php endforeach; ?>
                </ul>
            </div>
        <?php endforeach; ?>

        <?php if ( ! empty($note) ): ?>
            <div class="rmbz-return-note">
                <strong><?php echo $icon_chat; ?><?php esc_html_e( 'Nota do administrador', '1mz-for-artists' ); ?></strong>
                <p><?php echo esc_html($note); ?></p>
            </div>
        <?php endif; ?>

        <div class="rmbz-return-actions">
            <p>
                <strong><?php esc_html_e( 'O que fazer agora:', '1mz-for-artists' ); ?></strong>
                <?php
                printf(
                    /* translators: %s = "Enviar para distribuição" em strong */
                    esc_html__( 'corrige os pontos acima nos passos abaixo. Quando estiver tudo resolvido, clica novamente em %s no Passo 4.', '1mz-for-artists' ),
                    '<strong>' . esc_html__( '"Enviar para distribuição"', '1mz-for-artists' ) . '</strong>'
                );
                ?>
            </p>
        </div>
    </div>

    <style>
    /* [DS 1.5.47] Painel de devolução tokenizado.
     * Estrutura preservada (todas as classes .rmbz-return-*).
     * Sem JS — só display. Mantém o impacto visual de "atenção" mas
     * usa tokens do design system para coerência. */

    .rmbz-return-panel {
        background: linear-gradient(180deg,
            rgba(239, 68, 68, 0.08),
            rgba(239, 68, 68, 0.02)
        );
        border: 1px solid var(--rmbz-danger);
        border-radius: var(--rmbz-radius-md);
        padding: var(--rmbz-space-5);
        margin-bottom: var(--rmbz-space-6);
        position: relative;
        overflow: hidden;
    }

    /* Barra vermelha à esquerda — identidade clara de "alerta" */
    .rmbz-return-panel::before {
        content: '';
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        width: 4px;
        background: var(--rmbz-danger);
    }

    .rmbz-return-head {
        display: flex;
        gap: var(--rmbz-space-4);
        align-items: center;
        margin-bottom: var(--rmbz-space-4);
    }

    .rmbz-return-icon {
        width: 48px;
        height: 48px;
        background: var(--rmbz-danger);
        color: #ffffff;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        flex-shrink: 0;
        box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.15);
    }

    .rmbz-return-title h2 {
        margin: 0;
        font-family: var(--rmbz-font-display);
        font-size: var(--rmbz-text-lg);
        font-weight: var(--rmbz-weight-semibold);
        color: var(--rmbz-danger);
        letter-spacing: var(--rmbz-tracking-tight);
        line-height: var(--rmbz-leading-tight);
    }

    .rmbz-return-title p {
        margin: var(--rmbz-space-1) 0 0 0;
        color: var(--rmbz-text-muted);
        font-size: var(--rmbz-text-xs);
    }

    /* Deadline — 3 estados (normal, urgente, expirado) */
    .rmbz-return-deadline {
        display: flex;
        align-items: center;
        flex-wrap: wrap;
        gap: var(--rmbz-space-1);
        padding: var(--rmbz-space-3) var(--rmbz-space-4);
        background: var(--rmbz-warning-soft);
        border: 1px solid rgba(245, 158, 11, 0.4);
        border-radius: var(--rmbz-radius-sm);
        color: var(--rmbz-warning);
        font-size: var(--rmbz-text-sm);
        margin-bottom: var(--rmbz-space-4);
    }

    .rmbz-return-deadline.urgent {
        background: rgba(245, 158, 11, 0.2);
        border-color: var(--rmbz-warning);
    }

    .rmbz-return-deadline.overdue {
        background: rgba(239, 68, 68, 0.2);
        border-color: var(--rmbz-danger);
        color: var(--rmbz-danger);
    }

    .rmbz-return-deadline strong {
        font-weight: var(--rmbz-weight-bold);
    }

    .rmbz-return-panel h3 {
        margin: 0 0 var(--rmbz-space-3) 0;
        font-family: var(--rmbz-font-display);
        font-size: var(--rmbz-text-sm);
        font-weight: var(--rmbz-weight-semibold);
        color: var(--rmbz-text-primary);
    }

    .rmbz-return-group {
        background: var(--rmbz-bg-input);
        border: 1px solid var(--rmbz-border-subtle);
        border-radius: var(--rmbz-radius-sm);
        padding: var(--rmbz-space-3) var(--rmbz-space-4);
        margin-bottom: var(--rmbz-space-2);
    }

    .rmbz-return-group-title {
        display: block;
        margin-bottom: var(--rmbz-space-2);
        font-family: var(--rmbz-font-body);
        font-size: var(--rmbz-text-2xs);
        font-weight: var(--rmbz-weight-semibold);
        color: var(--rmbz-brand);
        text-transform: uppercase;
        letter-spacing: var(--rmbz-tracking-wider);
    }

    .rmbz-return-group ul {
        margin: 0;
        padding-left: var(--rmbz-space-5);
    }

    .rmbz-return-group li {
        margin-bottom: var(--rmbz-space-1);
        color: var(--rmbz-text-secondary);
        font-size: var(--rmbz-text-sm);
        line-height: var(--rmbz-leading-relaxed);
    }

    .rmbz-return-group li .problem-label {
        font-weight: var(--rmbz-weight-medium);
    }

    .rmbz-return-group li .problem-note {
        color: var(--rmbz-text-muted);
        font-style: normal;
    }

    /* Nota do admin — caixa azul info subtil */
    .rmbz-return-note {
        background: var(--rmbz-info-soft);
        border: 1px solid rgba(59, 130, 246, 0.4);
        border-radius: var(--rmbz-radius-sm);
        padding: var(--rmbz-space-3) var(--rmbz-space-4);
        margin-top: var(--rmbz-space-4);
    }

    .rmbz-return-note strong {
        display: flex;
        align-items: center;
        margin-bottom: var(--rmbz-space-2);
        font-family: var(--rmbz-font-body);
        font-size: var(--rmbz-text-2xs);
        font-weight: var(--rmbz-weight-semibold);
        color: var(--rmbz-info);
        text-transform: uppercase;
        letter-spacing: var(--rmbz-tracking-wider);
    }

    .rmbz-return-note p {
        margin: 0;
        color: var(--rmbz-text-secondary);
        font-size: var(--rmbz-text-sm);
        line-height: var(--rmbz-leading-relaxed);
    }

    /* Acções — instruções finais */
    .rmbz-return-actions {
        margin-top: var(--rmbz-space-4);
        padding-top: var(--rmbz-space-4);
        border-top: 1px solid var(--rmbz-border-subtle);
    }

    .rmbz-return-actions p {
        margin: 0;
        color: var(--rmbz-text-secondary);
        font-size: var(--rmbz-text-sm);
        line-height: var(--rmbz-leading-relaxed);
    }

    .rmbz-return-actions strong {
        color: var(--rmbz-brand);
        font-weight: var(--rmbz-weight-semibold);
    }

    /* Mobile: ajustes finos */
    @media (max-width: 640px) {
        .rmbz-return-panel {
            padding: var(--rmbz-space-4);
        }
        .rmbz-return-head {
            gap: var(--rmbz-space-3);
        }
        .rmbz-return-icon {
            width: 40px;
            height: 40px;
        }
    }
    </style>
    <?php
}


/* ============================================================================
 * ADMIN — form handler para devolver
 * ============================================================================ */
function rmbz_admin_release_return_handler() {
    if ( ! current_user_can('manage_options') ) wp_die('Sem permissão.');
    $release_id = (int) ($_POST['release_id'] ?? 0);
    if ( ! $release_id ) wp_die('ID inválido.');
    check_admin_referer('rmbz_release_action_' . $release_id);

    $codes     = (array) ($_POST['problem_codes'] ?? []);
    $notes_map = (array) ($_POST['problem_notes'] ?? []);
    $general_note = sanitize_textarea_field( $_POST['return_note'] ?? '' );
    $deadline  = max(1, min(30, (int) ($_POST['deadline_days'] ?? 7)));

    $problems = [];
    foreach ( $codes as $code ) {
        $code = sanitize_key($code);
        $problems[] = [
            'code' => $code,
            'note' => sanitize_text_field( $notes_map[$code] ?? '' ),
        ];
    }

    $result = rmbz_distro_return_release( $release_id, $problems, $general_note, $deadline );
    if ( is_wp_error($result) ) wp_die( $result->get_error_message() );

    $return_to = $_POST['return_to'] ?? '';
    if ( $return_to === 'approval' ) {
        wp_safe_redirect( admin_url('admin.php?page=rmbz-admin-distribution&tab=approval&msg=returned') );
    } else {
        wp_safe_redirect( admin_url('admin.php?page=rmbz-admin-distribution&tab=releases&view=detail&id=' . $release_id . '&msg=returned') );
    }
    exit;
}
add_action('admin_post_rmbz_release_return', 'rmbz_admin_release_return_handler');


/* ============================================================================
 * ADMIN — renderizar modal/form de devolução
 * ============================================================================ */
function rmbz_admin_render_return_form( $release_id, $return_to = 'detail' ) {
    $codes = rmbz_return_problem_codes();
    $by_group = [];
    foreach ( $codes as $c => $info ) {
        $by_group[ $info['group'] ][ $c ] = $info['label'];
    }
    ?>
    <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>"
          id="rmbz-return-form" style="display:none; margin-top:10px; padding:15px; background:#fff5f5; border:1px solid #e74c3c; border-radius:6px;">
        <?php wp_nonce_field('rmbz_release_action_' . $release_id); ?>
        <input type="hidden" name="action" value="rmbz_release_return">
        <input type="hidden" name="release_id" value="<?php echo (int) $release_id; ?>">
        <input type="hidden" name="return_to" value="<?php echo esc_attr($return_to); ?>">

        <h4 style="margin:0 0 10px 0; color:#c0392b;">⟲ Devolver para correcção</h4>
        <p style="font-size:12px; color:#666; margin:0 0 12px 0;">
            Selecciona os problemas. O artista receberá a lista e terá prazo para corrigir.
        </p>

        <?php foreach ( $by_group as $group => $items ): ?>
            <div style="margin-bottom:10px; padding:8px; background:#fff; border-radius:4px;">
                <strong style="font-size:11px; color:#444; text-transform:uppercase; letter-spacing:0.3px;"><?php echo esc_html($group); ?></strong>
                <div style="display:flex; flex-direction:column; gap:4px; margin-top:6px;">
                    <?php foreach ( $items as $code => $label ): ?>
                        <label style="display:flex; align-items:flex-start; gap:6px; font-size:12px;">
                            <input type="checkbox" name="problem_codes[]" value="<?php echo esc_attr($code); ?>"
                                   class="return-problem-cb" data-code="<?php echo esc_attr($code); ?>">
                            <span><?php echo esc_html($label); ?></span>
                        </label>
                        <input type="text" name="problem_notes[<?php echo esc_attr($code); ?>]"
                               placeholder="Nota específica (opcional)..."
                               class="return-problem-note"
                               data-code="<?php echo esc_attr($code); ?>"
                               style="display:none; width:100%; padding:4px 8px; font-size:11px; margin-left:18px; margin-bottom:4px;">
                    <?php endforeach; ?>
                </div>
            </div>
        <?php endforeach; ?>

        <label style="display:block; margin-top:10px; font-size:12px; font-weight:600;">Nota geral ao artista (opcional):</label>
        <textarea name="return_note" rows="3" style="width:100%; font-size:12px;"
                  placeholder="Ex: Por favor envia uma versão masterizada. A que carregaste tem peaks a 0dB que vão causar problemas nos DSPs."></textarea>

        <div style="display:flex; align-items:center; gap:8px; margin-top:10px;">
            <label style="font-size:12px; font-weight:600;">Prazo:</label>
            <select name="deadline_days" style="font-size:12px;">
                <option value="3">3 dias</option>
                <option value="7" selected>7 dias (recomendado)</option>
                <option value="14">14 dias</option>
                <option value="30">30 dias</option>
            </select>
        </div>

        <div style="display:flex; gap:8px; margin-top:12px;">
            <button type="submit" class="button button-primary" style="background:#e74c3c; border-color:#c0392b;">
                ⟲ Devolver ao artista
            </button>
            <button type="button" class="button"
                    onclick="document.getElementById('rmbz-return-form').style.display='none';">
                Cancelar
            </button>
        </div>

        <script>
        (function() {
            document.querySelectorAll('.return-problem-cb').forEach(function(cb) {
                cb.addEventListener('change', function() {
                    var note = document.querySelector('.return-problem-note[data-code="' + cb.dataset.code + '"]');
                    if ( note ) note.style.display = cb.checked ? 'block' : 'none';
                });
            });
        })();
        </script>
    </form>
    <?php
}
