module "default_tags" {
  source             = "git@github.com:theorchard/terraform-default-tags.git//?ref=2.0.0"
  environment        = var.environment
  application_family = var.application_family
  team_name          = var.team_name
}

provider "aws" {
  region = var.aws_region

  default_tags {
    tags = module.default_tags.tags
  }
}

provider "aws" {
  alias  = "us_west_2"
  region = "us-west-2"

  default_tags {
    tags = module.default_tags.tags
  }
}

# Terraform backends cannot contain interpolations
terraform {
  backend "s3" {
    bucket  = "networking-orcd-terraform-state"
    key     = "networking/transit-gateway-peering-attachments/us-east-1/sme-internal/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }
}

data "aws_ec2_transit_gateway" "transit_gateway" {
  filter {
    name   = "options.amazon-side-asn"
    values = ["64513"]
  }
}

data "aws_ec2_managed_prefix_list" "vpc_prefix_list" {
  for_each = var.managed_prefix_list_vpc_references
  name     = each.key
}

data "aws_ec2_transit_gateway_vpc_attachment" "vpc_attachment" {
  for_each = var.managed_prefix_list_vpc_references

  filter {
    name   = "tag:vpc_name"
    values = [each.value]
  }
}

resource "aws_ec2_transit_gateway_peering_attachment" "peering_attachment" {
  peer_account_id         = var.peer_account_id
  peer_region             = var.peer_region
  peer_transit_gateway_id = var.peer_transit_gateway_id
  transit_gateway_id      = data.aws_ec2_transit_gateway.transit_gateway.id

  tags = {
    Name               = "${var.environment}-sme-internal-transit-gateway-peering-attachment"
    environment        = var.environment
    application_family = var.application_family
    service_name       = "sme-internal-transit-gateway-peering-attachment"
    terraformed        = "true"
  }
}

# Route table for the peering attachment
resource "aws_ec2_transit_gateway_route_table" "peering_attachment_route_table" {
  transit_gateway_id = data.aws_ec2_transit_gateway.transit_gateway.id

  tags = {
    Name               = "${var.environment}-sme-internal-transit-gateway-route-table"
    environment        = var.environment
    application_family = var.application_family
    service_name       = "sme-internal-transit-gateway-peering-attachment"
    terraformed        = "true"
  }
}

# Association between the peering attachment and the route table
resource "aws_ec2_transit_gateway_route_table_association" "peering_attachment_route_table_association" {
  transit_gateway_attachment_id  = aws_ec2_transit_gateway_peering_attachment.peering_attachment.id
  transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.peering_attachment_route_table.id
}

resource "aws_ec2_transit_gateway_prefix_list_reference" "transit_gateway_prefix_list_reference" {
  for_each                       = var.managed_prefix_list_vpc_references
  prefix_list_id                 = data.aws_ec2_managed_prefix_list.vpc_prefix_list[each.key].id
  transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.peering_attachment_route_table.id
  transit_gateway_attachment_id  = data.aws_ec2_transit_gateway_vpc_attachment.vpc_attachment[each.key].id
}
