<?php

namespace App\Resource\Entity;

use App\Resource\Repository\TenantHolidayOverrideRepository;
use App\Shared\Tenant\TenantOwnedTrait;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Uuid;

/**
 * استثنای یک محیط روی تقویم تعطیلات.
 *
 * دو جهت دارد و هر دو لازم‌اند:
 *   • `is_working = true`  → کلینیکی که آن روزِ تعطیلِ رسمی باز است
 *   • `is_working = false` → روزی که رسمی نیست ولی این محیط تعطیل است (تعطیلی هفتگی
 *     یا مناسبت داخلی)
 *
 * جهت دوم `ResourceException` نیست: آن روی **یک منبع** است و این روی **کل محیط**.
 */
#[ORM\Entity(repositoryClass: TenantHolidayOverrideRepository::class)]
#[ORM\Table(name: 'tenant_holiday_overrides')]
#[ORM\UniqueConstraint(name: 'uniq_tho_tenant_date', columns: ['entity_type', 'entity_id', 'date'])]
#[ORM\Index(columns: ['entity_type', 'entity_id', 'date'], name: 'idx_tho_tenant_date')]
class TenantHolidayOverride
{
    use TenantOwnedTrait;

    #[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: 'is_working', type: 'boolean')]
    private bool $isWorking;

    #[ORM\Column(type: 'string', length: 200, nullable: true)]
    private ?string $note = null;

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

    public function __construct(string $entityType, int $entityId, int $date, bool $isWorking)
    {
        $this->uuid      = Uuid::v4()->toRfc4122();
        $this->date      = $date;
        $this->isWorking = $isWorking;
        $this->createdAt = time();

        $this->assignTenantPair($entityType, $entityId);
    }

    public function getId(): ?int      { return $this->id; }
    public function getUuid(): string  { return $this->uuid; }
    public function getDate(): int     { return $this->date; }
    public function isWorking(): bool  { return $this->isWorking; }
    public function getNote(): ?string { return $this->note; }

    public function setNote(?string $v): self      { $this->note = $v; return $this; }
    public function setWorking(bool $v): self      { $this->isWorking = $v; return $this; }

    public function toArray(): array
    {
        return [
            'uuid'       => $this->uuid,
            'date'       => $this->date,
            'is_working' => $this->isWorking,
            'note'       => $this->note,
            'created_at' => $this->createdAt,
        ];
    }
}
