<?php

declare(strict_types=1);

namespace App\Models;

use App\Traits\MultiTenantScope;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
 * Snapshot diario de PAR (Portfolio at Risk) por empresa.
 *
 * Generado cada noche a las 23:50 por el command `credify:snapshot-par`.
 * Permite construir la tendencia histórica real de morosidad sin recurrir
 * a datos simulados.
 *
 * @property int $id
 * @property int $company_id
 * @property Carbon $snapshot_date (DATE, unique por empresa)
 * @property float $par1
 * @property float $par7
 * @property float $par15
 * @property float $par30
 * @property float $par60
 * @property float $par90
 * @property float $total_portfolio
 * @property float $at_risk_portfolio
 */
class ParSnapshot extends Model
{
    use MultiTenantScope;

    public $timestamps = false;

    protected $fillable = [
        'company_id',
        'snapshot_date',
        'par1',
        'par7',
        'par15',
        'par30',
        'par60',
        'par90',
        'total_portfolio',
        'at_risk_portfolio',
        'created_at',
    ];

    protected $casts = [
        'snapshot_date' => 'date',
        'par1' => 'float',
        'par7' => 'float',
        'par15' => 'float',
        'par30' => 'float',
        'par60' => 'float',
        'par90' => 'float',
        'total_portfolio' => 'float',
        'at_risk_portfolio' => 'float',
        'created_at' => 'datetime',
    ];

    public function company(): BelongsTo
    {
        return $this->belongsTo(Company::class);
    }

    // ── Scopes ───────────────────────────────────────────────────────────────

    /** Últimos N días para una empresa (sin incluir hoy si aún no hay snapshot). */
    public function scopeLastDays($query, int $days): mixed
    {
        return $query->where('snapshot_date', '>=', now()->subDays($days)->toDateString())
            ->orderBy('snapshot_date');
    }
}
