<?php

namespace Database\Factories;

use App\Models\ManagedEnvironment;
use App\Models\Workspace;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\ManagedEnvironment>
 */
class ManagedEnvironmentFactory extends Factory
{
    protected bool $provisionsWorkspace = true;

    public function configure(): static
    {
        return $this->afterCreating(function (ManagedEnvironment $tenant): void {
            if (! $this->provisionsWorkspace || $tenant->workspace_id !== null) {
                return;
            }

            $workspace = Workspace::factory()->create();

            $tenant->forceFill([
                'workspace_id' => (int) $workspace->getKey(),
            ])->save();
        });
    }

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'name' => fake()->company(),
            'display_name' => null,
            'slug' => fake()->unique()->slug(3),
            'kind' => 'managed_environment',
            'lifecycle_status' => 'active',
            'is_current' => false,
            'metadata' => [],
        ];
    }

    public function draft(): static
    {
        return $this->state(fn (): array => [
            'lifecycle_status' => ManagedEnvironment::STATUS_DRAFT,
            'is_current' => false,
        ]);
    }

    public function onboarding(): static
    {
        return $this->state(fn (): array => [
            'lifecycle_status' => ManagedEnvironment::STATUS_ONBOARDING,
            'is_current' => false,
        ]);
    }

    public function active(): static
    {
        return $this->state(fn (): array => [
            'lifecycle_status' => ManagedEnvironment::STATUS_ACTIVE,
            'deleted_at' => null,
        ]);
    }

    public function archived(): static
    {
        return $this->state(fn (): array => [
            'lifecycle_status' => ManagedEnvironment::STATUS_ARCHIVED,
            'deleted_at' => now(),
            'is_current' => false,
        ]);
    }

    public function minimal(): static
    {
        ManagedEnvironment::skipTestWorkspaceProvisioning();

        $factory = clone $this;
        $factory->provisionsWorkspace = false;

        return $factory
            ->afterCreating(function (ManagedEnvironment $tenant): void {
                if ($tenant->workspace_id !== null) {
                    $workspaceId = (int) $tenant->workspace_id;

                    $tenant->forceFill(['workspace_id' => null])->saveQuietly();
                    Workspace::query()->whereKey($workspaceId)->delete();
                }

                ManagedEnvironment::skipTestWorkspaceProvisioning(false);
            });
    }
}
