<?php

declare(strict_types=1);

namespace App\Support\Tenants;

use App\Models\Tenant;

final readonly class ReferencedTenantLifecyclePresentation
{
    public function __construct(
        public string $viewerContext,
        public ?int $tenantId,
        public ?string $tenantName,
        public TenantLifecyclePresentation $presentation,
        public ?string $contextNote,
    ) {}

    public static function forOperationRun(Tenant $tenant): self
    {
        return self::fromTenant($tenant, 'operation_run');
    }

    public static function fromTenant(Tenant $tenant, string $viewerContext): self
    {
        $presentation = TenantLifecyclePresentation::fromTenant($tenant);

        return new self(
            viewerContext: $viewerContext,
            tenantId: (int) $tenant->getKey(),
            tenantName: $tenant->name,
            presentation: $presentation,
            contextNote: self::contextNoteFor($presentation),
        );
    }

    public static function forInvalid(string $viewerContext, ?Tenant $tenant = null, ?string $normalizedValue = null): self
    {
        return new self(
            viewerContext: $viewerContext,
            tenantId: $tenant instanceof Tenant ? (int) $tenant->getKey() : null,
            tenantName: $tenant?->name,
            presentation: TenantLifecyclePresentation::invalid($normalizedValue),
            contextNote: 'Some tenant follow-up actions may be unavailable from this canonical workspace view.',
        );
    }

    public function selectorAvailabilityMessage(): ?string
    {
        if ($this->presentation->isInvalidFallback) {
            return 'This tenant has an invalid lifecycle value and may not appear in the tenant selector.';
        }

        if (! $this->presentation->isSelectableAsContext()) {
            return 'This tenant is currently '.$this->presentation->lowercaseLabel().' and may not appear in the tenant selector.';
        }

        return null;
    }

    private static function contextNoteFor(TenantLifecyclePresentation $presentation): ?string
    {
        if ($presentation->isInvalidFallback || ! $presentation->isSelectableAsContext()) {
            return 'Some tenant follow-up actions may be unavailable from this canonical workspace view.';
        }

        return null;
    }
}
