<?php

declare(strict_types=1);

namespace App\Filament\Support;

use App\Models\OperationRun;
use App\Support\RedactionIntegrity;
use App\Support\Verification\VerificationReportFingerprint;
use App\Support\Verification\VerificationReportSanitizer;
use App\Support\Verification\VerificationReportSchema;

final class VerificationReportViewer
{
    /**
     * @return array<string, mixed>|null
     */
    public static function report(OperationRun $run): ?array
    {
        $context = is_array($run->context) ? $run->context : [];
        $report = $context['verification_report'] ?? null;

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

        $report = VerificationReportSanitizer::sanitizeReport($report);

        if (! VerificationReportSchema::isValidReport($report)) {
            return null;
        }

        return $report;
    }

    public static function previousReportId(array $report): ?int
    {
        $previousReportId = $report['previous_report_id'] ?? null;

        if (is_int($previousReportId) && $previousReportId > 0) {
            return $previousReportId;
        }

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

        return null;
    }

    public static function fingerprint(array $report): ?string
    {
        $fingerprint = $report['fingerprint'] ?? null;

        if (is_string($fingerprint)) {
            $fingerprint = strtolower(trim($fingerprint));

            if (preg_match('/^[a-f0-9]{64}$/', $fingerprint)) {
                return $fingerprint;
            }
        }

        return VerificationReportFingerprint::forReport($report);
    }

    public static function previousRun(OperationRun $run, array $report): ?OperationRun
    {
        $previousReportId = self::previousReportId($report);

        if ($previousReportId === null) {
            return null;
        }

        $previous = OperationRun::query()
            ->whereKey($previousReportId)
            ->where('tenant_id', (int) $run->tenant_id)
            ->where('workspace_id', (int) $run->workspace_id)
            ->first();

        return $previous instanceof OperationRun ? $previous : null;
    }

    public static function shouldRenderForRun(OperationRun $run): bool
    {
        $context = is_array($run->context) ? $run->context : [];

        if (array_key_exists('verification_report', $context)) {
            return true;
        }

        return in_array((string) $run->type, ['provider.connection.check'], true);
    }

    /**
     * @param  array<string, mixed>|null  $report
     * @return array<int, string>
     */
    public static function redactionNotes(?array $report): array
    {
        return RedactionIntegrity::verificationNotes($report);
    }
}
