package aws

import (
	"testing"

	caasmcollector "security-center-backend/internal/modules/caasm/collector"
	caasmmodel "security-center-backend/internal/modules/caasm/model"

	elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types"
)

func TestAppendELBIPAssetsEmitsStaticLoadBalancerAddresses(t *testing.T) {
	result := &caasmcollector.AssetResult{}
	dnsName := "app-nlb-123.elb.amazonaws.com"
	publicIP := "3.1.2.3"
	privateIP := "10.0.1.23"
	ipv6Address := "2001:db8::1"
	hostname := "not-a-literal-ip.elb.amazonaws.com"

	appendELBIPAssets("arn:aws:elasticloadbalancing:eu-west-1:123:loadbalancer/net/app", elbv2types.LoadBalancer{
		DNSName: &dnsName,
		AvailabilityZones: []elbv2types.AvailabilityZone{
			{
				LoadBalancerAddresses: []elbv2types.LoadBalancerAddress{
					{IpAddress: &publicIP, PrivateIPv4Address: &privateIP, IPv6Address: &ipv6Address},
					{IpAddress: &publicIP},
					{IpAddress: &hostname},
				},
			},
		},
	}, true, result)

	if got := len(result.IPAssets); got != 3 {
		t.Fatalf("ip asset count = %d, want 3", got)
	}
	for _, ipAsset := range result.IPAssets {
		if got := ipAsset.Asset.NativeID; got != "arn:aws:elasticloadbalancing:eu-west-1:123:loadbalancer/net/app" {
			t.Fatalf("asset native id = %q, want ELB arn", got)
		}
		if got := ipAsset.Hostname; got != dnsName {
			t.Fatalf("hostname = %q, want %q", got, dnsName)
		}
	}
	if result.IPAssets[0].IPAddress != publicIP || !result.IPAssets[0].IsPublic {
		t.Fatalf("first ip asset = %+v, want public address", result.IPAssets[0])
	}
	if result.IPAssets[1].IPAddress != privateIP || result.IPAssets[1].IsPublic {
		t.Fatalf("second ip asset = %+v, want private address", result.IPAssets[1])
	}
	if result.IPAssets[2].IPAddress != ipv6Address || !result.IPAssets[2].IsPublic {
		t.Fatalf("third ip asset = %+v, want public IPv6 address", result.IPAssets[2])
	}
}

func TestELBDomainAssetReferenceDoesNotCarryPartialServiceUpdate(t *testing.T) {
	asset := caasmmodel.Asset{NativeID: "lb-native-id"}
	domainAsset := caasmmodel.DomainAsset{
		Asset:       caasmmodel.Asset{NativeID: asset.NativeID},
		DomainName:  "app-lb-123.elb.amazonaws.com",
		DomainClass: caasmmodel.DomainClassServiceHostname,
		Registrar:   "aws",
	}

	if got := domainAsset.Asset.NativeID; got != asset.NativeID {
		t.Fatalf("domain asset native id = %q, want %q", got, asset.NativeID)
	}
	if got := domainAsset.Asset.Service; got != "" {
		t.Fatalf("domain asset reference service = %q, want empty reference-only asset", got)
	}
}
