data "aws_secretsmanager_secret" "billing_service_mysql_pass" {
  name = "mysql_pass_billing_server"
}

data "aws_secretsmanager_secret_version" "billing_service_mysql_pass" {
  secret_id = data.aws_secretsmanager_secret.billing_service_mysql_pass.id
}

resource "aws_db_parameter_group" "billing_service_db" {
  name   = "billing-service-db"
  family = local.workspace["rds_engine_family"]
  parameter {
    name  = "character_set_client"
    value = "utf8mb4"
  }

  parameter {
    name  = "character_set_server"
    value = "utf8mb4"
  }

  parameter {
    name         = "skip_name_resolve"
    value        = "1"
    apply_method = "pending-reboot"
  }
}

data "aws_db_instance" "master" {
  provider               = aws.us-east-1
  db_instance_identifier = local.workspace["rds_instance_name"]
}

# Formerly nf-mop-tf//modules/aws/rds. Inlined here so the RDS instance can be
# managed directly -- the module set the `name` argument, which the AWS provider
# removed in v5 in favour of `db_name`.
locals {
  # Mirrors the environment map the rds module used for its tags. Note this is
  # NOT the same as local.deploy_env_name: the module mapped nf-staging-west-int
  # to "staging-west" where deploy_env_name maps it to "staging".
  rds_environments = {
    nf-sandbox          = "sandbox"
    nf-staging-int      = "staging"
    nf-prod-int         = "production"
    nf-staging-west-int = "staging-west"
  }
  rds_environment = local.rds_environments[terraform.workspace]
}

resource "aws_db_subnet_group" "billing" {
  name        = "${local.workspace["rds_instance_name"]}-subnetgrp"
  description = "RDS subnet group"
  subnet_ids  = slice(data.terraform_remote_state.mop_core.outputs.vpc_subnet_private_ids, 0, 3)
}

resource "aws_db_instance" "billing" {
  identifier                 = local.workspace["rds_instance_name"]
  allocated_storage          = local.rds_disk_size
  engine                     = "mysql"
  engine_version             = data.aws_db_instance.master.engine_version
  instance_class             = local.rds_instance_class
  db_name                    = "billing"
  username                   = "billing"
  password                   = data.aws_secretsmanager_secret_version.billing_service_mysql_pass.secret_string
  skip_final_snapshot        = true
  auto_minor_version_upgrade = false

  // Accepts a csv string of security group id's
  vpc_security_group_ids = split(",", data.terraform_remote_state.mop_core.outputs.sg_mysql_id)

  db_subnet_group_name = aws_db_subnet_group.billing.name
  parameter_group_name = aws_db_parameter_group.billing_service_db.id

  multi_az                = false
  storage_type            = local.workspace["rds_storage_type"]
  publicly_accessible     = false
  backup_retention_period = 7
  backup_window           = "03:00-03:59"
  maintenance_window      = "Tue:09:00-Tue:09:59"
  iops                    = local.workspace["rds_iops"]

  // Only applies to new instances
  storage_encrypted = true

  lifecycle {
    prevent_destroy = true
    ignore_changes  = [storage_encrypted, tags]
  }

  tags = {
    nf_node_type     = "MOP"
    nf_environment   = local.rds_environment
    cost_environment = local.rds_environment == "production" ? "production" : "non-production"
    cost_category    = "MOPINT"
    cost_team_owner  = "MOPPLT"
  }
}
