<?php

namespace App\ClinicService\Entity;

use App\ClinicService\Repository\ServiceBranchOverrideRepository;
use App\Doctor\Entity\DoctorAddress;
use App\Shared\Tenant\TenantOwnedTrait;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Uuid;

/**
 * قیمت و مدتِ اختصاصیِ یک سرویس در یک شعبه.
 *
 * «شعبه» همان `doctor_addresses` است ({@see docs/new_feture/taskes/_shared/branch-is-doctor-address.md}).
 * هر ستون تهی‌پذیر است و `null` یعنی «همان مقدار خودِ سرویس» — نه صفر.
 */
#[ORM\Entity(repositoryClass: ServiceBranchOverrideRepository::class)]
#[ORM\Table(name: 'service_branch_overrides')]
#[ORM\UniqueConstraint(name: 'uniq_override_item_address', columns: ['item_id', 'address_id'])]
#[ORM\Index(columns: ['entity_type', 'entity_id'], name: 'idx_override_tenant')]
class ServiceBranchOverride
{
    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\ManyToOne(targetEntity: ServiceItem::class)]
    #[ORM\JoinColumn(name: 'item_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
    private ServiceItem $item;

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

    #[ORM\Column(name: 'price_rials', type: 'bigint', nullable: true)]
    private ?int $priceRials = null;

    #[ORM\Column(name: 'solo_duration_minutes', type: 'smallint', nullable: true)]
    private ?int $soloDurationMinutes = null;

    #[ORM\Column(name: 'additional_duration_minutes', type: 'smallint', nullable: true)]
    private ?int $additionalDurationMinutes = null;

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

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

    public function __construct(ServiceItem $item, DoctorAddress $address)
    {
        $this->uuid      = Uuid::v4()->toRfc4122();
        $this->item      = $item;
        $this->address   = $address;
        $this->createdAt = time();
        $this->updatedAt = time();

        $this->assignTenantPair($item->getSection()->getEntityType(), $item->getSection()->getEntityId());
    }

    public function getId(): ?int                       { return $this->id; }
    public function getUuid(): string                   { return $this->uuid; }
    public function getItem(): ServiceItem              { return $this->item; }
    public function getAddress(): DoctorAddress         { return $this->address; }
    public function getPriceRials(): ?int               { return $this->priceRials === null ? null : (int) $this->priceRials; }
    public function getSoloDurationMinutes(): ?int      { return $this->soloDurationMinutes; }
    public function getAdditionalDurationMinutes(): ?int { return $this->additionalDurationMinutes; }

    public function setPriceRials(?int $v): self                { $this->priceRials = $v; $this->touch(); return $this; }
    public function setSoloDurationMinutes(?int $v): self       { $this->soloDurationMinutes = $v; $this->touch(); return $this; }
    public function setAdditionalDurationMinutes(?int $v): self { $this->additionalDurationMinutes = $v; $this->touch(); return $this; }

    private function touch(): void { $this->updatedAt = time(); }

    public function toArray(): array
    {
        return [
            'uuid'                        => $this->uuid,
            'item_uuid'                   => $this->item->getUuid(),
            'address_uuid'                => $this->address->getUuid(),
            'address_name'                => $this->address->getName(),
            'price_rials'                 => $this->getPriceRials(),
            'solo_duration_minutes'       => $this->soloDurationMinutes,
            'additional_duration_minutes' => $this->additionalDurationMinutes,
        ];
    }
}
