<?php

declare(strict_types=1);

namespace Tests\Feature\Findings\Concerns;

use App\Models\AuditLog;
use App\Models\Finding;
use App\Models\ManagedEnvironment;
use App\Models\User;
use App\Support\Audit\AuditActionId;
use Filament\Facades\Filament;

trait InteractsWithFindingsWorkflow
{
    /**
     * @return array{0: User, 1: ManagedEnvironment}
     */
    protected function actingAsFindingOperator(string $role = 'owner'): array
    {
        [$user, $tenant] = createUserWithTenant(role: $role);

        $this->actingAs($user);
        Filament::setTenant($tenant, true);

        return [$user, $tenant];
    }

    /**
     * @param  array<string, mixed>  $attributes
     */
    protected function makeFindingForWorkflow(ManagedEnvironment $tenant, string $status = Finding::STATUS_NEW, array $attributes = []): Finding
    {
        $factory = Finding::factory()->for($tenant);

        $factory = match ($status) {
            Finding::STATUS_TRIAGED => $factory->triaged(),
            Finding::STATUS_IN_PROGRESS => $factory->inProgress(),
            Finding::STATUS_REOPENED => $factory->reopened(),
            Finding::STATUS_RESOLVED => $factory->resolved(),
            Finding::STATUS_CLOSED => $factory->closed(),
            Finding::STATUS_RISK_ACCEPTED => $factory->riskAccepted(),
            default => $factory,
        };

        return $factory->create($attributes);
    }

    protected function latestFindingAudit(Finding $finding, string|AuditActionId $action): ?AuditLog
    {
        $actionValue = $action instanceof AuditActionId ? $action->value : $action;

        return AuditLog::query()
            ->where('managed_environment_id', (int) $finding->managed_environment_id)
            ->where('resource_type', 'finding')
            ->where('resource_id', (string) $finding->getKey())
            ->where('action', $actionValue)
            ->latest('id')
            ->first();
    }
}
