module "main_vpc" {
  source = "../../modules/vpc/vpc_v2"

  name_prefix       = local.name_prefix
  cidr_second_octet = var.vpc["cidr_second_octet"]

  flow_logs = {
    gsirt = {
      log_destination      = "${data.aws_s3_bucket.security_logs.arn}/vpcflow/"
      log_destination_type = "s3"
      traffic_type         = "REJECT"
    }
  }

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}

module "main_public_subnets" {
  source = "../../modules/vpc/subnet"

  name_prefix        = local.name_prefix
  subnets            = var.public_subnets
  vpc_id             = module.main_vpc.vpc_id
  is_public          = true
  cidr_second_octet  = var.vpc["cidr_second_octet"]
  availability_zones = local.availability_zones

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}

module "main_public_routing" {
  source = "../../modules/vpc/routes"

  is_public   = true
  name_prefix = local.name_prefix
  vpc_id      = module.main_vpc.vpc_id
  vpc_cidr    = module.main_vpc.vpc_cidr
  igw_id      = module.main_vpc.vpc_igw
  subnets     = module.main_public_subnets.subnet_ids

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}

module "main_private_subnets" {
  source = "../../modules/vpc/subnet"

  name_prefix        = local.name_prefix
  subnets            = var.private_subnets
  vpc_id             = module.main_vpc.vpc_id
  is_public          = false
  cidr_second_octet  = var.vpc["cidr_second_octet"]
  availability_zones = local.availability_zones

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}


module "main_nat_gateways" {
  source = "../../modules/vpc/nat"

  name_prefix       = local.name_prefix
  public_subnet_ids = [module.main_public_subnets.subnet_ids[1]]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}


module "main_private_routing" {
  source = "../../modules/vpc/routes"

  is_public      = false
  name_prefix    = local.name_prefix
  vpc_id         = module.main_vpc.vpc_id
  vpc_cidr       = module.main_vpc.vpc_cidr
  nat_gateway_id = module.main_nat_gateways.nats[0].id
  subnets        = module.main_private_subnets.subnet_ids

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}

# DB subnets without internet access
module "main_private_db_subnets" {
  source             = "../../modules/vpc/subnet"
  name_prefix        = local.name_prefix
  subnets            = var.private_db_subnets
  vpc_id             = module.main_vpc.vpc_id
  is_public          = false
  cidr_second_octet  = var.vpc["cidr_second_octet"]
  availability_zones = local.availability_zones
  custom_identifier  = "-db"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}

module "main_private_db_routing" {
  source                = "../../modules/vpc/routes"
  is_public             = false
  name_prefix           = local.name_prefix
  vpc_id                = module.main_vpc.vpc_id
  vpc_cidr              = module.main_vpc.vpc_cidr
  subnets               = module.main_private_db_subnets.subnet_ids
  disable_default_route = true
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_NTW"
    }
  )
}

# VPC endpoints for dynamodb and s3
locals {
  all_routetables = [
    module.main_public_routing.route_table_id,
    module.main_private_routing.route_table_id,
    module.main_private_db_routing.route_table_id
  ]
}

module "gsirt_endpoint" {
  source            = "../../modules/vpc/endpoint_gateway"
  service           = module.gsirt_regional_endpoints.regional_endpoints_service_name[var.aws_region_id]
  vpc_endpoint_type = "Interface"
  subnet_ids        = module.main_private_db_subnets.subnet_ids
  vpc_id            = module.main_vpc.vpc_id
  cidr_second_octet = var.vpc["cidr_second_octet"]

  common_tags = merge(
    local.common_tags,
    {
      Name                     = format("%v-gsirt-endpoint", local.name_prefix)
      service                  = "Networking",
      plat_env_project_service = "${local.aggregated_tag}_NTW"
    }
  )
}

# VPN Peering
locals {
  vpn_instances_routes = [
    #"${tolist(module.openvpn_instance1.network_interface.private_ips)[0]}/32",
    #"${tolist(module.openvpn_instance2.network_interface.private_ips)[0]}/32",
  ]
}
/*
module "peering_delphi_prod" {
  source                          = "../../modules/vpc/peering/one-to-one-external"
  vpc_requester_cidr              = module.main_vpc.vpc_cidr
  vpc_accepter_cidr               = "10.33.0.0/16"
  connection_name                 = "PROD_VPN_TO_DLP_PROD"
  acc_to_req_dest_cidrs           = local.vpn_instances_routes
  allow_remote_vpc_dns_resolution = false
  accepter_account_id             = module.aws_accounts_list.accounts.gdb-delphi-prod

  providers = {
    aws.requester = aws
    aws.accepter  = aws.gdb-delphi-prod
  }

  common_tags = merge(
    local.common_tags,
    {
      service                  = "VPN",
      plat_env_project_service = "${local.aggregated_tag}_VPN"
    }
  )
}

module "peering_apollo_prod" {
  source                          = "../../modules/vpc/peering/one-to-one-external"
  vpc_requester_cidr              = module.main_vpc.vpc_cidr
  vpc_accepter_cidr               = "10.13.0.0/16"
  connection_name                 = "PROD_VPN_TO_APL_PROD"
  acc_to_req_dest_cidrs           = local.vpn_instances_routes
  allow_remote_vpc_dns_resolution = false
  accepter_account_id             = module.aws_accounts_list.accounts.gdb-delphi-prod

  providers = {
    aws.requester = aws
    aws.accepter  = aws.gdb-delphi-prod
  }

  common_tags = merge(
    local.common_tags,
    {
      service                  = "VPN",
      plat_env_project_service = "${local.aggregated_tag}_VPN"
    }
  )
}

module "peering_apollo_uat" {
  source                          = "../../modules/vpc/peering/one-to-one-external"
  vpc_requester_cidr              = module.main_vpc.vpc_cidr
  vpc_accepter_cidr               = "10.18.0.0/16"
  connection_name                 = "PROD_VPN_TO_APL_UAT"
  acc_to_req_dest_cidrs           = local.vpn_instances_routes
  allow_remote_vpc_dns_resolution = false
  accepter_account_id             = module.aws_accounts_list.accounts.gdb-apollo-prod

  providers = {
    aws.requester = aws
    aws.accepter  = aws.gdb-apollo-prod
  }

  common_tags = merge(
    local.common_tags,
    {
      service                  = "VPN",
      plat_env_project_service = "${local.aggregated_tag}_VPN"
    }
  )
}

module "peering_new_apollo_prod" {
  source                          = "../../modules/vpc/peering/one-to-one-external"
  vpc_requester_cidr              = module.main_vpc.vpc_cidr
  vpc_accepter_cidr               = "10.17.0.0/16"
  connection_name                 = "PROD_VPN_TO_NEW_APL_PROD"
  acc_to_req_dest_cidrs           = local.vpn_instances_routes
  allow_remote_vpc_dns_resolution = false
  accepter_account_id             = module.aws_accounts_list.accounts.gdb-apollo-prod

  providers = {
    aws.requester = aws
    aws.accepter  = aws.gdb-apollo-prod
  }

  common_tags = merge(
    local.common_tags,
    {
      service                  = "VPN",
      plat_env_project_service = "${local.aggregated_tag}_VPN"
    }
  )
}

module "peering_artistapp_prod" {
  source                          = "../../modules/vpc/peering/one-to-one-external"
  vpc_requester_cidr              = module.main_vpc.vpc_cidr
  vpc_accepter_cidr               = "10.74.0.0/16"
  connection_name                 = "PROD_VPN_TO_RTI_PROD"
  acc_to_req_dest_cidrs           = local.vpn_instances_routes
  allow_remote_vpc_dns_resolution = false
  accepter_account_id             = module.aws_accounts_list.accounts.gdb-artistapp-prod

  providers = {
    aws.requester = aws
    aws.accepter  = aws.gdb-artistapp-prod
  }

  common_tags = merge(
    local.common_tags,
    {
      service                  = "VPN",
      plat_env_project_service = "${local.aggregated_tag}_VPN"
    }
  )
}

module "peering_core_uat" {
  source                          = "../../modules/vpc/peering/one-to-one-external"
  vpc_requester_cidr              = module.main_vpc.vpc_cidr
  vpc_accepter_cidr               = "10.93.0.0/16"
  connection_name                 = "PROD_VPN_TO_CORE_UAT"
  acc_to_req_dest_cidrs           = local.vpn_instances_routes
  allow_remote_vpc_dns_resolution = false
  accepter_account_id             = module.aws_accounts_list.accounts.gdb-core-prod

  providers = {
    aws.requester = aws
    aws.accepter  = aws.gdb-core-prod
  }

  common_tags = merge(
    local.common_tags,
    {
      service                  = "VPN",
      plat_env_project_service = "${local.aggregated_tag}_VPN"
    }
  )
}

module "peering_core_prod" {
  source                          = "../../modules/vpc/peering/one-to-one-external"
  vpc_requester_cidr              = module.main_vpc.vpc_cidr
  vpc_accepter_cidr               = "10.94.0.0/16"
  connection_name                 = "PROD_VPN_TO_CORE_PROD"
  acc_to_req_dest_cidrs           = local.vpn_instances_routes
  allow_remote_vpc_dns_resolution = false
  accepter_account_id             = module.aws_accounts_list.accounts.gdb-core-prod

  providers = {
    aws.requester = aws
    aws.accepter  = aws.gdb-core-prod
  }

  common_tags = merge(
    local.common_tags,
    {
      service                  = "VPN",
      plat_env_project_service = "${local.aggregated_tag}_VPN"
    }
  )
} */

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

data "aws_ec2_managed_prefix_list" "vpn_ny_users" {
  filter {
    name   = "prefix-list-name"
    values = ["vpn-ny-users"]
  }
}
