<?php

namespace App\Policy\Entity;

use App\Policy\Repository\PolicyVersionLogRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * عکس هر نسخهٔ یک قانون.
 *
 * نوبتی که دیروز ثبت شده، نسخه‌ای را در `applied_policies` نگه می‌دارد که ممکن است
 * امروز دیگر متن فعلی قانون نباشد. بدون این جدول، «چرا آن نوبت این قیمت را گرفت؟»
 * سه ماه بعد بی‌جواب می‌ماند.
 *
 * فرزند aggregate با ریشهٔ {@see Policy}؛ فقط نوشته می‌شود و هرگز ویرایش نمی‌شود.
 */
#[ORM\Entity(repositoryClass: PolicyVersionLogRepository::class)]
#[ORM\Table(name: 'policy_version_logs')]
#[ORM\UniqueConstraint(name: 'uniq_policy_version', columns: ['policy_id', 'version'])]
class PolicyVersionLog
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private ?int $id = null;

    #[ORM\ManyToOne(targetEntity: Policy::class)]
    #[ORM\JoinColumn(name: 'policy_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
    private Policy $policy;

    #[ORM\Column(type: 'smallint')]
    private int $version;

    #[ORM\Column(type: 'json')]
    private array $snapshot;

    #[ORM\Column(name: 'created_at', type: 'integer')]
    private int $createdAt;

    public function __construct(Policy $policy, int $version, array $snapshot)
    {
        $this->policy    = $policy;
        $this->version   = $version;
        $this->snapshot  = $snapshot;
        $this->createdAt = time();
    }

    public function getId(): ?int        { return $this->id; }
    public function getPolicy(): Policy  { return $this->policy; }
    public function getVersion(): int    { return $this->version; }
    public function getSnapshot(): array { return $this->snapshot; }

    public function toArray(): array
    {
        return [
            'version'    => $this->version,
            'snapshot'   => $this->snapshot,
            'created_at' => $this->createdAt,
        ];
    }
}
