data "aws_kms_alias" "default_rds" {
  name = "alias/default_rds"
}

# DB part
data "aws_iam_role" "rds_monitoring_role" {
  name = "rds-monitoring-role"
}

resource "aws_db_subnet_group" "private" {
  name       = "${local.name_prefix}-private-db-subnet-group"
  subnet_ids = module.main_private_db_subnets.subnet_ids
  tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_SLZD_AURA"
    }
  )
}

module "rds_proxy" {
  source      = "../../../modules/iam/roles/rds_role"
  name_prefix = local.name_prefix
  name        = "rds_proxy"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZD",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_SLZD_AURA"
    }
  )
  policies_list = [
    module.kms_secrets_manager.secrets_services_ro_policy.arn
  ]
}


resource "aws_rds_cluster_parameter_group" "slz_db_13" {
  name   = "${local.name_prefix}-slz-cluster-parameter-group-13"
  family = "aurora-postgresql13"

  parameter {
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_cron"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "cron.database_name"
    value        = "slz"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "slz_db_13" {
  name   = "${local.name_prefix}-slz-db-parameter-group-13"
  family = "aurora-postgresql13"
}

resource "aws_rds_cluster_parameter_group" "slz_db_17" {
  name   = "${local.name_prefix}-slz-cluster-parameter-group-17"
  family = "aurora-postgresql17"

  parameter {
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_cron"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "cron.database_name"
    value        = "slz"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "slz_db_17" {
  name   = "${local.name_prefix}-slz-db-parameter-group-17"
  family = "aurora-postgresql17"
}

module "slz_aurora_enc" {
  source                              = "../../../modules/rds/aurora_v2"
  name                                = "slz-enc"
  name_prefix                         = local.name_prefix
  vpc_id                              = module.main_vpc.vpc_id
  db_subnet_group_name                = aws_db_subnet_group.private.id
  security_groups                     = [module.main_sg_map.aurora_id, module.main_sg_map.db_debug_id]
  instance_count                      = 2
  instance_type                       = "db.r6g.xlarge"
  engine                              = "aurora-postgresql"
  engine_version                      = "17.7"
  allow_major_version_upgrade         = true
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.slz_db_17.name
  db_parameter_group_name             = aws_db_parameter_group.slz_db_17.name
  publicly_accessible                 = false
  apply_immediately                   = true
  snapshot_identifier                 = ""
  performance_insights_enabled        = true
  iam_database_authentication_enabled = true
  monitoring_interval                 = 1
  monitoring_role_arn                 = data.aws_iam_role.rds_monitoring_role.arn

  storage_encrypted = true
  kms_key_id        = data.aws_kms_alias.default_rds.target_key_arn

  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_SLZD_AURA"
    }
  )
}

data "aws_secretsmanager_secret" "slz_proxy_users" {
  for_each = toset(var.slz_proxy_secrets)
  name     = "${lower(var.platform["name"])}/${local.env_prefix}/${each.value}"
}

module "slz_rds_standard_proxy" {
  source                       = "../../../modules/rds/proxy"
  name                         = "${local.name_prefix}-slz-standard"
  rds_proxy_role_arn           = module.rds_proxy.role.arn
  db_cluster_id                = module.slz_aurora_enc.rds_cluster_id
  vpc_subnet_ids               = module.main_private_db_subnets.subnet_ids
  max_connections_percent      = 90
  max_idle_connections_percent = 45
  vpc_security_group_ids = [
    module.main_sg_map.aurora_id,
    module.main_sg_map.db_debug_id
  ]
  creds_secrets = [for secret in data.aws_secretsmanager_secret.slz_proxy_users : secret.arn]
  tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_SLZD_AURA"
    }
  )
}

# Main
resource "aws_rds_cluster_parameter_group" "main_db_13" {
  name   = "${local.name_prefix}-main-cluster-parameter-group-13"
  family = "aurora-postgresql13"

  parameter {
    name  = "work_mem"
    value = "65536"
  }

  parameter {
    name  = "maintenance_work_mem"
    value = "GREATEST({DBInstanceClassMemory/20822},65536)"
  }

  parameter {
    name  = "log_temp_files"
    value = "131072"
  }

  parameter {
    name  = "random_page_cost"
    value = "1.1"
  }

  parameter {
    name         = "shared_buffers"
    value        = "SUM({DBInstanceClassMemory/11000},-50003)"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "main_db_13" {
  name   = "${local.name_prefix}-main-db-parameter-group-13"
  family = "aurora-postgresql13"

  parameter {
    name         = "shared_buffers"
    value        = "SUM({DBInstanceClassMemory/11000},-50003)"
    apply_method = "pending-reboot"
  }
}

resource "aws_rds_cluster_parameter_group" "main_db_17" {
  name   = "${local.name_prefix}-main-cluster-parameter-group-17"
  family = "aurora-postgresql17"

  parameter {
    name  = "work_mem"
    value = "65536"
  }

  parameter {
    name  = "maintenance_work_mem"
    value = "GREATEST({DBInstanceClassMemory/20822},65536)"
  }

  parameter {
    name  = "log_temp_files"
    value = "131072"
  }

  parameter {
    name  = "random_page_cost"
    value = "1.1"
  }

  parameter {
    name         = "shared_buffers"
    value        = "SUM({DBInstanceClassMemory/11000},-50003)"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "main_db_17" {
  name   = "${local.name_prefix}-main-db-parameter-group-17"
  family = "aurora-postgresql17"

  parameter {
    name         = "shared_buffers"
    value        = "SUM({DBInstanceClassMemory/11000},-50003)"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_cluster_snapshot" "main_aurora" {
  db_cluster_identifier          = "" //module.main_aurora.rds_cluster_id
  db_cluster_snapshot_identifier = "${local.name_prefix}-main-before-encryption"
  lifecycle {
    ignore_changes = [db_cluster_identifier]
  }
}

module "main_aurora_enc" {
  source                              = "../../../modules/rds/aurora_v2"
  name                                = "main-enc"
  name_prefix                         = local.name_prefix
  vpc_id                              = module.main_vpc.vpc_id
  db_subnet_group_name                = aws_db_subnet_group.private.id
  security_groups                     = [module.main_sg_map.aurora_id, module.main_sg_map.db_debug_id]
  instance_count                      = 2
  instance_type                       = "db.r6i.4xlarge"
  engine                              = "aurora-postgresql"
  engine_version                      = "17.7"
  allow_major_version_upgrade         = true
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.main_db_17.name
  db_parameter_group_name             = aws_db_parameter_group.main_db_17.name
  publicly_accessible                 = false
  apply_immediately                   = true
  snapshot_identifier                 = aws_db_cluster_snapshot.main_aurora.id
  monitoring_interval                 = 60
  monitoring_role_arn                 = data.aws_iam_role.rds_monitoring_role.arn
  performance_insights_enabled        = true
  iam_database_authentication_enabled = true

  storage_encrypted = true
  kms_key_id        = data.aws_kms_alias.default_rds.target_key_arn

  iam_role_assosiations = {
    "s3Export" = module.rds_s3_export_role.role.arn,
    "s3Import" = module.rds_s3_import_role.role.arn,
  }
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_DATA_AURA"
    }
  )
}

# Workflowdb
resource "aws_rds_cluster_parameter_group" "workflowdb_13" {
  name   = "${local.name_prefix}-workflowdb-cluster-parameter-group-13"
  family = "aurora-postgresql13"

  parameter {
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_cron"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "cron.database_name"
    value        = "workflowdb"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "workflowdb_13" {
  name   = "${local.name_prefix}-workflowdb-parameter-group-13"
  family = "aurora-postgresql13"
}

resource "aws_rds_cluster_parameter_group" "workflowdb_17" {
  name   = "${local.name_prefix}-workflowdb-cluster-parameter-group-17"
  family = "aurora-postgresql17"

  parameter {
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_cron"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "cron.database_name"
    value        = "workflowdb"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "workflowdb_17" {
  name   = "${local.name_prefix}-workflowdb-parameter-group-17"
  family = "aurora-postgresql17"
}

resource "aws_db_cluster_snapshot" "workflowdb_aurora" {
  db_cluster_identifier          = "" #module.workflowdb_aurora.rds_cluster_id
  db_cluster_snapshot_identifier = "${local.name_prefix}-workflowdb-before-encryption"
  lifecycle {
    ignore_changes = [db_cluster_identifier]
  }
}

module "workflowdb_aurora_enc" {
  source                      = "../../../modules/rds/aurora_v2"
  name                        = "workflowdb-enc"
  name_prefix                 = local.name_prefix
  vpc_id                      = module.main_vpc.vpc_id
  db_subnet_group_name        = aws_db_subnet_group.private.id
  security_groups             = [module.main_sg_map.aurora_id, module.main_sg_map.db_debug_id]
  instance_count              = 2
  instance_type               = "db.r6g.large"
  engine                      = "aurora-postgresql"
  engine_version              = "17.7"
  allow_major_version_upgrade = true
  # use group with logical replication enabled
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.workflowdb_17.name
  db_parameter_group_name             = aws_db_parameter_group.workflowdb_17.name
  publicly_accessible                 = false
  apply_immediately                   = true
  snapshot_identifier                 = aws_db_cluster_snapshot.workflowdb_aurora.id
  performance_insights_enabled        = true
  iam_database_authentication_enabled = true
  monitoring_interval                 = 60
  monitoring_role_arn                 = data.aws_iam_role.rds_monitoring_role.arn

  storage_encrypted = true
  kms_key_id        = data.aws_kms_alias.default_rds.target_key_arn

  iam_role_assosiations = {
    "s3Export" = module.rds_s3_export_role.role.arn,
    "s3Import" = module.rds_s3_import_role.role.arn,
  }
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_PD_AURA"
    }
  )
}

data "aws_secretsmanager_secret" "workflowdb_proxy_users" {
  for_each = toset(var.workflowdb_proxy_secrets)
  name     = "${lower(var.platform["name"])}/${local.env_prefix}/${each.value}"
}

module "workflowdb_rds_standard_proxy" {
  source                       = "../../../modules/rds/proxy"
  name                         = "${local.name_prefix}-workflowdb-standard"
  rds_proxy_role_arn           = module.rds_proxy.role.arn
  db_cluster_id                = module.workflowdb_aurora_enc.rds_cluster_id
  vpc_subnet_ids               = module.main_private_db_subnets.subnet_ids
  max_connections_percent      = 85
  max_idle_connections_percent = 45
  vpc_security_group_ids = [
    module.main_sg_map.aurora_id,
    module.main_sg_map.db_debug_id
  ]
  creds_secrets = [for secret in data.aws_secretsmanager_secret.workflowdb_proxy_users : secret.arn]
  tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_PD_AURA"
    }
  )
}

# PD ETL db
resource "aws_rds_cluster_parameter_group" "pd_etldb_13" {
  name   = "${local.name_prefix}-pd-etldb-cluster-parameter-group-13"
  family = "aurora-postgresql13"

  parameter {
    name         = "shared_buffers"
    value        = "SUM({DBInstanceClassMemory/11000},-50003)"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_cron"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "cron.database_name"
    value        = "pd_etldb"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "pd_etldb_13" {
  name   = "${local.name_prefix}-pd-etldb-parameter-group-13"
  family = "aurora-postgresql13"
}

resource "aws_rds_cluster_parameter_group" "pd_etldb_17" {
  name   = "${local.name_prefix}-pd-etldb-cluster-parameter-group-17"
  family = "aurora-postgresql17"

  parameter {
    name         = "shared_buffers"
    value        = "SUM({DBInstanceClassMemory/11000},-50003)"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_cron"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "cron.database_name"
    value        = "pd_etldb"
    apply_method = "pending-reboot"
  }
}

resource "aws_db_parameter_group" "pd_etldb_17" {
  name   = "${local.name_prefix}-pd-etldb-parameter-group-17"
  family = "aurora-postgresql17"
}

resource "aws_db_cluster_snapshot" "pd_etldb_aurora" {
  db_cluster_identifier          = "" #module.pd_etldb_aurora.rds_cluster_id
  db_cluster_snapshot_identifier = "${local.name_prefix}-pd-etldb-before-encryption"
  lifecycle {
    ignore_changes = [db_cluster_identifier]
  }
}

module "pd_etldb_aurora_enc" {
  source                              = "../../../modules/rds/aurora_v2"
  name                                = "pd-etldb-enc"
  name_prefix                         = local.name_prefix
  vpc_id                              = module.main_vpc.vpc_id
  db_subnet_group_name                = aws_db_subnet_group.private.id
  security_groups                     = [module.main_sg_map.aurora_id, module.main_sg_map.db_debug_id]
  instance_count                      = 2
  instance_type                       = "db.r6i.2xlarge"
  engine                              = "aurora-postgresql"
  engine_version                      = "17.7"
  allow_major_version_upgrade         = true
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.pd_etldb_17.name
  db_parameter_group_name             = aws_db_parameter_group.pd_etldb_17.name
  publicly_accessible                 = false
  apply_immediately                   = true
  snapshot_identifier                 = aws_db_cluster_snapshot.pd_etldb_aurora.id
  performance_insights_enabled        = true
  iam_database_authentication_enabled = true
  monitoring_interval                 = 60
  monitoring_role_arn                 = data.aws_iam_role.rds_monitoring_role.arn

  storage_encrypted = true
  kms_key_id        = data.aws_kms_alias.default_rds.target_key_arn

  iam_role_assosiations = {
    "s3Export" = module.rds_s3_export_role.role.arn,
    "s3Import" = module.rds_s3_import_role.role.arn,
  }
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_PD_AURA"
    }
  )
}

data "aws_secretsmanager_secret" "pd_etldb_proxy_users" {
  for_each = toset(var.pd_etldb_proxy_secrets)
  name     = "${lower(var.platform["name"])}/${local.env_prefix}/${each.value}"
}

module "pd_etldb_rds_standard_proxy" {
  source                       = "../../../modules/rds/proxy"
  name                         = "${local.name_prefix}-pd-etldb-standard"
  rds_proxy_role_arn           = module.rds_proxy.role.arn
  db_cluster_id                = module.pd_etldb_aurora_enc.rds_cluster_id
  vpc_subnet_ids               = module.main_private_db_subnets.subnet_ids
  max_connections_percent      = 85
  max_idle_connections_percent = 45
  vpc_security_group_ids = [
    module.main_sg_map.aurora_id,
    module.main_sg_map.db_debug_id
  ]
  creds_secrets = [for secret in data.aws_secretsmanager_secret.pd_etldb_proxy_users : secret.arn]
  tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Aurora",
      plat_env_project_service = "${local.aggregated_tag}_PD_AURA"
    }
  )
}

resource "aws_rds_cluster_parameter_group" "ro_db_13" {
  name   = "${local.name_prefix}-ro-cluster-parameter-group-13"
  family = "aurora-postgresql13"

  parameter {
    name         = "default_transaction_read_only"
    value        = "1"
    apply_method = "immediate"
  }
}

resource "aws_db_parameter_group" "ro_db_13" {
  name   = "${local.name_prefix}-ro-db-parameter-group-13"
  family = "aurora-postgresql13"
}
