<?php

declare(strict_types=1);

namespace App\Support\Operations;

use App\Models\OperationRun;
use App\Models\ManagedEnvironment;
use App\Models\User;

final readonly class QueuedExecutionContext
{
    /**
     * @param  array{workspace_id:int,managed_environment_id:int|null,provider_connection_id:int|null}  $targetScope
     * @param  list<string>  $prerequisiteClasses
     * @param  array<string, mixed>  $metadata
     */
    public function __construct(
        public OperationRun $run,
        public string $operationType,
        public int $workspaceId,
        public ?ManagedEnvironment $tenant,
        public ?User $initiator,
        public ExecutionAuthorityMode $authorityMode,
        public ?string $requiredCapability,
        public ?int $providerConnectionId,
        public array $targetScope,
        public array $prerequisiteClasses = [],
        public array $metadata = [],
        public ?string $workspaceRequiredCapability = null,
    ) {}

    /**
     * @return array{identity_type:string,user_id:int|null}|null
     */
    public function initiatorSnapshot(): ?array
    {
        if ($this->authorityMode === ExecutionAuthorityMode::SystemAuthority) {
            return [
                'identity_type' => 'system',
                'user_id' => null,
            ];
        }

        if (! $this->initiator instanceof User) {
            return null;
        }

        return [
            'identity_type' => 'user',
            'user_id' => (int) $this->initiator->getKey(),
        ];
    }
}
