mock_provider "aws" {}

override_data {
  target = data.aws_vpc.vpc
  values = {
    id = "vpc-12345678"
  }
}

override_data {
  target = data.aws_subnets.private
  values = {
    ids = ["subnet-12345678", "subnet-23456789", "subnet-abcdef01", "subnet-bcdef012"]
  }
}

override_data {
  target = data.aws_subnets.public
  values = {
    ids = ["subnet-34567890", "subnet-45678901", "subnet-cdef0123", "subnet-def01234"]
  }
}

override_data {
  target = data.aws_subnet.private["subnet-12345678"]
  values = {
    id                         = "subnet-12345678"
    availability_zone_id       = "use1-az1"
    available_ip_address_count = 26
  }
}

override_data {
  target = data.aws_subnet.private["subnet-23456789"]
  values = {
    id                         = "subnet-23456789"
    availability_zone_id       = "use1-az2"
    available_ip_address_count = 26
  }
}

# Mock subnet in an excluded AZ
override_data {
  target = data.aws_subnet.private["subnet-abcdef01"]
  values = {
    id                         = "subnet-abcdef01"
    availability_zone_id       = "use1-az3"
    available_ip_address_count = 26
  }
}

# Mock subnet with insufficient IP addresses
override_data {
  target = data.aws_subnet.private["subnet-bcdef012"]
  values = {
    id                         = "subnet-bcdef012"
    availability_zone_id       = "use1-az4"
    available_ip_address_count = 25
  }
}

override_data {
  target = data.aws_subnet.public["subnet-34567890"]
  values = {
    id                         = "subnet-34567890"
    availability_zone_id       = "use1-az1"
    available_ip_address_count = 26
  }
}

override_data {
  target = data.aws_subnet.public["subnet-45678901"]
  values = {
    id                         = "subnet-45678901"
    availability_zone_id       = "use1-az2"
    available_ip_address_count = 26
  }
}

# Mock subnet in an excluded AZ
override_data {
  target = data.aws_subnet.public["subnet-cdef0123"]
  values = {
    id                         = "subnet-cdef0123"
    availability_zone_id       = "use1-az3"
    available_ip_address_count = 26
  }
}

# Mock subnet with insufficient IP addresses
override_data {
  target = data.aws_subnet.public["subnet-def01234"]
  values = {
    id                         = "subnet-def01234"
    availability_zone_id       = "use1-az4"
    available_ip_address_count = 25
  }
}

override_data {
  target = data.aws_ec2_managed_prefix_lists.private_subnets
  values = {
    ids = ["pl-12345678"]
  }
}

override_data {
  target = data.aws_ec2_managed_prefix_list.private_subnets
  values = {
    name = "dev-orcd-private-subnet-prefix-list"
    id   = "pl-12345678"
  }
}

override_data {
  target = data.aws_ec2_managed_prefix_lists.public_subnets
  values = {
    ids = ["pl-23456789"]
  }
}

override_data {
  target = data.aws_ec2_managed_prefix_list.public_subnets
  values = {
    name = "dev-orcd-public-subnet-prefix-list"
    id   = "pl-23456789"
  }
}

run "test_defaults" {
  variables {
    environment = "prod"
  }

  assert {
    condition     = output.vpc_id == "vpc-12345678"
    error_message = "VPC ID is not as expected"
  }

  assert {
    condition     = output.default_private_subnet_ids == ["subnet-12345678", "subnet-23456789"]
    error_message = "Private subnet IDs are not as expected"
  }

  assert {
    condition     = output.default_public_subnet_ids == ["subnet-34567890", "subnet-45678901"]
    error_message = "Public subnet IDs are not as expected"
  }

  assert {
    condition     = output.private_subnet_prefix_list_name == "dev-orcd-private-subnet-prefix-list"
    error_message = "Private subnet prefix list name is not as expected"
  }

  assert {
    condition     = output.private_subnet_prefix_list_id == "pl-12345678"
    error_message = "Private subnet prefix list ID is not as expected"
  }

  assert {
    condition     = output.public_subnet_prefix_list_name == "dev-orcd-public-subnet-prefix-list"
    error_message = "Public subnet prefix list name is not as expected"
  }

  assert {
    condition     = output.public_subnet_prefix_list_id == "pl-23456789"
    error_message = "Public subnet prefix list ID is not as expected"
  }
}


run "test_qa_overrides" {
  override_data {
    target = data.aws_caller_identity.current
    values = {
      account_id = "437795906767"
    }
  }

  override_data {
    target = data.aws_subnet.private["subnet-04f670ff4b31e9978"]
    values = {
      id                         = "subnet-04f670ff4b31e9978"
      availability_zone_id       = "use1-az2"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.private["subnet-0a88ca43f1cfa4996"]
    values = {
      id                         = "subnet-0a88ca43f1cfa4996"
      availability_zone_id       = "use1-az1"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.public["subnet-0862a9d380d77464f"]
    values = {
      id                         = "subnet-0862a9d380d77464f"
      availability_zone_id       = "use1-az2"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.public["subnet-0a384837a4a30790a"]
    values = {
      id                         = "subnet-0a384837a4a30790a"
      availability_zone_id       = "use1-az1"
      available_ip_address_count = 26
    }
  }

  variables {
    environment = "qa"
  }

  assert {
    condition     = output.default_private_subnet_ids == ["subnet-04f670ff4b31e9978", "subnet-0a88ca43f1cfa4996"]
    error_message = "Private subnet IDs are not as expected"
  }

  assert {
    condition     = output.default_public_subnet_ids == ["subnet-0862a9d380d77464f", "subnet-0a384837a4a30790a"]
    error_message = "Public subnet IDs are not as expected"
  }
}


run "test_prod_overrides" {
  override_data {
    target = data.aws_caller_identity.current
    values = {
      account_id = "437795906767"
    }
  }

  override_data {
    target = data.aws_subnet.private["subnet-0bc534925e6b8d780"]
    values = {
      id                         = "subnet-0bc534925e6b8d780"
      availability_zone_id       = "use1-az1"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.private["subnet-098b89d0c58c5693a"]
    values = {
      id                         = "subnet-098b89d0c58c5693a"
      availability_zone_id       = "use1-az4"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.public["subnet-0f4dba24"]
    values = {
      id                         = "subnet-0f4dba24"
      availability_zone_id       = "use1-az1"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.public["subnet-0dbe4f92fd1515e80"]
    values = {
      id                         = "subnet-0dbe4f92fd1515e80"
      availability_zone_id       = "use1-az4"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.public["subnet-30e29047"]
    values = {
      id                         = "subnet-30e29047"
      availability_zone_id       = "use1-az2"
      available_ip_address_count = 26
    }
  }

  override_data {
    target = data.aws_subnet.private["subnet-5366ef24"]
    values = {
      id                         = "subnet-5366ef24"
      availability_zone_id       = "use1-az2"
      available_ip_address_count = 26
    }
  }

  variables {
    environment = "prod"
  }

  assert {
    condition     = output.default_private_subnet_ids == ["subnet-098b89d0c58c5693a", "subnet-0bc534925e6b8d780", "subnet-5366ef24"]
    error_message = "Private subnet IDs are not as expected"
  }

  assert {
    condition     = output.default_public_subnet_ids == ["subnet-0dbe4f92fd1515e80", "subnet-0f4dba24", "subnet-30e29047"]
    error_message = "Public subnet IDs are not as expected"
  }
}

run "test_available_ip_limit_override" {
  variables {
    environment        = "prod"
    available_ip_limit = 24
  }

  # With limit=24, the subnet with 25 IPs (subnet-bcdef012) should now be included.
  assert {
    condition     = output.default_private_subnet_ids == ["subnet-12345678", "subnet-23456789", "subnet-bcdef012"]
    error_message = "Private subnet IDs should include the 25-IP subnet when available_ip_limit is 24"
  }

  assert {
    condition     = output.default_public_subnet_ids == ["subnet-34567890", "subnet-45678901", "subnet-def01234"]
    error_message = "Public subnet IDs should include the 25-IP subnet when available_ip_limit is 24"
  }
}

run "test_available_ip_limit_zero_skips_filter" {
  variables {
    environment        = "prod"
    available_ip_limit = 0
  }

  # With limit=0, all subnets (except excluded AZ) should be included regardless of IP count.
  assert {
    condition     = output.default_private_subnet_ids == ["subnet-12345678", "subnet-23456789", "subnet-bcdef012"]
    error_message = "Private subnet IDs should include all non-excluded subnets when available_ip_limit is 0"
  }

  assert {
    condition     = output.default_public_subnet_ids == ["subnet-34567890", "subnet-45678901", "subnet-def01234"]
    error_message = "Public subnet IDs should include all non-excluded subnets when available_ip_limit is 0"
  }
}
