<?php

declare(strict_types=1);

namespace App\Console\Commands;

use App\Models\Company;
use App\Models\ParSnapshot;
use App\Services\Metrics\DelinquencyMetricsService;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Throwable;

/**
 * Toma y persiste un snapshot del PAR real para cada empresa activa.
 *
 * Se ejecuta a las 23:50 para capturar el estado de fin de día.
 * Es idempotente: usa updateOrCreate por (company_id, snapshot_date),
 * por lo que puede re-ejecutarse sin duplicar registros.
 *
 * Uso:
 *   php artisan credify:snapshot-par            # todas las empresas activas
 *   php artisan credify:snapshot-par --company=5 # solo una empresa (debug)
 */
class SnapshotPar extends Command
{
    protected $signature = 'credify:snapshot-par
        {--company= : ID de empresa específica (debug/reprocess)}';

    protected $description = 'Guarda un snapshot diario real de PAR para todas las empresas activas.';

    public function handle(DelinquencyMetricsService $service): int
    {
        $today = Carbon::today()->toDateString();
        $companyId = $this->option('company');

        $this->info('═══════════════════════════════════════════════════');
        $this->info('  SNAPSHOT PAR — '.$today);
        $this->info('═══════════════════════════════════════════════════');

        // Obtener empresas a procesar
        $query = Company::query()->where('status', Company::STATUS_ACTIVE);
        if ($companyId) {
            $query->where('id', (int) $companyId);
        }
        $companies = $query->get(['id', 'name']);

        if ($companies->isEmpty()) {
            $this->warn('No se encontraron empresas activas para procesar.');

            return self::SUCCESS;
        }

        $this->line("Empresas a procesar: {$companies->count()}");
        $this->newLine();

        $ok = 0;
        $errors = 0;

        foreach ($companies as $company) {
            try {
                // Calcular PAR real sin caché (datos de fin de día autoritativos)
                $par = $service->computeRawPAR($company->id);

                // Los valores 'par1'...'par90' contienen arrays con par_percentage y totales
                $par30Data = $par['par30'] ?? [];

                ParSnapshot::updateOrCreate(
                    [
                        'company_id' => $company->id,
                        'snapshot_date' => $today,
                    ],
                    [
                        'par1' => $par['par1']['par_percentage'] ?? 0,
                        'par7' => $par['par7']['par_percentage'] ?? 0,
                        'par15' => $par['par15']['par_percentage'] ?? 0,
                        'par30' => $par['par30']['par_percentage'] ?? 0,
                        'par60' => $par['par60']['par_percentage'] ?? 0,
                        'par90' => $par['par90']['par_percentage'] ?? 0,
                        'total_portfolio' => $par30Data['total_portfolio'] ?? 0,
                        'at_risk_portfolio' => $par30Data['at_risk_balance'] ?? 0,
                        'created_at' => now(),
                    ]
                );

                $par30Pct = number_format($par['par30']['par_percentage'] ?? 0, 2);
                $this->line("  ✓ [{$company->id}] {$company->name} — PAR30: {$par30Pct}%");
                $ok++;

            } catch (Throwable $e) {
                $this->error("  ✗ [{$company->id}] {$company->name} — {$e->getMessage()}");
                $errors++;
            }
        }

        $this->newLine();
        $this->info("Completado: {$ok} OK, {$errors} errores.");

        return $errors > 0 ? self::FAILURE : self::SUCCESS;
    }
}
