<?php

namespace App\Console\Commands;

use App\Models\Installment;
use Carbon\Carbon;
use Illuminate\Console\Command;

class UpdateInstallmentsStatus extends Command
{
    // El comando se invocará como: php artisan credits:update-installments
    protected $signature = 'credits:update-installments';

    protected $description = 'Actualiza el estado de las cuotas a vencido (overdue) si la fecha de vencimiento ha pasado y aún no están pagadas completamente.';

    public function handle()
    {
        $this->info('Iniciando actualización de estados de cuotas...');
        $today = Carbon::now()->startOfDay();

        // GUARD: excluir cuotas de créditos con saldo real <= 0.
        // remaining_balance es un accessor calculado (no columna real), por eso usamos subquery.
        // Si el crédito ya está saldado, ninguna de sus cuotas debe pasar a 'overdue',
        // independientemente de la fecha de vencimiento.
        $notPaidCreditSubquery = fn ($q) => $q->whereRaw(
            '(SELECT COALESCE(SUM(i.total_amount),0) - COALESCE(SUM(i.amount_paid),0) '
            .'FROM installments i WHERE i.credit_id = credits.id) > 0'
        );

        // 1. Marcar cuotas PENDIENTES como VENCIDAS
        // Si la fecha de vencimiento es anterior a hoy, y el estado es 'pending', pasa a 'overdue'.
        $overduePendingCount = Installment::where('due_date', '<', $today)
            ->where('status', 'pending')
            ->whereHas('credit', $notPaidCreditSubquery)
            ->update(['status' => 'overdue']);

        // 2. Marcar cuotas PAGADAS PARCIALMENTE como VENCIDAS
        // Si la fecha de vencimiento es anterior a hoy, y el estado es 'partial_paid', pasa a 'overdue'.
        $overduePartialCount = Installment::where('due_date', '<', $today)
            ->where('status', 'partial_paid')
            ->whereHas('credit', $notPaidCreditSubquery)
            ->update(['status' => 'overdue']);

        $totalUpdated = $overduePendingCount + $overduePartialCount;

        $this->info('Proceso completado.');
        $this->info("-> Cuotas pendientes marcadas como vencidas: {$overduePendingCount}");
        $this->info("-> Cuotas parcialmente pagadas marcadas como vencidas: {$overduePartialCount}");
        $this->info("Total de cuotas actualizadas a 'overdue': {$totalUpdated}");

        return Command::SUCCESS;
    }
}
