<?php

declare(strict_types=1);

namespace App\Support\Verification;

use App\Models\OperationRun;
use App\Support\OperationRunStatus;

final class PreviousVerificationReportResolver
{
    public static function resolvePreviousReportId(OperationRun $run): ?int
    {
        $runId = $run->getKey();

        if (! is_int($runId) || $runId <= 0) {
            return null;
        }

        $providerConnectionId = self::providerConnectionId($run);

        $query = OperationRun::query()
            ->where('managed_environment_id', (int) $run->managed_environment_id)
            ->where('workspace_id', (int) $run->workspace_id)
            ->where('type', (string) $run->type)
            ->where('run_identity_hash', (string) $run->run_identity_hash)
            ->where('status', OperationRunStatus::Completed->value)
            ->where('id', '<', $runId)
            ->orderByDesc('id');

        if ($providerConnectionId !== null) {
            $query->where('context->provider_connection_id', $providerConnectionId);
        } else {
            $query->whereNull('context->provider_connection_id');
        }

        $previousId = $query->value('id');

        return is_int($previousId) ? $previousId : null;
    }

    private static function providerConnectionId(OperationRun $run): ?int
    {
        $context = $run->context;

        if (! is_array($context)) {
            return null;
        }

        $providerConnectionId = $context['provider_connection_id'] ?? null;

        if (is_int($providerConnectionId)) {
            return $providerConnectionId;
        }

        if (is_string($providerConnectionId) && ctype_digit(trim($providerConnectionId))) {
            return (int) trim($providerConnectionId);
        }

        return null;
    }
}
