<?php

declare(strict_types=1);

namespace App\Support\Tenants;

final readonly class TenantOperabilityDecision
{
    public function __construct(
        public TenantLifecycle $lifecycle,
        public bool $canViewTenantSurface,
        public bool $canSelectAsContext,
        public bool $canOperate,
        public bool $canArchive,
        public bool $canRestore,
        public bool $canResumeOnboarding,
        public bool $canReferenceInWorkspaceMonitoring,
    ) {}

    /**
     * @param  array<string, TenantOperabilityOutcome>  $outcomes
     */
    public static function fromOutcomes(array $outcomes): self
    {
        $selector = $outcomes[TenantOperabilityQuestion::SelectorEligibility->value] ?? null;
        $discoverability = $outcomes[TenantOperabilityQuestion::AdministrativeDiscoverability->value] ?? null;
        $archive = $outcomes[TenantOperabilityQuestion::ArchiveEligibility->value] ?? null;
        $restore = $outcomes[TenantOperabilityQuestion::RestoreEligibility->value] ?? null;
        $resumeOnboarding = $outcomes[TenantOperabilityQuestion::ResumeOnboardingEligibility->value] ?? null;
        $canonical = $outcomes[TenantOperabilityQuestion::CanonicalLinkedRecordViewability->value] ?? null;

        $lifecycle = $selector?->lifecycle
            ?? $discoverability?->lifecycle
            ?? $archive?->lifecycle
            ?? $restore?->lifecycle
            ?? $resumeOnboarding?->lifecycle
            ?? $canonical?->lifecycle
            ?? TenantLifecycle::Active;

        return new self(
            lifecycle: $lifecycle,
            canViewTenantSurface: $discoverability?->allowed ?? $lifecycle->canViewTenantSurface(),
            canSelectAsContext: $selector?->allowed ?? $lifecycle->canSelectAsContext(),
            canOperate: $lifecycle->canOperate(),
            canArchive: $archive?->allowed ?? $lifecycle->canArchive(),
            canRestore: $restore?->allowed ?? $lifecycle->canRestore(),
            canResumeOnboarding: $resumeOnboarding?->allowed ?? $lifecycle->canResumeOnboarding(),
            canReferenceInWorkspaceMonitoring: $canonical?->allowed ?? $lifecycle->canReferenceInWorkspaceMonitoring(),
        );
    }

    public function allowsAction(string $actionKey): bool
    {
        return match ($actionKey) {
            'resume_onboarding' => $this->canResumeOnboarding,
            'archive' => $this->canArchive,
            'restore' => $this->canRestore,
            default => false,
        };
    }

    public function primaryManagementActionKey(bool $preferOnboarding = false): ?string
    {
        if ($preferOnboarding && $this->canResumeOnboarding) {
            return 'resume_onboarding';
        }

        if ($this->canRestore) {
            return 'restore';
        }

        if ($this->canArchive) {
            return 'archive';
        }

        return null;
    }
}
