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

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

  default_tags {
    tags = module.default_tags.tags
  }
}

terraform {
  backend "s3" {
    bucket  = "qa-songwhip-terraform-state"
    key     = "qa/rds/terraform.tfstate"
    region  = "us-east-1"
    encrypt = true
  }
}

data "aws_caller_identity" "current" {}

data "aws_route53_zone" "route53_zone" {
  name = "aws-staging.songwhip.com"
}

module "vpc_info" {
  source = "git@github.com:theorchard/terraform-vpc-info.git//?ref=3.2.2"

  environment = var.environment
}

module "rds" {
  source = "git@github.com:theorchard/terraform-rds.git//?ref=8.0.0"

  providers = {
    aws.dns = aws
  }

  application_family = var.application_family
  environment        = var.environment
  service_name       = var.service_name
  vpc_id             = module.vpc_info.vpc_id

  rds_cluster_instance_class                = var.rds_cluster_instance_class
  rds_cluster_instance_count                = var.rds_cluster_instance_count
  rds_cluster_instance_parameter_group_name = aws_db_parameter_group.rds_parameter_group_18.name
  rds_engine                                = "aurora-postgresql"
  rds_engine_version                        = var.rds_engine_version
  rds_ingress_cidr_blocks                   = var.rds_ingress_cidr_blocks
  rds_master_username                       = "dummy"
  rds_master_password                       = "dummy"
  rds_db_cluster_parameter_group_name       = aws_rds_cluster_parameter_group.rds_cluster_parameter_group_18.name
  rds_db_subnet_group_name                  = aws_db_subnet_group.db_subnet_group.name
  route53_record_creation_enabled           = false
  enabled_cloudwatch_logs_exports           = ["postgresql"]

  custom_kms_key_enabled = false
}

resource "aws_db_subnet_group" "db_subnet_group" {
  name       = "${var.environment}_${var.service_name}_rds_subnet_group"
  subnet_ids = module.vpc_info.default_private_subnet_ids
}

resource "aws_db_parameter_group" "rds_parameter_group" {
  name   = "${var.environment}-${var.service_name}-db-parameter-group"
  family = "aurora-postgresql13"
}

resource "aws_rds_cluster_parameter_group" "rds_cluster_parameter_group" {
  name        = "aurora-postgresql13-replication"
  family      = "aurora-postgresql13"
  description = "Aurora postgresql 13 replication cluster parameter group for Fivetran"

  parameter {
    name         = "wal_sender_timeout"
    value        = "0"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.logical_replication"
    value        = "1"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.force_ssl"
    value        = "1"
    apply_method = "immediate"
  }

  parameter {
    name         = "max_wal_senders"
    value        = "20"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "rds_parameter_group_16" {
  name   = "${var.environment}-${var.service_name}-db-parameter-group-16"
  family = "aurora-postgresql16"
}

resource "aws_rds_cluster_parameter_group" "rds_cluster_parameter_group_16" {
  name        = "aurora-postgresql16-replication"
  family      = "aurora-postgresql16"
  description = "Aurora postgresql 16 replication cluster parameter group for Fivetran"

  parameter {
    name         = "wal_sender_timeout"
    value        = "0"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.logical_replication"
    value        = "1"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.force_ssl"
    value        = "1"
    apply_method = "immediate"
  }

  parameter {
    name         = "max_wal_senders"
    value        = "20"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "rds_parameter_group_17" {
  name   = "${var.environment}-${var.service_name}-db-parameter-group-17"
  family = "aurora-postgresql17"
}

resource "aws_rds_cluster_parameter_group" "rds_cluster_parameter_group_17" {
  name        = "aurora-postgresql17-replication"
  family      = "aurora-postgresql17"
  description = "Aurora postgresql 17 replication cluster parameter group for Fivetran"

  parameter {
    name         = "wal_sender_timeout"
    value        = "0"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.logical_replication"
    value        = "1"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.force_ssl"
    value        = "1"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "max_wal_senders"
    value        = "20"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "rds_parameter_group_18" {
  name   = "${var.environment}-${var.service_name}-db-parameter-group-18"
  family = "aurora-postgresql18"
}

resource "aws_rds_cluster_parameter_group" "rds_cluster_parameter_group_18" {
  name        = "aurora-postgresql18-replication"
  family      = "aurora-postgresql18"
  description = "Aurora postgresql 18 replication cluster parameter group for Fivetran"

  parameter {
    name         = "wal_sender_timeout"
    value        = "0"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.logical_replication"
    value        = "1"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "rds.force_ssl"
    value        = "1"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "max_wal_senders"
    value        = "20"
    apply_method = "pending-reboot"
  }
}

module "rds_dashboard" {
  source = "git@github.com:theorchard/terraform-datadog.git//modules/rds?ref=6.18.2"

  application_family = var.application_family
  environment        = var.environment
  service_name       = var.service_name

  notification_endpoints            = "@team-songwhip"
  escalation_notification_endpoints = "@slack-songwhip-devs"
}

module "rds_secrets" {
  source   = "git@github.com:theorchard/terraform-secrets-manager.git//?ref=1.5.3"
  for_each = toset(var.secrets_manager_secret_names)

  application_family = var.application_family
  environment        = var.environment
  service_name       = var.service_name
  secret_name        = each.value
}
