provider "aws" {
  region = "us-east-1"
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "public_a" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.0.0/24"
  availability_zone       = "us-east-1a"
  map_public_ip_on_launch = true
}

resource "aws_subnet" "private_a" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"
}

resource "aws_subnet" "private_b" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.2.0/24"
  availability_zone = "us-east-1b"
}

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main.id
}

resource "aws_nat_gateway" "nat" {
  subnet_id = aws_subnet.public_a.id
}

resource "aws_lb" "edge" {
  name       = "edge-alb"
  subnet_ids = [aws_subnet.public_a.id]
}

resource "aws_security_group" "web" {
  vpc_id = aws_vpc.main.id

  ingress {
    from_port   = 22
    to_port     = 22
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_ecs_cluster" "app" {
  name = "app-cluster"
}

resource "aws_ecs_service" "api" {
  name      = "api"
  subnet_id = aws_subnet.private_a.id
}

resource "aws_db_instance" "orders" {
  identifier              = "orders"
  engine                  = "postgres"
  instance_class          = "db.r6g.large"
  subnet_id               = aws_subnet.private_a.id
  multi_az                = false
  publicly_accessible     = true
  storage_encrypted       = false
  backup_retention_period = 0
}

resource "aws_elasticache_cluster" "sessions" {
  subnet_id = aws_subnet.private_b.id
}

resource "aws_s3_bucket" "assets" {
  bucket = "app-assets"
}

resource "aws_ebs_volume" "leftover" {
  availability_zone = "us-east-1a"
}

