<?php

use Illuminate\Support\Collection;

it('does not contain forbidden status-like colors for tag badges', function () {
    $root = base_path();
    $self = realpath(__FILE__);

    $directories = [
        $root.'/app/Filament',
        $root.'/app/Livewire',
    ];

    $excludedPaths = [
        $root.'/vendor',
        $root.'/storage',
        $root.'/specs',
        $root.'/spechistory',
        $root.'/references',
        $root.'/public/build',
    ];

    $tagLikeFieldPattern = '/::make\\(\\s*[\'"](?:policy_type|category|platform|environment|visibility|frequency|snapshot_type)[\'"]/';
    $badgePattern = '/->badge\\s*\\(/';
    $colorCallStartPattern = '/->(?:color|iconColor)\\s*\\(/';
    $forbiddenColorLiteralPattern = '/[\'"](?:success|warning|danger)[\'"]/';

    $lookaheadLines = 45;
    $elementEndPattern = '/\\),\\s*$/';

    /** @var Collection<int, string> $files */
    $files = collect($directories)
        ->filter(fn (string $dir): bool => is_dir($dir))
        ->flatMap(function (string $dir): array {
            $iterator = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS)
            );

            $paths = [];

            foreach ($iterator as $file) {
                if (! $file->isFile()) {
                    continue;
                }

                $path = $file->getPathname();

                if (! str_ends_with($path, '.php')) {
                    continue;
                }

                $paths[] = $path;
            }

            return $paths;
        })
        ->filter(function (string $path) use ($excludedPaths, $self): bool {
            if ($self && realpath($path) === $self) {
                return false;
            }

            foreach ($excludedPaths as $excluded) {
                if (str_starts_with($path, $excluded)) {
                    return false;
                }
            }

            return true;
        })
        ->values();

    $hits = [];

    foreach ($files as $path) {
        $contents = file_get_contents($path);

        if (! is_string($contents) || $contents === '') {
            continue;
        }

        $lines = preg_split('/\R/', $contents) ?: [];

        foreach ($lines as $index => $line) {
            if (! preg_match($tagLikeFieldPattern, $line)) {
                continue;
            }

            $elementEndOffset = null;
            $windowLines = array_slice($lines, $index, $lookaheadLines);

            foreach ($windowLines as $offset => $windowLine) {
                if (preg_match($elementEndPattern, (string) $windowLine)) {
                    $elementEndOffset = $offset;
                    break;
                }
            }

            $elementLines = $elementEndOffset === null
                ? $windowLines
                : array_slice($windowLines, 0, $elementEndOffset + 1);

            $element = implode("\n", $elementLines);

            if (! preg_match($badgePattern, $element)) {
                continue;
            }

            $hasForbiddenColor = false;

            foreach ($elementLines as $offset => $windowLine) {
                if (! preg_match($colorCallStartPattern, (string) $windowLine)) {
                    continue;
                }

                $colorWindow = implode("\n", array_slice($elementLines, $offset));

                if (! preg_match($forbiddenColorLiteralPattern, $colorWindow)) {
                    continue;
                }

                $hasForbiddenColor = true;
                break;
            }

            if (! $hasForbiddenColor) {
                continue;
            }

            $relative = str_replace($root.'/', '', $path);
            $hits[] = $relative.':'.($index + 1).' -> '.trim($line);
        }
    }

    expect($hits)->toBeEmpty("Forbidden tag badge colors found:\n".implode("\n", $hits));
});
