<?php

namespace Database\Factories;

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

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

    public function configure(): static
    {
        return $this->afterCreating(function (Tenant $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(),
            'external_id' => fake()->uuid(),
            'tenant_id' => fake()->uuid(),
            'app_client_id' => fake()->uuid(),
            'app_client_secret' => null, // Skip encryption in tests
            'app_certificate_thumbprint' => null,
            'app_notes' => null,
            'status' => 'active',
            'environment' => 'other',
            'is_current' => false,
            'metadata' => [],
            'rbac_status' => 'ok',
            'rbac_last_checked_at' => now(),
        ];
    }

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

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

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

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

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

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

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

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

                Tenant::skipTestWorkspaceProvisioning(false);
            });
    }
}
