resource "aws_vpc" "vpc" {
  cidr_block           = "${var.vpc_cidr}.0.0/16"
  enable_dns_support   = "true"
  enable_dns_hostnames = "true"
  enable_classiclink   = "false"
  instance_tenancy     = "default"
  tags = {
    Name = "${var.client_name}_vpc"
  }
}

resource "aws_flow_log" "flowlog_cloudwatch" {
  iam_role_arn    = aws_iam_role.flowlog_role_cloudwatch.arn
  log_destination = aws_cloudwatch_log_group.flowlog_loggroup.arn
  traffic_type    = "ALL"
  vpc_id          = aws_vpc.vpc.id
  tags = {
    Name = "cloudwatch_flowlog"
  }
}

resource "aws_cloudwatch_log_group" "flowlog_loggroup" {
  name              = "flowlog"
  retention_in_days = "365"
}

resource "aws_iam_role" "flowlog_role_cloudwatch" {
  name = "flowlog_role_cloudwatch"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy" "flowlog_policy_cloudwatch" {
  name = "flowlog_policy_cloudwatch"
  role = aws_iam_role.flowlog_role_cloudwatch.id

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
EOF
}

resource "aws_flow_log" "flowlog_s3" {
  log_destination      = aws_s3_bucket.flowlog_bucket_s3.arn
  log_destination_type = "s3"
  traffic_type         = "ALL"
  vpc_id               = aws_vpc.vpc.id
  tags = {
    Name = "s3_flowlog"
  }
}

resource "aws_s3_bucket" "flowlog_bucket_s3" {
  bucket = var.flowlog_bucket
  acl    = "private"

  versioning {
    enabled = true
  }

  lifecycle_rule {
    id      = "Expire in 365 Days"
    enabled = true
    expiration {
      days = 365
    }
    noncurrent_version_expiration {
      days = 365
    }
  }

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }
}
