<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;

class PolicyVersion extends Model
{
    use HasFactory;
    use SoftDeletes;

    protected $guarded = [];

    protected $casts = [
        'snapshot' => 'array',
        'metadata' => 'array',
        'assignments' => 'array',
        'scope_tags' => 'array',
        'captured_at' => 'datetime',
    ];

    public function previous(): ?self
    {
        return $this->policy
            ? $this->policy
                ->versions()
                ->where('version_number', '<', $this->version_number)
                ->orderByDesc('version_number')
                ->first()
            : null;
    }

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

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

    public function scopePruneEligible($query, int $days = 90)
    {
        return $query
            ->whereNull('deleted_at')
            ->where('captured_at', '<', now()->subDays($days))
            ->whereRaw(
                'policy_versions.version_number < (select max(pv2.version_number) from policy_versions pv2 where pv2.policy_id = policy_versions.policy_id and pv2.deleted_at is null)'
            );
    }
}
