locals {
  subnets_by_scope = {
    rds = [
      aws_subnet.subnet-0069a5149d8a5ea20,
      aws_subnet.subnet-01b4f592944661582,
    ]
    app = [
      aws_subnet.subnet-0080604b4fb52d359,
      aws_subnet.subnet-012dfc8203c46d9cb,
      aws_subnet.AMP-AAS-P2-XDMZ-1C,
      aws_subnet.subnet-02220b4d3c8c8ca98,
      aws_subnet.subnet-08b875b2ce4695488,
      aws_subnet.subnet-0e63343cbe81471c0,
      aws_subnet.subnet-0eff3d4f82c994840,
      aws_subnet.subnet-0f75b5ff077d58921,
      aws_subnet.subnet-0ff4e20d7cd590b0b,
    ]
    public = [
      aws_subnet.subnet-0895a0e22aa4ec5cc,
      aws_subnet.subnet-0a404aac30a12264a,
    ]
  }

  eu_central_1_scopes = contains(var.prefix_list_share_regions, "eu-central-1") ? local.subnets_by_scope : {}
  us_east_1_scopes    = contains(var.prefix_list_share_regions, "us-east-1") ? local.subnets_by_scope : {}

  share_principals_by_scope_region = {
    for pair in setproduct(keys(local.subnets_by_scope), tolist(var.prefix_list_share_regions), tolist(var.resource_share_principals)) :
    "${pair[0]}:${pair[1]}:${pair[2]}" => {
      scope     = pair[0]
      region    = pair[1]
      principal = pair[2]
    }
  }

  share_principals_eu_central_1 = {
    for key, value in local.share_principals_by_scope_region :
    key => value if value.region == "eu-central-1"
  }

  share_principals_us_east_1 = {
    for key, value in local.share_principals_by_scope_region :
    key => value if value.region == "us-east-1"
  }

  # Keep naming consistent with AMP prefix-list conventions per scope.
  prefix_list_name_by_scope = {
    rds    = "prod-amp-amp-aas-p2-rds-subnet-prefix-list"
    app    = "prod-amp-amp-aas-p2-private-subnet-prefix-list"
    public = "prod-amp-amp-aas-p2-public-subnet-prefix-list"
  }
}

resource "aws_ec2_managed_prefix_list" "subnets_eu_central_1" {
  for_each = local.eu_central_1_scopes
  provider = aws.eu_central_1

  address_family = "IPv4"
  max_entries    = length(each.value)
  name           = local.prefix_list_name_by_scope[each.key]

  dynamic "entry" {
    for_each = each.value
    content {
      cidr        = entry.value.cidr_block
      description = "${var.account_name} ${each.key} subnet ${entry.value.cidr_block} in ${entry.value.availability_zone}"
    }
  }

  tags = merge(var.tags, {
    Name        = local.prefix_list_name_by_scope[each.key]
    ServiceName = "managed-prefix-list"
    SubnetGroup = each.key
    SubnetType  = each.key
    VpcId       = aws_vpc.vpc-0869359855245eb83.id
  })
}

resource "aws_ec2_managed_prefix_list" "subnets_us_east_1" {
  for_each = local.us_east_1_scopes
  provider = aws.us_east_1

  address_family = "IPv4"
  max_entries    = length(each.value)
  name           = local.prefix_list_name_by_scope[each.key]

  dynamic "entry" {
    for_each = each.value
    content {
      cidr        = entry.value.cidr_block
      description = "${var.account_name} ${each.key} subnet ${entry.value.cidr_block} in ${entry.value.availability_zone}"
    }
  }

  tags = merge(var.tags, {
    Name        = local.prefix_list_name_by_scope[each.key]
    ServiceName = "managed-prefix-list"
    SubnetGroup = each.key
    SubnetType  = each.key
    VpcId       = aws_vpc.vpc-0869359855245eb83.id
  })
}

resource "aws_ram_resource_share" "subnet_prefix_list_eu_central_1" {
  for_each = local.eu_central_1_scopes
  provider = aws.eu_central_1

  name = "${local.prefix_list_name_by_scope[each.key]}-share-eu-central-1"

  tags = merge(var.tags, {
    Name        = "${local.prefix_list_name_by_scope[each.key]}-share-eu-central-1"
    ServiceName = "managed-prefix-list"
    SubnetGroup = each.key
  })
}

resource "aws_ram_resource_share" "subnet_prefix_list_us_east_1" {
  for_each = local.us_east_1_scopes
  provider = aws.us_east_1

  name = "${local.prefix_list_name_by_scope[each.key]}-share-us-east-1"

  tags = merge(var.tags, {
    Name        = "${local.prefix_list_name_by_scope[each.key]}-share-us-east-1"
    ServiceName = "managed-prefix-list"
    SubnetGroup = each.key
  })
}

resource "aws_ram_resource_association" "subnet_prefix_list_eu_central_1" {
  for_each = local.eu_central_1_scopes
  provider = aws.eu_central_1

  resource_arn       = aws_ec2_managed_prefix_list.subnets_eu_central_1[each.key].arn
  resource_share_arn = aws_ram_resource_share.subnet_prefix_list_eu_central_1[each.key].arn
}

resource "aws_ram_resource_association" "subnet_prefix_list_us_east_1" {
  for_each = local.us_east_1_scopes
  provider = aws.us_east_1

  resource_arn       = aws_ec2_managed_prefix_list.subnets_us_east_1[each.key].arn
  resource_share_arn = aws_ram_resource_share.subnet_prefix_list_us_east_1[each.key].arn
}

resource "aws_ram_principal_association" "subnet_prefix_list_eu_central_1" {
  for_each = local.share_principals_eu_central_1
  provider = aws.eu_central_1

  principal          = each.value.principal
  resource_share_arn = aws_ram_resource_share.subnet_prefix_list_eu_central_1[each.value.scope].arn
}

resource "aws_ram_principal_association" "subnet_prefix_list_us_east_1" {
  for_each = local.share_principals_us_east_1
  provider = aws.us_east_1

  principal          = each.value.principal
  resource_share_arn = aws_ram_resource_share.subnet_prefix_list_us_east_1[each.value.scope].arn
}
