<?php
$initialDir = getcwd();
chdir(__DIR__ . '/../');

require_once __DIR__ . '/../vendor/autoload.php';

use Ubnt\UcrmPluginSdk\Service\PluginConfigManager;
use Stripe\StripeClient;
use Stripe\Exception\ApiErrorException;

function logMessage($message)
{
    $logFile = __DIR__ . '/clean_incomplete_pi.log';
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($logFile, "[$timestamp] $message\n", FILE_APPEND);
    if (php_sapi_name() === 'cli') {
        fwrite(STDERR, "[$timestamp] $message\n");
    }
}

// -- Argument Parsing --
$isDryRun = true;
foreach ($argv as $arg) {
    if ($arg === '--confirm') {
        $isDryRun = false;
    }
}

// -- Initialization --
$config = PluginConfigManager::create()->loadConfig();
$stripeApiKey = $config['tokenstripe'] ?? '';

if (empty($stripeApiKey)) {
    logMessage("Error: Stripe Secret Key is missing in plugin configuration.");
    exit(1);
}

$stripeClient = new StripeClient($stripeApiKey);

logMessage("Iniciando LIMPIEZA de Intenciones de Pago (SPEI/Transferencia) incompletas...");

if ($isDryRun) {
    logMessage("ATENCIÓN: Ejecutando en MODO PRUEBA (Dry Run). No se cancelará nada en Stripe.");
    logMessage("Para ejecutar la limpieza real, pasa el argumento: --confirm");
} else {
    logMessage("ATENCIÓN: Ejecutando en MODO DESTRUCTIVO. Se procederá a cancelar las intenciones encontradas.");
}

$hasMore = true;
$nextPage = null;
$totalCanceled = 0;
$totalFound = 0;

while ($hasMore) {
    try {
        $queryParams = [
            'query' => 'status:"requires_payment_method" OR status:"requires_action"',
            'limit' => 100
        ];
        
        if ($nextPage) {
            $queryParams['page'] = $nextPage;
        }

        $results = $stripeClient->paymentIntents->search($queryParams);

        foreach ($results->data as $pi) {
            // Proteger y omitir por completo cualquier intención de OXXO
            $paymentMethodTypes = $pi->payment_method_types ?? [];
            $isOxxo = in_array('oxxo', $paymentMethodTypes);
            
            if ($isOxxo) {
                continue;
            }

            // Filtrar solo las que son de Transferencia Bancaria
            $isBankTransfer = in_array('customer_balance', $paymentMethodTypes);
            $tipoPago = $pi->metadata['tipoPago'] ?? '';
            
            if ($isBankTransfer || ($tipoPago === 'Transferencia Bancaria' && !$isOxxo)) {
                $totalFound++;
                $logStr = "PI: {$pi->id} | Cliente: {$pi->customer} | Monto: " . ($pi->amount / 100) . " {$pi->currency}";
                
                if (!$isDryRun) {
                    try {
                        $stripeClient->paymentIntents->cancel($pi->id, [
                            'cancellation_reason' => 'abandoned'
                        ]);
                        logMessage("[CANCELADA] $logStr");
                        $totalCanceled++;
                    } catch (ApiErrorException $e) {
                        logMessage("[ERROR al cancelar] $logStr - Detalle: " . $e->getMessage());
                    }
                } else {
                    logMessage("[SIMULACIÓN - Sería Cancelada] $logStr");
                }
            }
        }

        $hasMore = $results->has_more;
        $nextPage = $results->next_page;
        
        // Pausa breve para evitar Rate Limits
        usleep(500000); // 0.5s

    } catch (ApiErrorException $e) {
        logMessage("Error en la API de Stripe: " . $e->getMessage());
        break;
    } catch (\Exception $e) {
        logMessage("Error inesperado: " . $e->getMessage());
        break;
    }
}

logMessage("=== RESUMEN DE LA LIMPIEZA ===");
logMessage("Total encontradas (SPEI): $totalFound");
if (!$isDryRun) {
    logMessage("Total CANCELADAS exitosamente: $totalCanceled");
} else {
    logMessage("Modo PRUEBA finalizado. Ninguna fue cancelada.");
}
echo "\nVerifica el log 'clean_incomplete_pi.log' para los detalles.\n";
