<?php

declare(strict_types=1);

namespace App\Support;

use App\Models\Credit;

/**
 * Backfill cronológico de `company_credit_number` para créditos existentes.
 *
 * Numera, por empresa, los créditos que todavía no tienen
 * `company_credit_number` asignado, en orden cronológico de creación
 * (created_at, luego id como desempate). Arranca desde el máximo actual de
 * cada empresa, así que es seguro volver a ejecutarlo (no reasigna números
 * ya usados ni los duplica).
 *
 * Usado por la migración de datos y disponible para reintentos manuales.
 */
class CreditNumberBackfill
{
    public static function run(): void
    {
        $companyIds = Credit::withoutGlobalScopes()
            ->whereNull('company_credit_number')
            ->distinct()
            ->pluck('company_id');

        foreach ($companyIds as $companyId) {
            $n = (int) Credit::withoutGlobalScopes()
                ->where('company_id', $companyId)
                ->max('company_credit_number');

            // get() en vez de each()/chunk(): estamos actualizando la misma
            // columna que filtra el WHERE (company_credit_number IS NULL), y
            // chunk() pagina con LIMIT/OFFSET — al mutar filas ya visitadas
            // el offset se desalinea y se saltan filas después de la primera
            // página. get() materializa el resultado una sola vez, así que
            // es seguro iterarlo mientras se actualiza.
            $credits = Credit::withoutGlobalScopes()
                ->where('company_id', $companyId)
                ->whereNull('company_credit_number')
                ->orderBy('created_at')
                ->orderBy('id')
                ->get();

            foreach ($credits as $credit) {
                $credit->updateQuietly(['company_credit_number' => ++$n]);
            }
        }
    }
}
