<?php

namespace Database\Factories;

use App\Models\OperationRun;
use App\Models\Tenant;
use App\Models\User;
use App\Models\Workspace;
use App\Support\OperationRunOutcome;
use App\Support\OperationRunStatus;
use App\Support\OperationRunType;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends Factory<OperationRun>
 */
class OperationRunFactory extends Factory
{
    protected $model = OperationRun::class;

    public function definition(): array
    {
        return [
            'tenant_id' => Tenant::factory()->for(Workspace::factory()),
            'workspace_id' => function (array $attributes): int {
                $tenantId = $attributes['tenant_id'] ?? null;

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

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

                if (! $tenant instanceof Tenant) {
                    return (int) Workspace::factory()->create()->getKey();
                }

                if ($tenant->workspace_id === null) {
                    $workspaceId = (int) Workspace::factory()->create()->getKey();
                    $tenant->forceFill(['workspace_id' => $workspaceId])->save();

                    return $workspaceId;
                }

                return (int) $tenant->workspace_id;
            },
            'user_id' => User::factory(),
            'initiator_name' => fake()->name(),
            'type' => fake()->randomElement(OperationRunType::values()),
            'status' => OperationRunStatus::Queued->value,
            'outcome' => OperationRunOutcome::Pending->value,
            'run_identity_hash' => fake()->sha256(),
            'summary_counts' => [],
            'failure_summary' => [],
            'context' => [],
            'started_at' => null,
            'completed_at' => null,
        ];
    }
}
