<?php

declare(strict_types=1);

use App\Support\References\ReferenceClass;
use App\Support\References\ReferenceLinkTarget;
use App\Support\References\ReferenceResolutionState;
use App\Support\References\ReferenceTechnicalDetail;
use App\Support\References\ResolvedReference;

it('serializes a resolved reference with link and technical detail', function (): void {
    $reference = new ResolvedReference(
        referenceClass: ReferenceClass::PolicyVersion,
        rawIdentifier: '42',
        primaryLabel: 'Windows Lockdown',
        secondaryLabel: 'Version 3',
        state: ReferenceResolutionState::Resolved,
        stateLabel: null,
        linkTarget: new ReferenceLinkTarget(
            targetKind: ReferenceClass::PolicyVersion->value,
            url: '/admin/t/1/policy-versions/42',
            actionLabel: 'View policy version',
            contextBadge: 'ManagedEnvironment',
        ),
        technicalDetail: ReferenceTechnicalDetail::forIdentifier('42', 'Captured from drift evidence'),
        meta: ['foo' => 'bar'],
    );

    expect($reference->isLinkable())->toBeTrue()
        ->and($reference->toArray())->toMatchArray([
            'referenceClass' => 'policy_version',
            'rawIdentifier' => '42',
            'primaryLabel' => 'Windows Lockdown',
            'secondaryLabel' => 'Version 3',
            'state' => 'resolved',
            'linkTarget' => [
                'targetKind' => 'policy_version',
                'url' => '/admin/t/1/policy-versions/42',
                'actionLabel' => 'View policy version',
                'contextBadge' => 'ManagedEnvironment',
            ],
            'technicalDetail' => [
                'displayId' => '42',
                'fullId' => '42',
                'sourceHint' => 'Captured from drift evidence',
                'copyable' => true,
                'defaultCollapsed' => true,
            ],
            'meta' => ['foo' => 'bar'],
        ]);
});

it('drops linkability when the link target is removed', function (): void {
    $reference = new ResolvedReference(
        referenceClass: ReferenceClass::Policy,
        rawIdentifier: '13',
        primaryLabel: 'Baseline policy',
        secondaryLabel: null,
        state: ReferenceResolutionState::Resolved,
        stateLabel: null,
        linkTarget: new ReferenceLinkTarget(
            targetKind: ReferenceClass::Policy->value,
            url: '/admin/t/1/policies/13',
            actionLabel: 'View policy',
        ),
        technicalDetail: ReferenceTechnicalDetail::forIdentifier('13'),
    );

    expect($reference->withLinkTarget(null)->isLinkable())->toBeFalse();
});
