<?php

declare(strict_types=1);

namespace Database\Factories;

use App\Models\ReviewPack;
use App\Models\ManagedEnvironment;
use App\Models\EnvironmentReview;
use App\Models\User;
use App\Models\Workspace;
use App\Support\EnvironmentReviewCompletenessState;
use App\Support\EnvironmentReviewStatus;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends Factory<EnvironmentReview>
 */
class EnvironmentReviewFactory extends Factory
{
    protected $model = EnvironmentReview::class;

    /**
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'managed_environment_id' => ManagedEnvironment::factory()->for(Workspace::factory()),
            'workspace_id' => function (array $attributes): int {
                $tenantId = $attributes['managed_environment_id'] ?? null;

                if (! is_numeric($tenantId)) {
                    return (int) Workspace::factory()->create()->getKey();
                }

                $tenant = ManagedEnvironment::query()->whereKey((int) $tenantId)->first();

                if (! $tenant instanceof ManagedEnvironment || $tenant->workspace_id === null) {
                    return (int) Workspace::factory()->create()->getKey();
                }

                return (int) $tenant->workspace_id;
            },
            'evidence_snapshot_id' => null,
            'current_export_review_pack_id' => null,
            'operation_run_id' => null,
            'initiated_by_user_id' => User::factory(),
            'published_by_user_id' => null,
            'superseded_by_review_id' => null,
            'fingerprint' => fake()->sha256(),
            'status' => EnvironmentReviewStatus::Draft->value,
            'completeness_state' => EnvironmentReviewCompletenessState::Complete->value,
            'summary' => [
                'publish_blockers' => [],
                'required_section_count' => 6,
                'completed_section_count' => 6,
            ],
            'generated_at' => now(),
            'published_at' => null,
            'archived_at' => null,
        ];
    }

    public function ready(): static
    {
        return $this->state(fn (): array => [
            'status' => EnvironmentReviewStatus::Ready->value,
            'completeness_state' => EnvironmentReviewCompletenessState::Complete->value,
            'summary' => [
                'publish_blockers' => [],
                'required_section_count' => 6,
                'completed_section_count' => 6,
            ],
        ]);
    }

    public function published(?ReviewPack $reviewPack = null): static
    {
        return $this->state(fn (): array => [
            'current_export_review_pack_id' => $reviewPack?->getKey(),
            'status' => EnvironmentReviewStatus::Published->value,
            'published_at' => now(),
        ]);
    }
}
