<?php

namespace Database\Factories;

use App\Models\BaselineProfile;
use App\Models\BaselineSnapshot;
use App\Models\Workspace;
use App\Support\Baselines\BaselineSnapshotLifecycleState;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends Factory<BaselineSnapshot>
 */
class BaselineSnapshotFactory extends Factory
{
    protected $model = BaselineSnapshot::class;

    /**
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'workspace_id' => Workspace::factory(),
            'baseline_profile_id' => BaselineProfile::factory(),
            'snapshot_identity_hash' => hash('sha256', fake()->uuid()),
            'captured_at' => now(),
            'lifecycle_state' => BaselineSnapshotLifecycleState::Complete->value,
            'completed_at' => now(),
            'failed_at' => null,
            'summary_jsonb' => ['total_items' => 0],
            'completion_meta_jsonb' => [
                'expected_items' => 0,
                'persisted_items' => 0,
                'producer_run_id' => null,
                'was_empty_capture' => true,
            ],
        ];
    }

    public function building(): static
    {
        return $this->state(fn (): array => [
            'lifecycle_state' => BaselineSnapshotLifecycleState::Building->value,
            'completed_at' => null,
            'failed_at' => null,
        ]);
    }

    public function complete(): static
    {
        return $this->state(fn (): array => [
            'lifecycle_state' => BaselineSnapshotLifecycleState::Complete->value,
            'completed_at' => now(),
            'failed_at' => null,
        ]);
    }

    public function incomplete(?string $reasonCode = null): static
    {
        return $this->state(fn (): array => [
            'lifecycle_state' => BaselineSnapshotLifecycleState::Incomplete->value,
            'completed_at' => null,
            'failed_at' => now(),
            'completion_meta_jsonb' => [
                'expected_items' => 0,
                'persisted_items' => 0,
                'producer_run_id' => null,
                'was_empty_capture' => true,
                'finalization_reason_code' => $reasonCode,
            ],
        ]);
    }
}
