<?php
/**
 * includes/distribution/distribution-release-cleanup.php
 *
 * ============================================================================
 * CLEANUP AUTOMÁTICO DE RELEASES ABANDONADAS — 1.5.156
 * ============================================================================
 *
 * Apaga automaticamente releases abandonadas em 2 cenários:
 *
 *   1. INCOMPLETE  — status='incomplete' há mais de 30 dias (configurável)
 *      Cenário: artista cria release, fecha browser, nunca volta.
 *
 *   2. RETURNED    — status='returned' com return_deadline já expirada
 *      Cenário: admin devolveu para correcções, artista ignorou prazo.
 *
 * FLUXO COM AVISO:
 *
 *   Dia 0:    Detecção. Release marcada com extra_data->cleanup_warned_at = now,
 *             cleanup_scheduled_at = now + 7 dias. Notifica artista.
 *
 *   Dia 1-7:  Se artista mexe na release, removemos as flags (cleanup cancelado).
 *
 *   Dia 7+:   Apaga release + tabelas relacionadas. Notifica artista do delete.
 *
 * SALVAGUARDAS CRÍTICAS:
 *
 *   - NUNCA apagar release com status diferente de incomplete/returned
 *     (mesmo que esteja na lista — se mudou estado, cancela)
 *
 *   - NUNCA apagar release se houver:
 *       a) Royalties no ledger (rmbz_distro_ledger.release_id)
 *       b) Splits aprovados a colaboradores externos (holdings com payout)
 *       c) Daily stats > 0 (música recebeu plays — não devia estar incomplete)
 *
 *   - Limite por execução: máximo 50 releases (evita rebentar BD em catch-up)
 *
 *   - Apagar em cascata: tracks, platforms, splits, change_requests, status_history
 *
 *   - Log de cada eliminação em rmbz_release_cleanup_log
 *
 * ARQUITECTURA:
 *
 *   - Hook diário: rmbz_unlock_funds_hook (mesmo padrão dos outros)
 *   - 2 fases por execução:
 *       1) `mark_for_cleanup` — encontra novos candidatos, marca + avisa
 *       2) `execute_cleanup`  — apaga os que estão em prazo expirado
 *
 *   - Botão admin "🧹 Correr Cleanup Agora" para forçar execução manual
 *   - Página admin com:
 *       a) Lista de releases marcadas (preview do que vai ser apagado)
 *       b) Histórico de releases apagadas
 *       c) Configurações (dias até cleanup, dias de aviso)
 */

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


// ============================================================================
// CONFIG
// ============================================================================

/**
 * Dias de inactividade até considerar incompleta como abandonada.
 * Default: 30. Configurável em option `rmbz_release_incomplete_max_days`.
 */
function rmbz_release_cleanup_incomplete_days() {
    $v = (int) get_option( 'rmbz_release_incomplete_max_days', 30 );
    return max( 7, $v ); // mínimo 7 (segurança — nunca menos)
}

/**
 * Dias de aviso antes de apagar (após detecção).
 * Default: 7. Configurável em option `rmbz_release_cleanup_warning_days`.
 */
function rmbz_release_cleanup_warning_days() {
    $v = (int) get_option( 'rmbz_release_cleanup_warning_days', 7 );
    return max( 3, $v ); // mínimo 3 (segurança)
}

/**
 * Limite de releases processadas por execução do cron.
 */
function rmbz_release_cleanup_batch_limit() {
    return 50;
}


// ============================================================================
// SCHEMA — tabela de log
// ============================================================================

function rmbz_release_cleanup_log_table() {
    global $wpdb;
    return $wpdb->prefix . 'rmbz_release_cleanup_log';
}

function rmbz_release_cleanup_install_schema() {
    global $wpdb;
    if ( get_option('rmbz_release_cleanup_schema_v') === '1.0' ) return;

    $table = rmbz_release_cleanup_log_table();
    $charset = $wpdb->get_charset_collate();
    $sql = "CREATE TABLE $table (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        release_id bigint(20) NOT NULL,
        artist_telemovel varchar(20) NOT NULL,
        title varchar(255) DEFAULT NULL,
        previous_status varchar(20) DEFAULT NULL,
        reason varchar(50) DEFAULT NULL,
        deleted_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        manual tinyint(1) DEFAULT 0 NOT NULL,
        PRIMARY KEY  (id),
        KEY idx_artist (artist_telemovel),
        KEY idx_deleted_at (deleted_at)
    ) ENGINE=InnoDB $charset;";

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

    update_option('rmbz_release_cleanup_schema_v', '1.0');
}
add_action('admin_init', 'rmbz_release_cleanup_install_schema', 8);
add_action('init',        'rmbz_release_cleanup_install_schema', 9);


// ============================================================================
// HELPERS — extra_data manipulation
// ============================================================================

function rmbz_release_get_extra( $release ) {
    if ( empty( $release->extra_data ) ) return [];
    $d = json_decode( $release->extra_data, true );
    return is_array( $d ) ? $d : [];
}

function rmbz_release_set_extra( $release_id, array $extra ) {
    global $wpdb;
    return $wpdb->update(
        $wpdb->prefix . 'rmbz_distro_releases',
        [ 'extra_data' => wp_json_encode( $extra ) ],
        [ 'id' => (int) $release_id ],
        [ '%s' ],
        [ '%d' ]
    );
}


// ============================================================================
// SALVAGUARDA — verifica se release pode mesmo ser apagada
// ============================================================================

/**
 * Devolve array vazio se OK para apagar, ou array com motivos para BLOQUEAR.
 */
function rmbz_release_cleanup_safety_check( $release_id ) {
    global $wpdb;
    $blockers = [];
    $rid = (int) $release_id;

    // 1. Royalties no ledger (USD creditado nesta release)
    $ledger = $wpdb->prefix . 'rmbz_distro_ledger';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$ledger'" ) === $ledger ) {
        $col_check = $wpdb->get_var( "SHOW COLUMNS FROM $ledger LIKE 'release_id'" );
        if ( $col_check ) {
            $has_royalties = (int) $wpdb->get_var( $wpdb->prepare(
                "SELECT COUNT(*) FROM $ledger WHERE release_id = %d", $rid
            ) );
            if ( $has_royalties > 0 ) {
                $blockers[] = 'Tem ' . $has_royalties . ' linhas no ledger de royalties (USD).';
            }
        }
    }

    // 2. Daily stats com plays > 0
    $stats = $wpdb->prefix . 'rmbz_distro_daily_stats';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$stats'" ) === $stats ) {
        $has_plays = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM $stats WHERE release_id = %d", $rid
        ) );
        if ( $has_plays > 0 ) {
            $blockers[] = 'Tem ' . $has_plays . ' linhas em daily_stats (já recebeu plays).';
        }
    }

    // 3. Holdings com payout (compromissos com colaboradores externos)
    $hold = $wpdb->prefix . 'rmbz_splits_holdings';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$hold'" ) === $hold ) {
        // Verifica se a tabela tem coluna 'paid_amount'
        $col_paid = $wpdb->get_var( "SHOW COLUMNS FROM $hold LIKE 'paid_amount'" );
        if ( $col_paid ) {
            $has_paid = (int) $wpdb->get_var( $wpdb->prepare(
                "SELECT COUNT(*) FROM $hold WHERE release_id = %d AND paid_amount > 0", $rid
            ) );
            if ( $has_paid > 0 ) {
                $blockers[] = 'Tem holdings com pagamentos já feitos a colaboradores.';
            }
        }
    }

    return $blockers;
}


// ============================================================================
// FASE 1 — MARK FOR CLEANUP (encontra candidatos novos, marca + notifica)
// ============================================================================

/**
 * Encontra candidatos a cleanup que ainda não foram avisados, marca-os e
 * envia notificação.
 *
 * Devolve int $marked = quantos foram marcados.
 */
function rmbz_release_cleanup_mark_candidates() {
    global $wpdb;
    $tbl = $wpdb->prefix . 'rmbz_distro_releases';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$tbl'" ) !== $tbl ) return 0;

    $incomplete_days = rmbz_release_cleanup_incomplete_days();
    $warning_days    = rmbz_release_cleanup_warning_days();
    $limit           = rmbz_release_cleanup_batch_limit();

    // Cenário 1: INCOMPLETE há mais de N dias (sem warned_at)
    $candidates_incomplete = $wpdb->get_results( $wpdb->prepare(
        "SELECT id, artist_telemovel, title, status, created_at, extra_data
         FROM $tbl
         WHERE status = 'incomplete'
           AND created_at < DATE_SUB(NOW(), INTERVAL %d DAY)
         ORDER BY created_at ASC
         LIMIT %d",
        $incomplete_days, $limit
    ) );

    // Cenário 2: RETURNED com return_deadline expirada (sem warned_at)
    $candidates_returned = $wpdb->get_results( $wpdb->prepare(
        "SELECT id, artist_telemovel, title, status, return_deadline, extra_data
         FROM $tbl
         WHERE status = 'returned'
           AND return_deadline IS NOT NULL
           AND return_deadline < NOW()
         ORDER BY return_deadline ASC
         LIMIT %d",
        $limit
    ) );

    $all = array_merge( $candidates_incomplete, $candidates_returned );
    $marked = 0;

    foreach ( $all as $rel ) {
        $extra = rmbz_release_get_extra( $rel );

        // Já está marcado e ainda dentro do prazo? Não tocar.
        if ( ! empty( $extra['cleanup_warned_at'] ) && ! empty( $extra['cleanup_scheduled_at'] ) ) {
            continue;
        }

        // Salvaguarda: verificar bloqueadores ANTES de marcar
        $blockers = rmbz_release_cleanup_safety_check( $rel->id );
        if ( ! empty( $blockers ) ) {
            // Marcar como protegida para nunca ser tentada novamente
            $extra['cleanup_blocked'] = implode( ' | ', $blockers );
            $extra['cleanup_blocked_at'] = current_time( 'mysql' );
            rmbz_release_set_extra( $rel->id, $extra );
            continue;
        }

        $now = current_time( 'mysql' );
        $scheduled = date( 'Y-m-d H:i:s', strtotime( $now . " +$warning_days days" ) );

        $extra['cleanup_warned_at']    = $now;
        $extra['cleanup_scheduled_at'] = $scheduled;
        $extra['cleanup_reason']       = $rel->status; // 'incomplete' ou 'returned'
        rmbz_release_set_extra( $rel->id, $extra );

        // Notificar
        if ( function_exists( 'rmbz_notify' ) ) {
            $motivo = $rel->status === 'incomplete'
                ? 'incompleta há mais de ' . $incomplete_days . ' dias'
                : 'devolvida com prazo de correcção expirado';

            rmbz_notify( $rel->artist_telemovel, 'release_abandoned_warning', [
                'titulo_release'  => $rel->title ?: ('Release #' . $rel->id),
                'release_id'      => $rel->id,
                'motivo_estado'   => $motivo,
                'dias_restantes'  => $warning_days,
            ] );
        }
        $marked++;
    }

    return $marked;
}


// ============================================================================
// FASE 2 — EXECUTE CLEANUP (apaga as que estão em prazo expirado)
// ============================================================================

/**
 * Apaga as releases marcadas com cleanup_scheduled_at < NOW().
 *
 * Cancela cleanup se:
 *   - Estado mudou (já não é incomplete nem returned)
 *   - Bloqueadores apareceram (royalties, plays, holdings pagos)
 *
 * Devolve [ 'deleted' => N, 'cancelled' => N ].
 */
function rmbz_release_cleanup_execute( $manual = false ) {
    global $wpdb;
    $tbl = $wpdb->prefix . 'rmbz_distro_releases';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$tbl'" ) !== $tbl ) {
        return [ 'deleted' => 0, 'cancelled' => 0 ];
    }

    $limit = rmbz_release_cleanup_batch_limit();

    // Procurar candidatos: extra_data tem cleanup_scheduled_at < NOW
    $candidates = $wpdb->get_results( $wpdb->prepare(
        "SELECT id, artist_telemovel, title, status, extra_data
         FROM $tbl
         WHERE status IN ('incomplete', 'returned')
           AND extra_data LIKE %s
         LIMIT %d",
        '%cleanup_scheduled_at%', $limit
    ) );

    $deleted = 0;
    $cancelled = 0;

    foreach ( $candidates as $rel ) {
        $extra = rmbz_release_get_extra( $rel );

        // Sem prazo? Skip.
        if ( empty( $extra['cleanup_scheduled_at'] ) ) continue;

        $scheduled_ts = strtotime( $extra['cleanup_scheduled_at'] );
        if ( ! $scheduled_ts || $scheduled_ts > time() ) continue; // ainda no prazo

        // Re-validar salvaguardas (caso algo tenha mudado entretanto)
        $blockers = rmbz_release_cleanup_safety_check( $rel->id );
        if ( ! empty( $blockers ) ) {
            // Cancelar — release já não é apagável
            unset( $extra['cleanup_warned_at'], $extra['cleanup_scheduled_at'], $extra['cleanup_reason'] );
            $extra['cleanup_blocked'] = implode( ' | ', $blockers );
            $extra['cleanup_blocked_at'] = current_time( 'mysql' );
            rmbz_release_set_extra( $rel->id, $extra );
            $cancelled++;
            continue;
        }

        // Confirmar estado ainda é apagável
        if ( ! in_array( $rel->status, ['incomplete', 'returned'], true ) ) {
            unset( $extra['cleanup_warned_at'], $extra['cleanup_scheduled_at'], $extra['cleanup_reason'] );
            rmbz_release_set_extra( $rel->id, $extra );
            $cancelled++;
            continue;
        }

        // OK: apagar
        $reason = $extra['cleanup_reason'] ?? $rel->status;

        // Notificar artista ANTES de apagar (precisamos do título)
        if ( function_exists( 'rmbz_notify' ) ) {
            $motivo = $reason === 'incomplete'
                ? 'incompleta há demasiado tempo'
                : 'devolvida com prazo de correcção expirado';
            rmbz_notify( $rel->artist_telemovel, 'release_abandoned_deleted', [
                'titulo_release'  => $rel->title ?: ('Release #' . $rel->id),
                'motivo_estado'   => $motivo,
            ] );
        }

        // Log antes de apagar (para auditoria)
        $log_table = rmbz_release_cleanup_log_table();
        $wpdb->insert( $log_table, [
            'release_id'      => $rel->id,
            'artist_telemovel' => $rel->artist_telemovel,
            'title'           => $rel->title,
            'previous_status' => $rel->status,
            'reason'          => $reason,
            'deleted_at'      => current_time( 'mysql' ),
            'manual'          => $manual ? 1 : 0,
        ], [ '%d', '%s', '%s', '%s', '%s', '%s', '%d' ] );

        // Apagar em cascata
        rmbz_release_cleanup_delete_cascade( $rel->id );
        $deleted++;
    }

    return [ 'deleted' => $deleted, 'cancelled' => $cancelled ];
}


/**
 * Apaga release + linhas relacionadas. Defensivo: usa SHOW TABLES antes
 * de cada DELETE (algumas tabelas podem não existir noutras instalações).
 */
function rmbz_release_cleanup_delete_cascade( $release_id ) {
    global $wpdb;
    $rid = (int) $release_id;
    if ( $rid <= 0 ) return;

    // Lista de tabelas com release_id (apagar primeiro, depois a release)
    $related_tables = [
        'rmbz_distro_tracks',
        'rmbz_distro_release_platforms',
        'rmbz_distro_status_history',
        'rmbz_splits_holdings',
        'rmbz_splits_audit',
        'rmbz_split_change_requests',
        'rmbz_store_change_requests',
        'rmbz_licenses',
    ];

    foreach ( $related_tables as $t ) {
        $full = $wpdb->prefix . $t;
        if ( $wpdb->get_var( "SHOW TABLES LIKE '$full'" ) === $full ) {
            // Confirmar coluna release_id
            $has_col = $wpdb->get_var( "SHOW COLUMNS FROM $full LIKE 'release_id'" );
            if ( $has_col ) {
                $wpdb->delete( $full, [ 'release_id' => $rid ], [ '%d' ] );
            }
        }
    }

    // Finalmente a release
    $wpdb->delete( $wpdb->prefix . 'rmbz_distro_releases', [ 'id' => $rid ], [ '%d' ] );

    // [1.5.187] Hook para sistemas que dependem do release (notificações
    // órfãs, audit logs externos, etc.).
    do_action( 'rmbz_release_deleted', $rid, '' );
}


// ============================================================================
// CRON HOOK — ambas as fases corridas no cron diário
// ============================================================================

function rmbz_release_cleanup_cron_run() {
    rmbz_release_cleanup_mark_candidates();
    rmbz_release_cleanup_execute( false );
}
add_action( 'rmbz_unlock_funds_hook', 'rmbz_release_cleanup_cron_run' );


/**
 * [1.5.156] Quando o artista mexe na release (edita ou reabre), cancela
 * marcação de cleanup. Listener no hook que dispara em qualquer save.
 *
 * Limpa as flags: cleanup_warned_at, cleanup_scheduled_at, cleanup_reason.
 * Mantém cleanup_blocked se existir (esse é um marker de protecção positivo).
 */
function rmbz_release_cleanup_cancel_on_activity( $release_id ) {
    global $wpdb;
    $rid = (int) $release_id;
    if ( $rid <= 0 ) return;

    $rel = $wpdb->get_row( $wpdb->prepare(
        "SELECT extra_data FROM {$wpdb->prefix}rmbz_distro_releases WHERE id = %d",
        $rid
    ) );
    if ( ! $rel ) return;

    $extra = rmbz_release_get_extra( $rel );
    if ( empty( $extra['cleanup_warned_at'] ) && empty( $extra['cleanup_scheduled_at'] ) ) return;

    unset( $extra['cleanup_warned_at'], $extra['cleanup_scheduled_at'], $extra['cleanup_reason'] );
    rmbz_release_set_extra( $rid, $extra );
}
add_action( 'rmbz_distro_release_saved',   'rmbz_release_cleanup_cancel_on_activity' );
add_action( 'rmbz_distro_release_updated', 'rmbz_release_cleanup_cancel_on_activity' );
add_action( 'rmbz_distro_status_changed',  'rmbz_release_cleanup_cancel_on_activity' );


// ============================================================================
// BOTÃO ADMIN — correr manualmente
// ============================================================================

function rmbz_release_cleanup_handle_run() {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );
    if ( ! check_admin_referer( 'rmbz_release_cleanup_run' ) ) wp_die( 'Falha de segurança.' );

    $marked = rmbz_release_cleanup_mark_candidates();
    $exec   = rmbz_release_cleanup_execute( true );

    set_transient( 'rmbz_release_cleanup_notice', [
        'type' => 'success',
        'msg'  => sprintf(
            '🧹 Cleanup executado: %d marcadas (1ª vez), %d apagadas, %d canceladas (mudaram).',
            $marked, $exec['deleted'], $exec['cancelled']
        ),
    ], 30 );

    wp_safe_redirect( admin_url( 'admin.php?page=rmbz-settings&tab=cleanup' ) );
    exit;
}
add_action( 'admin_post_rmbz_release_cleanup_run', 'rmbz_release_cleanup_handle_run' );


// ============================================================================
// PÁGINA ADMIN
// ============================================================================

/** Corpo do Cleanup Automático — vive como aba das Configurações. */
function rmbz_release_cleanup_render_body() {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );

    global $wpdb;

    $notice = get_transient( 'rmbz_release_cleanup_notice' );
    if ( $notice ) {
        delete_transient( 'rmbz_release_cleanup_notice' );
        $css = $notice['type'] === 'success' ? 'notice-success' : 'notice-error';
        echo '<div class="notice ' . esc_attr($css) . ' is-dismissible" style="margin:14px 0;"><p>' . esc_html($notice['msg']) . '</p></div>';
    }

    $tbl = $wpdb->prefix . 'rmbz_distro_releases';

    // Marcadas pendentes (warned mas ainda não apagadas)
    $pending = $wpdb->get_results(
        "SELECT id, title, artist_telemovel, status, extra_data
         FROM $tbl
         WHERE status IN ('incomplete', 'returned')
           AND extra_data LIKE '%cleanup_scheduled_at%'
         ORDER BY id DESC
         LIMIT 100"
    );

    // Histórico (últimas 50 apagadas)
    $log_table = rmbz_release_cleanup_log_table();
    $history = [];
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$log_table'" ) === $log_table ) {
        $history = $wpdb->get_results(
            "SELECT * FROM $log_table ORDER BY id DESC LIMIT 50"
        );
    }

    // Bloqueadas (com cleanup_blocked)
    $blocked = $wpdb->get_results(
        "SELECT id, title, artist_telemovel, status, extra_data
         FROM $tbl
         WHERE extra_data LIKE '%cleanup_blocked%'
         ORDER BY id DESC
         LIMIT 50"
    );

    $incomplete_days = rmbz_release_cleanup_incomplete_days();
    $warning_days    = rmbz_release_cleanup_warning_days();

    // [1.6.118.2] Sub-tabs — Releases (default) + Auto-cleanup Contas.
    // [1.6.347] Vive como aba das Configurações → usa `cltab` (o `tab` é da
    // página de Configurações) e a base aponta para essa aba.
    $active_tab = isset( $_GET['cltab'] ) ? sanitize_key( $_GET['cltab'] ) : 'releases';
    if ( ! in_array( $active_tab, [ 'releases', 'accounts' ], true ) ) {
        $active_tab = 'releases';
    }
    $base_url = admin_url( 'admin.php?page=rmbz-settings&tab=cleanup' );
    ?>
    <div>
        <h2 style="margin-top:6px;">🧹 Cleanup Automático</h2>

        <h2 class="nav-tab-wrapper" style="margin-bottom:18px;">
            <a href="<?php echo esc_url( $base_url ); ?>" class="nav-tab <?php echo $active_tab === 'releases' ? 'nav-tab-active' : ''; ?>">
                🎵 Releases Abandonadas
            </a>
            <a href="<?php echo esc_url( add_query_arg( 'cltab', 'accounts', $base_url ) ); ?>" class="nav-tab <?php echo $active_tab === 'accounts' ? 'nav-tab-active' : ''; ?>">
                👤 Contas (Primeiro Depósito 24h)
            </a>
        </h2>

        <?php
        // Router: se tab=accounts, delegar para o render do auto-cleanup
        if ( $active_tab === 'accounts' ) {
            if ( function_exists( 'rmbz_first_deposit_expiry_render_tab_content' ) ) {
                rmbz_first_deposit_expiry_render_tab_content();
            } else {
                echo '<p>Módulo Auto-cleanup Contas não carregado.</p>';
            }
            echo '</div>'; // fecha .wrap
            return;
        }
        ?>

        <h2 style="margin-top:0;">🎵 Releases Abandonadas</h2>

        <p style="color:var(--rmbz-text-muted, #666);">
            Sistema automático que apaga releases abandonadas: <code>incomplete</code> há mais de <strong><?php echo (int) $incomplete_days; ?> dias</strong>,
            ou <code>returned</code> com prazo expirado. Antes de apagar, é enviada uma notificação ao artista
            com <strong><?php echo (int) $warning_days; ?> dias</strong> de antecedência.
        </p>

        <?php /* CONFIGURAÇÕES */ ?>
        <div class="card" style="padding:16px; max-width:none; margin-top:16px;">
            <h2 style="margin-top:0;">⚙ Configurações</h2>
            <form method="post" action="options.php">
                <?php settings_fields( 'rmbz_release_cleanup_settings' ); ?>
                <table class="form-table">
                    <tr>
                        <th><label for="rmbz_release_incomplete_max_days">Dias máximos de "incomplete"</label></th>
                        <td>
                            <input type="number" min="7" max="365" id="rmbz_release_incomplete_max_days"
                                   name="rmbz_release_incomplete_max_days" value="<?php echo (int) $incomplete_days; ?>" class="small-text">
                            dias <em style="color:#888;">(mín 7, default 30)</em>
                        </td>
                    </tr>
                    <tr>
                        <th><label for="rmbz_release_cleanup_warning_days">Dias de aviso antes de apagar</label></th>
                        <td>
                            <input type="number" min="3" max="30" id="rmbz_release_cleanup_warning_days"
                                   name="rmbz_release_cleanup_warning_days" value="<?php echo (int) $warning_days; ?>" class="small-text">
                            dias <em style="color:#888;">(mín 3, default 7)</em>
                        </td>
                    </tr>
                </table>
                <?php submit_button( 'Guardar', 'primary', 'submit', false ); ?>
            </form>
        </div>

        <?php /* CORRER MANUALMENTE */ ?>
        <div class="card" style="padding:16px; max-width:none; margin-top:16px;">
            <h2 style="margin-top:0;">▶ Correr Cleanup Agora</h2>
            <p>Força execução imediata (em vez de esperar pelo cron diário).</p>
            <form method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
                <input type="hidden" name="action" value="rmbz_release_cleanup_run">
                <?php wp_nonce_field( 'rmbz_release_cleanup_run' ); ?>
                <button type="submit" class="button button-primary"
                        onclick="return confirm('Correr cleanup agora? Vai marcar candidatos novos e apagar os que estão fora de prazo. Operação destrutiva.');">
                    🧹 Correr Cleanup Agora
                </button>
            </form>
        </div>

        <?php /* PENDENTES (avisadas, à espera de prazo) */ ?>
        <div class="card" style="padding:16px; max-width:none; margin-top:16px;">
            <h2 style="margin-top:0;">⏳ Pendentes (<?php echo count($pending); ?>)</h2>
            <p style="color:var(--rmbz-text-muted, #666); font-size:13px;">
                Releases avisadas. Serão apagadas quando o prazo expirar (a menos que o artista volte e mexa nelas).
            </p>
            <?php if ( empty($pending) ): ?>
                <p style="color:#888;">Nenhuma release pendente.</p>
            <?php else: ?>
                <table class="widefat striped" style="font-size:13px;">
                    <thead>
                        <tr>
                            <th width="60">ID</th>
                            <th>Título</th>
                            <th width="140">Artista</th>
                            <th width="100">Estado</th>
                            <th width="160">Avisado em</th>
                            <th width="160">Apagar a</th>
                            <th width="120">Tempo restante</th>
                        </tr>
                    </thead>
                    <tbody>
                    <?php foreach ( $pending as $r ):
                        $extra = rmbz_release_get_extra( $r );
                        $warned = $extra['cleanup_warned_at'] ?? '';
                        $sched  = $extra['cleanup_scheduled_at'] ?? '';
                        $remain = $sched ? max(0, strtotime($sched) - time()) : 0;
                        $remain_h = round($remain / 3600);
                    ?>
                        <tr>
                            <td><?php echo (int) $r->id; ?></td>
                            <td><?php echo esc_html( $r->title ?: '(sem título)' ); ?></td>
                            <td style="font-family:monospace;font-size:11px;"><?php echo esc_html( $r->artist_telemovel ); ?></td>
                            <td><code><?php echo esc_html( $r->status ); ?></code></td>
                            <td style="font-size:11px;"><?php echo esc_html( $warned ); ?></td>
                            <td style="font-size:11px;"><?php echo esc_html( $sched ); ?></td>
                            <td>
                                <?php if ( $remain_h <= 0 ): ?>
                                    <strong style="color:var(--rmbz-danger-strong, #dc2626);">Prazo expirado</strong>
                                <?php elseif ( $remain_h < 24 ): ?>
                                    <strong style="color:var(--rmbz-warning, #f59e0b);"><?php echo $remain_h; ?>h</strong>
                                <?php else: ?>
                                    <?php echo round($remain_h / 24, 1); ?> dias
                                <?php endif; ?>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                    </tbody>
                </table>
            <?php endif; ?>
        </div>

        <?php /* BLOQUEADAS (não vão ser apagadas por terem dados) */ ?>
        <?php if ( ! empty($blocked) ): ?>
        <div class="card" style="padding:16px; max-width:none; margin-top:16px;">
            <h2 style="margin-top:0;">🛡 Bloqueadas (<?php echo count($blocked); ?>)</h2>
            <p style="color:var(--rmbz-text-muted, #666); font-size:13px;">
                Releases que foram protegidas porque têm royalties, plays ou holdings pagos. Nunca serão apagadas automaticamente.
            </p>
            <table class="widefat striped" style="font-size:13px;">
                <thead>
                    <tr>
                        <th width="60">ID</th>
                        <th>Título</th>
                        <th width="140">Artista</th>
                        <th>Razão</th>
                    </tr>
                </thead>
                <tbody>
                <?php foreach ( $blocked as $r ):
                    $extra = rmbz_release_get_extra( $r );
                    $why = $extra['cleanup_blocked'] ?? '';
                ?>
                    <tr>
                        <td><?php echo (int) $r->id; ?></td>
                        <td><?php echo esc_html( $r->title ?: '(sem título)' ); ?></td>
                        <td style="font-family:monospace;font-size:11px;"><?php echo esc_html( $r->artist_telemovel ); ?></td>
                        <td style="color:var(--rmbz-text-muted, #666); font-size:12px;"><?php echo esc_html( $why ); ?></td>
                    </tr>
                <?php endforeach; ?>
                </tbody>
            </table>
        </div>
        <?php endif; ?>

        <?php /* HISTÓRICO */ ?>
        <div class="card" style="padding:16px; max-width:none; margin-top:16px;">
            <h2 style="margin-top:0;">📜 Histórico de eliminações (<?php echo count($history); ?> últimas)</h2>
            <?php if ( empty($history) ): ?>
                <p style="color:#888;">Sem releases apagadas ainda.</p>
            <?php else: ?>
                <table class="widefat striped" style="font-size:13px;">
                    <thead>
                        <tr>
                            <th width="60">#</th>
                            <th width="60">Rel.ID</th>
                            <th>Título</th>
                            <th width="140">Artista</th>
                            <th width="110">Estado</th>
                            <th width="100">Razão</th>
                            <th width="160">Apagada em</th>
                            <th width="80">Modo</th>
                        </tr>
                    </thead>
                    <tbody>
                    <?php foreach ( $history as $h ): ?>
                        <tr>
                            <td><?php echo (int) $h->id; ?></td>
                            <td><?php echo (int) $h->release_id; ?></td>
                            <td><?php echo esc_html( $h->title ?: '(sem título)' ); ?></td>
                            <td style="font-family:monospace;font-size:11px;"><?php echo esc_html( $h->artist_telemovel ); ?></td>
                            <td><code><?php echo esc_html( $h->previous_status ); ?></code></td>
                            <td><?php echo esc_html( $h->reason ); ?></td>
                            <td style="font-size:11px;"><?php echo esc_html( $h->deleted_at ); ?></td>
                            <td>
                                <?php if ( $h->manual ): ?>
                                    <span style="color:var(--rmbz-info-strong, #2563eb);">Manual</span>
                                <?php else: ?>
                                    <span style="color:var(--rmbz-text-muted, #888);">Cron</span>
                                <?php endif; ?>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                    </tbody>
                </table>
            <?php endif; ?>
        </div>
    </div>
    <?php
}


// ============================================================================
// SETTINGS REGISTRATION
// ============================================================================

function rmbz_release_cleanup_register_settings() {
    register_setting( 'rmbz_release_cleanup_settings', 'rmbz_release_incomplete_max_days', [
        'type'              => 'integer',
        'default'           => 30,
        'sanitize_callback' => function( $v ) { return max( 7, min( 365, (int) $v ) ); },
    ] );
    register_setting( 'rmbz_release_cleanup_settings', 'rmbz_release_cleanup_warning_days', [
        'type'              => 'integer',
        'default'           => 7,
        'sanitize_callback' => function( $v ) { return max( 3, min( 30, (int) $v ) ); },
    ] );
}
add_action( 'admin_init', 'rmbz_release_cleanup_register_settings' );


// ============================================================================
// MENU
// ============================================================================

// [1.6.347] Sem menu próprio — o Cleanup Automático passou a ser uma ABA em
// Configurações 1MZ For Artists ("🧹 Cleanup"), via rmbz_release_cleanup_render_body().
