<?php

use App\Models\InventoryItem;
use App\Models\InventoryLink;
use App\Services\Inventory\DependencyTargets\DependencyTargetResolver;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Str;

uses(RefreshDatabase::class);

it('resolves dependency targets in batch and is tenant-isolated', function () {
    [$user, $tenant] = createUserWithTenant();
    $this->actingAs($user);

    $resolver = app(DependencyTargetResolver::class);

    /** @var InventoryItem $item */
    $item = InventoryItem::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'external_id' => (string) Str::uuid(),
    ]);

    $scopeTag = InventoryItem::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'policy_type' => 'roleScopeTag',
        'external_id' => '6',
        'display_name' => 'Finance',
    ]);

    // Same external_id exists in another tenant; must never resolve across tenants.
    $otherTenant = \App\Models\ManagedEnvironment::factory()->create();
    InventoryItem::factory()->create([
        'managed_environment_id' => $otherTenant->getKey(),
        'policy_type' => 'roleScopeTag',
        'external_id' => '6',
        'display_name' => 'Other Finance',
    ]);

    $edge = InventoryLink::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'source_type' => 'inventory_item',
        'source_id' => $item->external_id,
        'target_type' => 'foundation_object',
        'target_id' => $scopeTag->external_id,
        'relationship_type' => 'scoped_by',
        'metadata' => [
            'last_known_name' => null,
            'foundation_type' => 'scope_tag',
        ],
    ]);

    $resolved = $resolver->attachRenderedTargets(collect([$edge]), $tenant)->first();

    expect($resolved)
        ->toBeArray()
        ->and($resolved['rendered_target']['resolved'])->toBeTrue()
        ->and($resolved['rendered_target']['badge_text'])->toBe('Scope Tag: Finance (6…)');
});
