<?php

namespace App\Resource\Entity;

use App\Resource\Repository\NationalHolidayRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Uuid;

/**
 * تعطیل رسمی کشور. عمداً سراسری است و به هیچ محیطی تعلق ندارد — امروز هر پزشک باید
 * ۱۳ فروردین را دستی ثبت کند، که هم تکرار است و هم منبع خطا.
 *
 * محیطی که خلافش کار می‌کند با {@see TenantHolidayOverride} استثنا می‌زند؛ خودِ این
 * جدول per محیط نمی‌شود، وگرنه «تعطیل کشوری» معنایش را از دست می‌دهد.
 *
 * `date` نیمه‌شبِ همان روز به وقت تهران است (int، مثل بقیهٔ زمان‌های پروژه) و
 * `jalali_date` فقط برای نمایش و import.
 */
#[ORM\Entity(repositoryClass: NationalHolidayRepository::class)]
#[ORM\Table(name: 'national_holidays')]
#[ORM\UniqueConstraint(name: 'uniq_holiday_date', columns: ['date'])]
#[ORM\Index(columns: ['jalali_year'], name: 'idx_holiday_year')]
class NationalHoliday
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private ?int $id = null;

    #[ORM\Column(type: 'string', length: 36, unique: true)]
    private string $uuid;

    /** نیمه‌شب همان روز به وقت تهران */
    #[ORM\Column(type: 'integer')]
    private int $date;

    #[ORM\Column(name: 'jalali_date', type: 'string', length: 10)]
    private string $jalaliDate;

    #[ORM\Column(name: 'jalali_year', type: 'smallint')]
    private int $jalaliYear;

    #[ORM\Column(type: 'string', length: 200)]
    private string $title;

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

    public function __construct(int $date, string $jalaliDate, int $jalaliYear, string $title)
    {
        $this->uuid       = Uuid::v4()->toRfc4122();
        $this->date       = $date;
        $this->jalaliDate = $jalaliDate;
        $this->jalaliYear = $jalaliYear;
        $this->title      = $title;
        $this->createdAt  = time();
    }

    public function getId(): ?int          { return $this->id; }
    public function getUuid(): string      { return $this->uuid; }
    public function getDate(): int         { return $this->date; }
    public function getJalaliDate(): string { return $this->jalaliDate; }
    public function getJalaliYear(): int   { return $this->jalaliYear; }
    public function getTitle(): string     { return $this->title; }

    public function setTitle(string $v): self { $this->title = $v; return $this; }

    public function toArray(): array
    {
        return [
            'uuid'        => $this->uuid,
            'date'        => $this->date,
            'jalali_date' => $this->jalaliDate,
            'jalali_year' => $this->jalaliYear,
            'title'       => $this->title,
        ];
    }
}
