<?php
/**
 * [1.6.118 FASE 2] AUTO-DELETE de contas com primeiro depósito não pago em 24h
 *
 * ========================================================================
 * REGRAS DE NEGÓCIO
 * ========================================================================
 *
 * Quando um user se regista (via site ou app) e cria um pedido de
 * primeiro depósito (`is_first_deposit=1`), tem 24h (mais 1h de grace
 * period) para o admin aprovar o pagamento. Se não acontecer:
 *
 *   - SE o user JÁ TEM CONTEÚDO (releases/uploads/projects):
 *     → soft delete: depósito vira 'expired', conta marcada como
 *       'expired'. Dados preservados (auditoria + protecção).
 *
 *   - SE o user está LIMPO (zero conteúdo):
 *     → hard delete: user_meta `rmbz_first_deposit_required=1` é
 *       requisito (só users criados depois de 1.6.118).
 *       Apaga: wp_users, wp_usermeta, rmbz_wallets, rmbz_deposit_requests.
 *
 * Cada decisão é registada em `rmbz_first_deposit_expiry_log` para
 * auditoria. Admin recebe email semanal de resumo.
 *
 * ========================================================================
 * SAFEGUARDS
 * ========================================================================
 *
 * 1. Grace period 25h (não 24h) — evita race conditions perto da fronteira
 * 2. Só users com `rmbz_first_deposit_required=1` (set em 1.6.118+ —
 *    users antigos ficam imunes)
 * 3. Hard delete só se ZERO conteúdo gerado (safety check absoluto)
 * 4. Tudo é logado antes de mexer (auditoria reversível)
 * 5. Admin pode forçar verificação manual via botão (testar sem esperar 1h)
 *
 * @package 1MZ_For_Artists
 * @since 1.6.118
 */

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


/* ============================================================================
 * SCHEMA — Tabela de auditoria
 * ============================================================================ */

/**
 * Criar tabela de log no admin_init (idempotente).
 * dbDelta não corre aqui porque é fora do flow normal, mas o CREATE TABLE
 * IF NOT EXISTS é seguro.
 */
add_action( 'admin_init', 'rmbz_first_deposit_expiry_ensure_log_table' );

function rmbz_first_deposit_expiry_ensure_log_table() {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_first_deposit_expiry_log';

    $exists = $wpdb->get_var( "SHOW TABLES LIKE '$t'" ) === $t;
    if ( $exists ) return;

    $charset_collate = $wpdb->get_charset_collate();
    $wpdb->query(
        "CREATE TABLE IF NOT EXISTS $t (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            user_telemovel varchar(20) NOT NULL,
            user_id bigint(20) DEFAULT NULL,
            deposit_id bigint(20) DEFAULT NULL,
            action_taken varchar(20) NOT NULL,
            had_releases int DEFAULT 0,
            had_uploads int DEFAULT 0,
            had_projects int DEFAULT 0,
            details text,
            processed_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            PRIMARY KEY  (id),
            KEY idx_telemovel (user_telemovel),
            KEY idx_action (action_taken)
        ) $charset_collate;"
    );
}


/* ============================================================================
 * CRON — Agendamento
 * ============================================================================ */

/**
 * Adicionar intervalo `hourly` já existe no WordPress por defeito.
 * Registamos o evento na activação ou no init se não estiver agendado.
 */
add_action( 'init', 'rmbz_first_deposit_expiry_schedule_cron' );

function rmbz_first_deposit_expiry_schedule_cron() {
    if ( ! wp_next_scheduled( 'rmbz_first_deposit_expiry_check' ) ) {
        // Primeiro run em 5 minutos, depois de hora a hora
        wp_schedule_event( time() + 300, 'hourly', 'rmbz_first_deposit_expiry_check' );
    }
}


/**
 * Cleanup do CRON na desactivação do plugin (boa prática WP).
 */
register_deactivation_hook(
    RMBZ_PLUGIN_PATH . '1mz-for-artists.php',
    'rmbz_first_deposit_expiry_unschedule_cron'
);

function rmbz_first_deposit_expiry_unschedule_cron() {
    $timestamp = wp_next_scheduled( 'rmbz_first_deposit_expiry_check' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'rmbz_first_deposit_expiry_check' );
    }
}


/* ============================================================================
 * CORE — Função que o CRON corre
 * ============================================================================ */

add_action( 'rmbz_first_deposit_expiry_check', 'rmbz_first_deposit_expiry_run' );

/**
 * Procura depósitos pendentes de primeira > 25h e processa cada um.
 *
 * Devolve resumo (usado pelo botão "forçar agora" para mostrar feedback
 * imediato ao admin).
 *
 * [1.6.118.1] Respeita opção `rmbz_expiry_cron_enabled` — admin pode
 * desactivar temporariamente para validar comportamento sem risco.
 * Quando desactivado, ainda regista uma entrada de log para auditoria
 * (saber que o CRON correu mas estava off).
 *
 * @param bool $force_ignore_toggle Se true, ignora a opção (usado pelo
 *                                  botão "Forçar agora" do admin).
 * @return array { processed, hard_deleted, soft_deleted, skipped, errors, disabled }
 */
function rmbz_first_deposit_expiry_run( $force_ignore_toggle = false ) {
    global $wpdb;
    $t_dep = $wpdb->prefix . 'rmbz_deposit_requests';

    $summary = [
        'processed'    => 0,
        'hard_deleted' => 0,
        'soft_deleted' => 0,
        'skipped'      => 0,
        'errors'       => [],
        'disabled'     => false,
    ];

    // [1.6.118.1] Check toggle — default OFF (segurança: admin tem
    // que activar conscientemente depois de validar)
    $enabled = (bool) get_option( 'rmbz_expiry_cron_enabled', false );
    if ( ! $enabled && ! $force_ignore_toggle ) {
        $summary['disabled'] = true;
        // Log silencioso a cada 24h (não a cada hora — spam) para auditoria
        $last_skip_log = (int) get_transient( 'rmbz_expiry_cron_skip_logged' );
        if ( ! $last_skip_log ) {
            error_log( '[1MZ first_deposit_expiry] CRON correu mas estava DESACTIVADO (rmbz_expiry_cron_enabled=0). Nada foi processado.' );
            set_transient( 'rmbz_expiry_cron_skip_logged', 1, DAY_IN_SECONDS );
        }
        return $summary;
    }

    // Procurar candidatos: is_first_deposit=1 + pendente + > 25h (grace 1h)
    $expirados = $wpdb->get_results(
        "SELECT *
           FROM $t_dep
          WHERE is_first_deposit = 1
            AND status = 'pendente'
            AND request_date < ( UTC_TIMESTAMP() - INTERVAL 25 HOUR )
          ORDER BY id ASC
          LIMIT 50"
    );

    if ( empty( $expirados ) ) {
        return $summary;
    }

    foreach ( $expirados as $dep ) {
        try {
            $result = rmbz_first_deposit_expiry_process_one( $dep );
            $summary['processed']++;
            if ( $result === 'hard' )      $summary['hard_deleted']++;
            elseif ( $result === 'soft' )  $summary['soft_deleted']++;
            else                           $summary['skipped']++;
        } catch ( \Throwable $e ) {
            $summary['errors'][] = sprintf(
                'Dep #%d (%s): %s',
                $dep->id, $dep->user_telemovel, $e->getMessage()
            );
            error_log( '[1MZ first_deposit_expiry] Erro dep ' . $dep->id . ': ' . $e->getMessage() );
        }
    }

    // Email ao admin se houve actividade
    if ( $summary['processed'] > 0 ) {
        rmbz_first_deposit_expiry_email_admin( $summary );
    }

    return $summary;
}


/**
 * Processa 1 depósito expirado.
 *
 * @return string 'hard' | 'soft' | 'skipped'
 */
function rmbz_first_deposit_expiry_process_one( $dep ) {
    global $wpdb;
    $t_dep = $wpdb->prefix . 'rmbz_deposit_requests';
    $t_log = $wpdb->prefix . 'rmbz_first_deposit_expiry_log';
    $telemovel = $dep->user_telemovel;

    // SAFEGUARD 1: User existe?
    $user = get_user_by( 'login', $telemovel );
    if ( ! $user ) {
        // User já não existe — só limpar o depósito pendente órfão
        $wpdb->update( $t_dep,
            [ 'status' => 'expired', 'admin_notes' => 'User não existe (já apagado anteriormente). Auto-cleanup.' ],
            [ 'id' => $dep->id ]
        );
        rmbz_first_deposit_expiry_log_action( [
            'user_telemovel' => $telemovel,
            'user_id'        => null,
            'deposit_id'     => $dep->id,
            'action_taken'   => 'skipped',
            'details'        => 'User não existia já — depósito órfão marcado expired.',
        ] );
        return 'skipped';
    }

    // SAFEGUARD 2: Tem flag de enforced? Se não, NÃO mexer.
    // Users antigos (pre-1.6.118) não têm esta flag.
    $enforced = (bool) get_user_meta( $user->ID, 'rmbz_first_deposit_required', true );
    if ( ! $enforced ) {
        rmbz_first_deposit_expiry_log_action( [
            'user_telemovel' => $telemovel,
            'user_id'        => $user->ID,
            'deposit_id'     => $dep->id,
            'action_taken'   => 'skipped',
            'details'        => 'User antigo (sem flag enforced) — protegido por regra retroactiva.',
        ] );
        return 'skipped';
    }

    // SAFEGUARD 3: Verificar se gerou conteúdo
    $stats = rmbz_first_deposit_user_content_count( $telemovel, $user->ID );
    $has_content = ( $stats['releases'] > 0 || $stats['uploads'] > 0 || $stats['projects'] > 0 );

    if ( $has_content ) {
        // SOFT DELETE: depósito → expired; user → marcado como expired mas dados preservados
        $wpdb->update( $t_dep,
            [
                'status'      => 'expired',
                'admin_notes' => 'Primeiro depósito não pago em 24h. Conta marcada como expired (tem conteúdo, dados preservados).',
            ],
            [ 'id' => $dep->id ]
        );
        update_user_meta( $user->ID, 'rmbz_account_status', 'expired' );
        update_user_meta( $user->ID, 'rmbz_expired_at', current_time( 'mysql', 1 ) );

        rmbz_first_deposit_expiry_log_action( [
            'user_telemovel' => $telemovel,
            'user_id'        => $user->ID,
            'deposit_id'     => $dep->id,
            'action_taken'   => 'soft_delete',
            'had_releases'   => $stats['releases'],
            'had_uploads'    => $stats['uploads'],
            'had_projects'   => $stats['projects'],
            'details'        => sprintf(
                'Conta tinha %d releases, %d uploads, %d projects — soft delete por segurança.',
                $stats['releases'], $stats['uploads'], $stats['projects']
            ),
        ] );
        return 'soft';
    }

    // HARD DELETE — user limpo, sem nada gerado.
    // [1.6.364] Apagar PRIMEIRO as imagens dos comprovativos (ficheiro + anexo WP)
    // de TODOS os depósitos deste utilizador — antes ficavam órfãs no servidor.
    if ( function_exists( 'rmbz_delete_media_by_url' ) ) {
        $proofs = $wpdb->get_col( $wpdb->prepare(
            "SELECT proof_image FROM $t_dep WHERE user_telemovel = %s AND proof_image <> ''",
            $telemovel
        ) );
        if ( $proofs ) rmbz_delete_media_urls( $proofs );
    }

    // Apagar em ordem CASCADE manual:
    //   1. Depósito (expired primeiro, para log ficar com o ID)
    //   2. Wallet
    //   3. Outras tabelas com user_telemovel
    //   4. WP user (apaga user_meta automaticamente)
    $wpdb->update( $t_dep,
        [ 'status' => 'expired', 'admin_notes' => 'Conta apagada automaticamente — primeiro depósito não pago em 24h. User era novo sem conteúdo.' ],
        [ 'id' => $dep->id ]
    );

    // Apagar wallet
    $t_wallet = $wpdb->prefix . 'rmbz_wallets';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_wallet'" ) === $t_wallet ) {
        $wpdb->delete( $t_wallet, [ 'user_telemovel' => $telemovel ], [ '%s' ] );
    }

    // Apagar notificações pendentes
    $t_notif = $wpdb->prefix . 'rmbz_notifications';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_notif'" ) === $t_notif ) {
        $wpdb->delete( $t_notif, [ 'user_telemovel' => $telemovel ], [ '%s' ] );
    }

    // Apagar device tokens FCM (se existir)
    $t_devices = $wpdb->prefix . 'rmbz_app_devices';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_devices'" ) === $t_devices ) {
        $wpdb->delete( $t_devices, [ 'user_telemovel' => $telemovel ], [ '%s' ] );
    }

    // Apagar WP user (isto apaga user_meta automaticamente)
    if ( ! function_exists( 'wp_delete_user' ) ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
    }
    $user_id_for_log = $user->ID;
    wp_delete_user( $user->ID );

    rmbz_first_deposit_expiry_log_action( [
        'user_telemovel' => $telemovel,
        'user_id'        => $user_id_for_log,
        'deposit_id'     => $dep->id,
        'action_taken'   => 'hard_delete',
        'had_releases'   => 0,
        'had_uploads'    => 0,
        'had_projects'   => 0,
        'details'        => 'Conta totalmente apagada (sem conteúdo). wp_users + wallet + notifications + devices removidos.',
    ] );
    return 'hard';
}


/**
 * Conta conteúdo gerado por um user.
 */
function rmbz_first_deposit_user_content_count( $telemovel, $user_id ) {
    global $wpdb;
    $count = [
        'releases' => 0,
        'uploads'  => 0,
        'projects' => 0,
    ];

    // Releases
    $t_rel = $wpdb->prefix . 'rmbz_distro_releases';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_rel'" ) === $t_rel ) {
        $count['releases'] = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM $t_rel WHERE artist_telemovel = %s",
            $telemovel
        ) );
    }

    // Uploads / submissions
    $t_sub = $wpdb->prefix . 'rmbz_artist_submissions';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_sub'" ) === $t_sub ) {
        $count['uploads'] = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM $t_sub WHERE artist_telemovel = %s",
            $telemovel
        ) );
    }

    // Projects
    $t_proj = $wpdb->prefix . 'rmbz_artist_projects';
    if ( $wpdb->get_var( "SHOW TABLES LIKE '$t_proj'" ) === $t_proj ) {
        $count['projects'] = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM $t_proj WHERE artist_telemovel = %s",
            $telemovel
        ) );
    }

    return $count;
}


/**
 * Log de auditoria.
 */
function rmbz_first_deposit_expiry_log_action( $data ) {
    global $wpdb;
    $t = $wpdb->prefix . 'rmbz_first_deposit_expiry_log';
    $wpdb->insert( $t, [
        'user_telemovel' => $data['user_telemovel'] ?? '',
        'user_id'        => $data['user_id'] ?? null,
        'deposit_id'     => $data['deposit_id'] ?? null,
        'action_taken'   => $data['action_taken'] ?? 'unknown',
        'had_releases'   => $data['had_releases'] ?? 0,
        'had_uploads'    => $data['had_uploads'] ?? 0,
        'had_projects'   => $data['had_projects'] ?? 0,
        'details'        => $data['details'] ?? '',
        'processed_at'   => current_time( 'mysql', 1 ),
    ] );
}


/**
 * Email de resumo ao admin.
 */
function rmbz_first_deposit_expiry_email_admin( $summary ) {
    $to = 'jaimemetano@gmail.com';
    $subject = '[1MZ] Auto-cleanup de contas: ' . $summary['processed'] . ' processadas';

    $body  = "Resumo da verificação automática de primeiros depósitos:\n\n";
    $body .= "• Total processadas: " . $summary['processed'] . "\n";
    $body .= "• Hard delete (contas limpas, apagadas): " . $summary['hard_deleted'] . "\n";
    $body .= "• Soft delete (com conteúdo, marcadas expired): " . $summary['soft_deleted'] . "\n";
    $body .= "• Skipped (users antigos ou já apagados): " . $summary['skipped'] . "\n\n";

    if ( ! empty( $summary['errors'] ) ) {
        $body .= "ERROS:\n";
        foreach ( $summary['errors'] as $err ) $body .= "  - $err\n";
        $body .= "\n";
    }

    $body .= "Ver histórico completo: " . rmbz_first_deposit_expiry_admin_url() . "\n";

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


/* ============================================================================
 * UI — Página admin com histórico + botão forçar
 *
 * [1.6.118.2] Integrado como TAB em "🧹 Cleanup de Releases Abandonadas".
 * REMOVIDO o menu próprio. Renderiza-se via `rmbz_first_deposit_expiry_render_tab_content()`
 * chamado pelo parent. URL novo: ?page=rmbz-release-cleanup&tab=accounts
 *
 * Handlers de POST aceitam ambos URLs (antigo + novo) para compat.
 * ============================================================================ */

/**
 * URL base da página de Auto-cleanup (agora é tab).
 */
function rmbz_first_deposit_expiry_admin_url( $args = [] ) {
    $base = admin_url( 'admin.php' );
    // [1.6.347] Agora é sub-aba da aba "Cleanup" das Configurações.
    $defaults = [
        'page'  => 'rmbz-settings',
        'tab'   => 'cleanup',
        'cltab' => 'accounts',
    ];
    return add_query_arg( array_merge( $defaults, $args ), $base );
}


/**
 * Processar acção "forçar agora" no admin_init (antes do output).
 */
add_action( 'admin_init', 'rmbz_first_deposit_expiry_handle_force' );

function rmbz_first_deposit_expiry_handle_force() {
    // Aceitar 2 contextos:
    //   - URL antigo (?page=rmbz-expiry-log) — para compatibilidade
    //   - URL novo (?page=rmbz-release-cleanup&tab=accounts)
    $page  = $_GET['page'] ?? '';
    $tab   = $_GET['tab']  ?? '';
    $cltab = $_GET['cltab'] ?? '';
    $is_expiry_page = ( $page === 'rmbz-expiry-log' )
        || ( $page === 'rmbz-release-cleanup' && $tab === 'accounts' )       // compat antigo
        || ( $page === 'rmbz-settings' && $tab === 'cleanup' && $cltab === 'accounts' );
    if ( ! $is_expiry_page ) return;
    if ( ! current_user_can( 'manage_options' ) ) return;
    if ( ! isset( $_POST['rmbz_force_check'] ) ) return;
    if ( ! wp_verify_nonce( $_POST['_rmbz_force_nonce'] ?? '', 'rmbz_force_expiry_check' ) ) {
        wp_die( 'Nonce inválido.' );
    }
    // Forçar SEMPRE ignora o toggle on/off (admin sabe o que está a fazer)
    $summary = rmbz_first_deposit_expiry_run( true );
    set_transient( 'rmbz_expiry_force_result', $summary, 60 );
    wp_safe_redirect( rmbz_first_deposit_expiry_admin_url( [ 'forced' => '1' ] ) );
    exit;
}


/**
 * [1.6.118.1] Handler para o toggle on/off do CRON.
 */
add_action( 'admin_init', 'rmbz_first_deposit_expiry_handle_toggle' );

function rmbz_first_deposit_expiry_handle_toggle() {
    $page  = $_GET['page'] ?? '';
    $tab   = $_GET['tab']  ?? '';
    $cltab = $_GET['cltab'] ?? '';
    $is_expiry_page = ( $page === 'rmbz-expiry-log' )
        || ( $page === 'rmbz-release-cleanup' && $tab === 'accounts' )       // compat antigo
        || ( $page === 'rmbz-settings' && $tab === 'cleanup' && $cltab === 'accounts' );
    if ( ! $is_expiry_page ) return;
    if ( ! current_user_can( 'manage_options' ) ) return;
    if ( ! isset( $_POST['rmbz_toggle_cron'] ) ) return;
    if ( ! wp_verify_nonce( $_POST['_rmbz_toggle_nonce'] ?? '', 'rmbz_toggle_cron_action' ) ) {
        wp_die( 'Nonce inválido.' );
    }
    $new_state = isset( $_POST['enable'] ) && $_POST['enable'] === '1' ? 1 : 0;
    update_option( 'rmbz_expiry_cron_enabled', $new_state );
    delete_transient( 'rmbz_expiry_cron_skip_logged' );
    wp_safe_redirect( rmbz_first_deposit_expiry_admin_url( [ 'toggled' => $new_state ? 'on' : 'off' ] ) );
    exit;
}


/**
 * [1.6.118.2] Wrapper de compat — se algum sítio antigo apontar para
 * ?page=rmbz-expiry-log, redirecciona para o URL novo.
 */
add_action( 'admin_init', function () {
    if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'rmbz-expiry-log' ) return;
    // Se foi POST, deixa os handlers acima processarem primeiro
    if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) return;
    if ( ! current_user_can( 'manage_options' ) ) return;
    wp_safe_redirect( rmbz_first_deposit_expiry_admin_url() );
    exit;
}, 5 );  // priority 5 — antes dos outros admin_init handlers


/**
 * Render do CONTEÚDO da tab (NÃO emite <div class="wrap"><h1>...</h1>
 * porque o parent já emite). Chamado a partir de
 * `rmbz_release_cleanup_render_body` quando ?cltab=accounts.
 */
function rmbz_first_deposit_expiry_render_tab_content() {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );

    global $wpdb;
    $t_log = $wpdb->prefix . 'rmbz_first_deposit_expiry_log';
    $t_dep = $wpdb->prefix . 'rmbz_deposit_requests';

    // Contadores
    $pending_expired = (int) $wpdb->get_var(
        "SELECT COUNT(*) FROM $t_dep
          WHERE is_first_deposit = 1 AND status = 'pendente'
            AND request_date < ( UTC_TIMESTAMP() - INTERVAL 25 HOUR )"
    );
    $pending_soon = (int) $wpdb->get_var(
        "SELECT COUNT(*) FROM $t_dep
          WHERE is_first_deposit = 1 AND status = 'pendente'
            AND request_date < ( UTC_TIMESTAMP() - INTERVAL 18 HOUR )
            AND request_date >= ( UTC_TIMESTAMP() - INTERVAL 25 HOUR )"
    );

    $total_hard = (int) $wpdb->get_var( "SELECT COUNT(*) FROM $t_log WHERE action_taken = 'hard_delete'" );
    $total_soft = (int) $wpdb->get_var( "SELECT COUNT(*) FROM $t_log WHERE action_taken = 'soft_delete'" );
    $total_skip = (int) $wpdb->get_var( "SELECT COUNT(*) FROM $t_log WHERE action_taken = 'skipped'" );

    $logs = $wpdb->get_results(
        "SELECT * FROM $t_log ORDER BY id DESC LIMIT 100"
    );

    $force_result = get_transient( 'rmbz_expiry_force_result' );
    if ( isset( $_GET['forced'] ) ) delete_transient( 'rmbz_expiry_force_result' );

    $next_cron = wp_next_scheduled( 'rmbz_first_deposit_expiry_check' );
    $cron_enabled = (bool) get_option( 'rmbz_expiry_cron_enabled', false );
    ?>

    <?php if ( isset( $_GET['toggled'] ) ): ?>
        <div class="notice notice-success is-dismissible">
            <p><strong>
                <?php if ( $_GET['toggled'] === 'on' ): ?>
                    ✓ CRON ACTIVADO — passará a apagar contas automaticamente de hora a hora.
                <?php else: ?>
                    ⊗ CRON DESACTIVADO — não vai apagar mais nada até voltares a activar. (Botão "Forçar agora" continua a funcionar mesmo desactivado, para testes.)
                <?php endif; ?>
            </strong></p>
        </div>
    <?php endif; ?>

    <h2 style="margin-top:0;">👤 Auto-cleanup de Contas (Primeiro Depósito 24h)</h2>

        <!-- [1.6.118.1] Toggle CRON on/off — primeira coisa na página -->
        <div style="background:<?php echo $cron_enabled ? '#d1fae5' : '#fee2e2'; ?>; border-left:4px solid <?php echo $cron_enabled ? '#10b981' : '#dc2626'; ?>; padding:14px 18px; margin-bottom:18px; border-radius:6px;">
            <div style="display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:14px;">
                <div>
                    <div style="font-size:14px; font-weight:700; color:<?php echo $cron_enabled ? '#065f46' : '#991b1b'; ?>;">
                        <?php echo $cron_enabled ? '✓ CRON ACTIVO' : '⊗ CRON DESACTIVADO'; ?>
                    </div>
                    <div style="font-size:12px; color:#444; margin-top:4px;">
                        <?php if ( $cron_enabled ): ?>
                            Auto-delete está a correr de hora a hora. Contas com primeiro depósito não pago em 24h serão processadas automaticamente.
                        <?php else: ?>
                            <strong>Nenhuma conta será apagada automaticamente.</strong> Activa quando quiseres começar a aplicar a regra. Podes sempre usar "Forçar agora" para testar manualmente.
                        <?php endif; ?>
                    </div>
                </div>
                <form method="post" style="margin:0;" onsubmit="return confirm('<?php echo $cron_enabled ? 'Desactivar o CRON? Auto-delete vai parar de correr.' : 'Activar o CRON? Vai começar a apagar contas com depósito vencido a partir de agora.'; ?>');">
                    <?php wp_nonce_field( 'rmbz_toggle_cron_action', '_rmbz_toggle_nonce' ); ?>
                    <input type="hidden" name="enable" value="<?php echo $cron_enabled ? '0' : '1'; ?>">
                    <button type="submit" name="rmbz_toggle_cron" value="1" class="button button-large" style="background:<?php echo $cron_enabled ? '#dc2626' : '#10b981'; ?>; color:#fff; border:none; padding:8px 20px; font-weight:600;">
                        <?php echo $cron_enabled ? '⊗ Desactivar CRON' : '✓ Activar CRON'; ?>
                    </button>
                </form>
            </div>
        </div>

        <p style="background:#fffbeb; border-left:4px solid #f59e0b; padding:12px 16px; font-size:13px;">
            Esta página mostra o histórico de eliminações automáticas. O CRON corre
            <strong>de hora a hora</strong> e apaga/marca como expired contas com primeiro
            depósito pendente há mais de <strong>25h</strong> (24h + 1h grace).
            Próximo run agendado para: <strong><?php echo $next_cron ? date( 'd/m/Y H:i', $next_cron ) : '— não agendado'; ?></strong>
        </p>

        <?php if ( $force_result && isset( $_GET['forced'] ) ): ?>
            <div class="notice notice-success">
                <p><strong>✓ Verificação forçada concluída:</strong>
                    Processadas <?php echo (int) $force_result['processed']; ?> ·
                    Apagadas <?php echo (int) $force_result['hard_deleted']; ?> ·
                    Marcadas expired <?php echo (int) $force_result['soft_deleted']; ?> ·
                    Skipped <?php echo (int) $force_result['skipped']; ?>
                </p>
            </div>
        <?php endif; ?>

        <div style="display:grid; grid-template-columns:repeat(5, 1fr); gap:10px; margin:18px 0;">
            <div style="background:#fff; border:1px solid #e5e5e5; border-left:4px solid #dc2626; border-radius:6px; padding:14px;">
                <div style="font-size:10px; text-transform:uppercase; color:#666; font-weight:600;">Para apagar AGORA</div>
                <div style="font-size:28px; font-weight:700; color:#dc2626;"><?php echo $pending_expired; ?></div>
            </div>
            <div style="background:#fff; border:1px solid #e5e5e5; border-left:4px solid #f59e0b; border-radius:6px; padding:14px;">
                <div style="font-size:10px; text-transform:uppercase; color:#666; font-weight:600;">A expirar nas próximas 7h</div>
                <div style="font-size:28px; font-weight:700; color:#f59e0b;"><?php echo $pending_soon; ?></div>
            </div>
            <div style="background:#fff; border:1px solid #e5e5e5; border-radius:6px; padding:14px;">
                <div style="font-size:10px; text-transform:uppercase; color:#666; font-weight:600;">Hard delete total</div>
                <div style="font-size:28px; font-weight:700;"><?php echo $total_hard; ?></div>
            </div>
            <div style="background:#fff; border:1px solid #e5e5e5; border-radius:6px; padding:14px;">
                <div style="font-size:10px; text-transform:uppercase; color:#666; font-weight:600;">Soft delete total</div>
                <div style="font-size:28px; font-weight:700;"><?php echo $total_soft; ?></div>
            </div>
            <div style="background:#fff; border:1px solid #e5e5e5; border-radius:6px; padding:14px;">
                <div style="font-size:10px; text-transform:uppercase; color:#666; font-weight:600;">Skipped total</div>
                <div style="font-size:28px; font-weight:700;"><?php echo $total_skip; ?></div>
            </div>
        </div>

        <form method="post" style="margin:14px 0;" onsubmit="return confirm('Forçar verificação agora? Vai aplicar regras de auto-delete imediatamente.');">
            <?php wp_nonce_field( 'rmbz_force_expiry_check', '_rmbz_force_nonce' ); ?>
            <button type="submit" name="rmbz_force_check" value="1" class="button button-primary">
                🧹 Forçar verificação agora (não esperar o CRON)
            </button>
            <span style="color:#888; font-size:12px; margin-left:8px;">
                Corre a mesma lógica que o CRON corre de hora a hora.
            </span>
        </form>

        <h2 style="margin-top:30px;">Histórico (últimas 100 acções)</h2>
        <?php if ( empty( $logs ) ): ?>
            <p style="color:#666;">Sem acções registadas ainda.</p>
        <?php else: ?>
            <table class="widefat striped" style="font-size:12.5px;">
                <thead><tr>
                    <th>Quando</th>
                    <th>Artista (tel)</th>
                    <th>User ID</th>
                    <th>Dep ID</th>
                    <th>Acção</th>
                    <th>Tinha conteúdo</th>
                    <th>Detalhes</th>
                </tr></thead>
                <tbody>
                    <?php foreach ( $logs as $log ):
                        $badge_color = $log->action_taken === 'hard_delete' ? '#dc2626'
                                     : ( $log->action_taken === 'soft_delete' ? '#f59e0b' : '#6b7280' );
                        $badge_label = $log->action_taken === 'hard_delete' ? '🗑 HARD DELETE'
                                     : ( $log->action_taken === 'soft_delete' ? '⚠ EXPIRED (preservado)' : '⊘ Skipped' );
                    ?>
                        <tr>
                            <td><?php echo esc_html( date( 'd/m/Y H:i', strtotime( $log->processed_at ) ) ); ?></td>
                            <td><code><?php echo esc_html( $log->user_telemovel ); ?></code></td>
                            <td><?php echo $log->user_id ? '#' . (int) $log->user_id : '—'; ?></td>
                            <td><?php echo $log->deposit_id ? '#' . (int) $log->deposit_id : '—'; ?></td>
                            <td>
                                <span style="display:inline-block; padding:3px 8px; background:<?php echo $badge_color; ?>; color:#fff; border-radius:8px; font-size:10.5px; font-weight:600;">
                                    <?php echo $badge_label; ?>
                                </span>
                            </td>
                            <td style="font-size:11px; color:#666;">
                                R: <?php echo (int) $log->had_releases; ?> ·
                                U: <?php echo (int) $log->had_uploads; ?> ·
                                P: <?php echo (int) $log->had_projects; ?>
                            </td>
                            <td style="font-size:11.5px; color:#444;"><?php echo esc_html( $log->details ); ?></td>
                        </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        <?php endif; ?>
    <?php
}
