<?php
/**
 * includes/admin/import-unrevert.php
 *
 * ============================================================================
 * DESFAZER ANULAÇÃO DE IMPORTAÇÃO
 * ============================================================================
 *
 * Permite ao admin recriar uma importação que foi anulada por engano,
 * usando o CSV arquivado (1.5.108) como fonte. O resultado é um NOVO
 * registo em rmbz_distro_import_logs (não modifica o anterior, que fica
 * para histórico) ligado ao original via `unrevert_replaces`.
 *
 * Fluxo:
 *   1. Admin clica botão "↶ Desfazer Anulação" num import com status='reverted'
 *   2. Handler verifica que o CSV arquivado existe
 *   3. Limpa o file_hash da lista de imported_hashes (senão bloqueia)
 *   4. Copia o CSV para /tmp_imports/ e redireciona para o fluxo normal
 *      de processamento (mesmo URL que o utilizador veria após upload)
 *   5. Marca o import original como `unrevert_replaced_by` para auditoria
 *
 * O novo import passa pelo workflow normal:
 *   - Pendente de aprovação → admin pode aprovar/rejeitar
 *   - Cria novas linhas em ledger/daily_stats com NOVO import_log_id
 *   - Não toca em wallets/stats até ser aprovado
 *
 * IMPORTANTE: o admin tem de aprovar o novo import depois.
 */

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


function rmbz_handle_unrevert_import() {
    if ( ! current_user_can('manage_options') ) wp_die('Sem permissão.');

    $log_id = isset($_GET['log_id']) ? (int) $_GET['log_id'] : 0;
    if ( $log_id <= 0 ) wp_die('ID inválido.');

    check_admin_referer( 'rmbz_unrevert_import_' . $log_id );

    global $wpdb;
    $t_logs = $wpdb->prefix . 'rmbz_distro_import_logs';
    $base_url = admin_url('admin.php?page=rmbz-admin-distribution&tab=royalties&rsub=imports');

    $log = $wpdb->get_row( $wpdb->prepare(
        "SELECT * FROM $t_logs WHERE id = %d",
        $log_id
    ) );

    if ( ! $log ) {
        wp_safe_redirect( add_query_arg('unrevert_error', urlencode('Importação não encontrada.'), $base_url) );
        exit;
    }

    // Validações de estado
    if ( $log->status !== 'reverted' ) {
        wp_safe_redirect( add_query_arg('unrevert_error', urlencode('Esta importação não está anulada — só se pode desfazer anulações.'), $base_url) );
        exit;
    }
    if ( ! empty($log->unrevert_replaced_by) ) {
        wp_safe_redirect( add_query_arg('unrevert_error', urlencode('Esta anulação já foi desfeita anteriormente (importação #' . (int) $log->unrevert_replaced_by . ').'), $base_url) );
        exit;
    }
    if ( empty($log->archived_path) || ! function_exists('rmbz_archive_csv_exists') || ! rmbz_archive_csv_exists($log->archived_path) ) {
        wp_safe_redirect( add_query_arg('unrevert_error', urlencode('CSV original não está arquivado (importação anterior à 1.5.108). Re-importa manualmente o ficheiro.'), $base_url) );
        exit;
    }

    // Verificar que não há outro import ACTIVO com o mesmo file_hash —
    // senão criamos duplicado de dinheiro.
    $existing_active = (int) $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM $t_logs
         WHERE file_hash = %s
           AND status = 'active'
           AND ( approval_status IS NULL OR approval_status != 'rejected' )",
        $log->file_hash
    ) );
    if ( $existing_active > 0 ) {
        wp_safe_redirect( add_query_arg('unrevert_error', urlencode('Já existe outra importação activa com o mesmo ficheiro. Anula essa primeiro se queres reusar este CSV.'), $base_url) );
        exit;
    }

    // Preparar o re-upload: copiar o CSV arquivado para /tmp_imports/
    $upload_dir = wp_upload_dir();
    if ( ! empty($upload_dir['error']) ) {
        wp_safe_redirect( add_query_arg('unrevert_error', urlencode('Erro de filesystem.'), $base_url) );
        exit;
    }
    $tmp_dir = $upload_dir['basedir'] . '/rmbz_temp_imports';
    if ( ! file_exists($tmp_dir) ) {
        wp_mkdir_p($tmp_dir);
    }

    $original_basename = basename($log->archived_path);
    // Remove prefix "<id>_<hash8>_" para nome amigável no novo import
    $clean_name = preg_replace('/^\d+_[a-f0-9]{8}_/', '', $original_basename);
    if ( empty($clean_name) ) $clean_name = $original_basename;

    // Adicionar timestamp para evitar colisão se admin fez unrevert antes
    $tmp_name = 'unrevert_' . time() . '_' . sanitize_file_name($clean_name);
    $tmp_path = $tmp_dir . '/' . $tmp_name;

    if ( ! @copy( $log->archived_path, $tmp_path ) ) {
        wp_safe_redirect( add_query_arg('unrevert_error', urlencode('Erro ao copiar CSV arquivado para área de processamento.'), $base_url) );
        exit;
    }

    // Limpar entrada do file_hash na lista de imported (senão o sistema
    // recusa "já importado").
    $imported = get_option( 'rmbz_imported_csv_hashes', [] );
    $imported = array_values( array_filter( (array) $imported, function($h) use ($log) {
        return $h !== $log->file_hash;
    } ) );
    update_option( 'rmbz_imported_csv_hashes', $imported, false );

    // Apagar comissão antiga (UNIQUE KEY no hash bloqueia re-import)
    $t_comm = $wpdb->prefix . 'rmbz_distro_platform_commissions';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_comm'") === $t_comm ) {
        $wpdb->query( $wpdb->prepare(
            "DELETE FROM $t_comm WHERE import_hash = %s",
            $log->file_hash
        ) );
    }

    // Marcar log original como "a ser desfeito" — quando o novo import
    // for criado por rmbz_log_csv_import, vamos completar a ligação
    // bidireccional via update.
    $current_user = wp_get_current_user();
    $admin_login = $current_user && $current_user->exists() ? $current_user->user_login : 'admin';

    set_transient( 'rmbz_unrevert_pending_' . md5($tmp_name), [
        'original_log_id' => (int) $log->id,
        'admin'           => $admin_login,
    ], 30 * MINUTE_IN_SECONDS );

    // Audit no original
    $existing_notes = (string) ($log->rejection_reason ?? '');
    $new_note = sprintf(
        '[Desfazer anulação iniciado por %s em %s — CSV copiado para %s]',
        $admin_login,
        current_time('mysql'),
        $tmp_name
    );
    $combined_notes = trim($existing_notes . "\n" . $new_note);
    $wpdb->update(
        $t_logs,
        [ 'rejection_reason' => $combined_notes ],
        [ 'id' => $log->id ],
        [ '%s' ], [ '%d' ]
    );

    // Redireccionar para o fluxo de preview, como se admin tivesse acabado
    // de fazer upload.
    wp_safe_redirect( admin_url('admin.php?page=rmbz-admin-distribution&tab=import&temp_file=' . urlencode($tmp_name) . '&from_unrevert=' . (int) $log->id) );
    exit;
}
add_action( 'admin_post_rmbz_unrevert_import', 'rmbz_handle_unrevert_import' );


/**
 * Hook ao log_csv_import para completar a ligação bidireccional quando
 * o novo import (vindo de unrevert) é criado com sucesso.
 */
add_action( 'rmbz_after_log_csv_import', function( $new_log_id, $hash, $temp_filename ) {
    if ( empty($temp_filename) ) return;
    $key = 'rmbz_unrevert_pending_' . md5($temp_filename);
    $pending = get_transient($key);
    if ( ! is_array($pending) || empty($pending['original_log_id']) ) return;

    global $wpdb;
    $t_logs = $wpdb->prefix . 'rmbz_distro_import_logs';

    // Original ← aponta para novo
    $wpdb->update(
        $t_logs,
        [ 'unrevert_replaced_by' => (int) $new_log_id ],
        [ 'id' => (int) $pending['original_log_id'] ],
        [ '%d' ], [ '%d' ]
    );
    // Novo ← aponta para original
    $wpdb->update(
        $t_logs,
        [ 'unrevert_replaces' => (int) $pending['original_log_id'] ],
        [ 'id' => (int) $new_log_id ],
        [ '%d' ], [ '%d' ]
    );

    delete_transient($key);
}, 10, 3 );
