<?php

namespace App\Shared\Tenant;

use App\Shared\Context\EntityContext;
use Doctrine\ORM\Mapping as ORM;

/**
 * همان جفت محیطِ {@see TenantOwnedTrait}، ولی تهی‌پذیر — برای جدول‌هایی که پیش از
 * نشانه‌گذاری وجود داشتند و مالکِ بعضی ردیف‌هایشان از روی داده قابل تشخیص نیست.
 *
 * تنها مصرفش حساب بانکی و کارتخوان است: تا فاز ۶ روی `User` ثبت می‌شدند و کاربری
 * که چند محیط دارد، هیچ ستونی نمی‌گوید کدام کارتش مال کدام محیط است. حدس زدنش
 * یعنی پول به حساب اشتباه؛ پس تهی می‌مانند تا مالک خودش تعیین کند.
 *
 * ⚠️ ردیفِ تهی در **هیچ** محیطی دیده نمی‌شود، چون TenantFilter شرط تساوی می‌گذارد
 * و NULL با هیچ مقداری برابر نیست. این عمدی است ولی نقطهٔ ضعف است و در
 * docs/architecture/tenancy.md ثبت شده: تا وقتی مالک محیط را تعیین نکند، کارتش
 * از فهرست‌ها غایب است.
 */
trait NullableTenantOwnedTrait
{
    #[ORM\Column(name: 'entity_type', type: 'string', length: 10, nullable: true)]
    private ?string $entityType = null;

    #[ORM\Column(name: 'entity_id', type: 'integer', nullable: true)]
    private ?int $entityId = null;

    public function getEntityType(): ?string { return $this->entityType; }

    public function getEntityId(): ?int { return $this->entityId; }

    public function hasTenant(): bool
    {
        return $this->entityType !== null && $this->entityId !== null;
    }

    /** @throws \InvalidArgumentException اگر محیط حل نشده باشد */
    public function assignTenant(EntityContext $context): void
    {
        if (!$context->isResolved()) {
            throw new \InvalidArgumentException(sprintf(
                'Cannot assign an unresolved tenant context to %s.',
                static::class,
            ));
        }

        [$this->entityType, $this->entityId] = $context->toEntityPair();
    }
}
