<?php

declare(strict_types=1);

use App\Support\Badges\BadgeCatalog;
use App\Support\Badges\BadgeDomain;
use App\Support\Badges\OperatorOutcomeTaxonomy;
use App\Support\Badges\OperatorStateClassification;

it('never allows diagnostic taxonomy entries to use warning or danger colors', function (): void {
    $violations = [];

    foreach (OperatorOutcomeTaxonomy::all() as $domain => $entries) {
        foreach ($entries as $state => $entry) {
            if ($entry['classification'] !== OperatorStateClassification::Diagnostic) {
                continue;
            }

            if (! in_array($entry['color'], ['warning', 'danger'], true)) {
                continue;
            }

            $violations[] = sprintf('%s:%s => %s', $domain, $state, $entry['color']);
        }
    }

    expect($violations)->toBeEmpty("Diagnostic taxonomy entries must not use warning or danger colors:\n".implode("\n", $violations));
});

it('does not keep overloaded bare labels in the adopted taxonomy slice', function (): void {
    $forbiddenLabels = ['Blocked', 'Missing', 'Partial', 'Stale', 'Unsupported', 'Warning', 'Safe'];
    $violations = [];

    foreach (OperatorOutcomeTaxonomy::all() as $domain => $entries) {
        foreach ($entries as $state => $entry) {
            if (! in_array($entry['label'], $forbiddenLabels, true)) {
                continue;
            }

            $violations[] = sprintf('%s:%s => %s', $domain, $state, $entry['label']);
        }
    }

    expect($violations)->toBeEmpty("Overloaded bare operator labels remain in the first-slice taxonomy:\n".implode("\n", $violations));
});

it('keeps baseline compare matrix trust aligned with the adopted trust taxonomy and qualified labels', function (): void {
    $matrixTrust = BadgeCatalog::spec(BadgeDomain::BaselineCompareMatrixTrust, 'diagnostic_only');
    $operatorTrust = BadgeCatalog::spec(BadgeDomain::OperatorExplanationTrustworthiness, 'diagnostic_only');
    $matrixMissing = BadgeCatalog::spec(BadgeDomain::BaselineCompareMatrixState, 'missing');
    $matrixStale = BadgeCatalog::spec(BadgeDomain::BaselineCompareMatrixState, 'stale_result');

    expect($matrixTrust->label)->toBe($operatorTrust->label)
        ->and($matrixTrust->color)->toBe($operatorTrust->color)
        ->and($matrixMissing->label)->toBe('Missing from tenant')
        ->and($matrixStale->label)->toBe('Result stale');
});
