<?php

declare(strict_types=1);

namespace App\Console\Commands;

use App\Models\Company;
use App\Models\DashboardSnapshot;
use App\Services\Dashboard\AdminDashboardMetricsService;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Throwable;

/**
 * Snapshot diario de las métricas financieras del dashboard admin por empresa.
 * Se ejecuta a las 23:55. Idempotente: updateOrCreate por (company_id, snapshot_date).
 *
 *   php artisan credify:snapshot-dashboard             # todas las empresas activas
 *   php artisan credify:snapshot-dashboard --company=5 # solo una (debug)
 */
class SnapshotDashboardMetrics extends Command
{
    protected $signature = 'credify:snapshot-dashboard
        {--company= : ID de empresa específica (debug/reprocess)}';

    protected $description = 'Guarda un snapshot diario de las métricas financieras del dashboard admin.';

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

        $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;
        }

        $ok = 0;
        $errors = 0;

        foreach ($companies as $company) {
            try {
                $m = $metrics->getMetrics($company->id);

                DashboardSnapshot::updateOrCreate(
                    [
                        'company_id' => $company->id,
                        'snapshot_date' => $today,
                    ],
                    [
                        'business_total' => $m['business_total']['amount'] ?? 0,
                        'cash_base' => $m['cash_base']['amount'] ?? 0,
                        'por_cobrar' => $m['por_cobrar']['amount'] ?? 0,
                        'overdue' => $m['por_cobrar']['overdue'] ?? 0,
                        'delinquency_rate' => $m['delinquency_rate'] ?? 0,
                        'created_at' => now(),
                    ]
                );

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

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

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