module core_management_service {
  source = "git::ssh://git@bitbucket.org/netfoundry/nf-mop-tf.git//modules/aws/ecs_fargate_service"

  service_name = local.workspace["service_name"]
  container_count = local.workspace["task_count"]
  task_definition = data.template_file.task_definition.rendered
  task_role_arn = aws_iam_role.core_service_task_role.arn
  registry_arn = aws_service_discovery_service.core_service.arn
  ecs_cluster_id = data.terraform_remote_state.mop_core.outputs.ecs_cluster_id
  cpu = "2048"
  memory = "4096"
  execution_role_arn = aws_iam_role.core_service_task_role.arn
  security_groups = [
    aws_security_group.core_management_service.id,
    aws_security_group.core_management_service_https.id,
    data.terraform_remote_state.mop_core.outputs.sg_alb_id
  ]
  subnets = data.terraform_remote_state.mop_core.outputs.vpc_subnet_private_ids
  log_retention = 30
}


data "aws_secretsmanager_secret" "mysql_pass" {
  name = "mysql_pass_core_management_service"
  depends_on = [aws_secretsmanager_secret.mysql_pass]
}

data "aws_secretsmanager_secret" "spring_cloud_config" {
  name = "spring_cloud_config"
}

data "aws_secretsmanager_secret" "ssh_id_rsa" {
  name = "ssh-id-rsa"
}

data "aws_secretsmanager_secret" "beats_pem_key" {
  name = "beats-pem-key"
}

#NodeWeaver user info
data "aws_secretsmanager_secret" "nodeweaver_api_pass" {
  name = "infra-service-nodeweaver-api-pass"
}

data "aws_ssm_parameter" "nodeweaver_api_user" {
  name = "/nodeweaver/infra-service/api-user"
}

data "aws_ssm_parameter" "spring_mail_username" {
  name = "/mail/core-service/spring_mail_username"
}

data "aws_secretsmanager_secret" "spring_mail_password" {
  name = "spring_mail_password"
}

#DataNet url
data "aws_ssm_parameter" "data_net_url" {
  name = "/data_net/data_net_url"
}
#DataNet username
data "aws_ssm_parameter" "data_net_username" {
  name = "/data_net/data_net_username"
}
#DataNet password
data "aws_secretsmanager_secret" "data_net_password" {
  name = "data_net_password"
}

data "aws_secretsmanager_secret" "es_micrometer_creds" {
  name = "es_micrometer_creds"
}

data template_file "task_definition" {
  template = file("${path.module}/templates/task-definition.json")

  vars = {
    ansible_timeout_minutes= 30
    image_url = "745435643501.dkr.ecr.us-east-1.amazonaws.com/core-management:${data.aws_ssm_parameter.container_image.value}"
    #image_url = "netfoundry/core-management:${data.aws_ssm_parameter.container_image.value}"
    #docker_hub_secret_arn = data.terraform_remote_state.mop_core.outputs.dockerhub_secret_arn
    container_name = local.workspace["service_name"]
    container_port = local.workspace["container_port"]
    service_endpoint = "${local.workspace["short_name"]}.${data.terraform_remote_state.mop_core.outputs.ecs_private_discovery_namespace_name}"
    health_check_path = local.workspace["health_check_path"]
    log_group_region = var.region[terraform.workspace]
    log_group_name = module.core_management_service.cwlog_group_name
    spring_profiles_active = local.workspace["deploy_env_name"]
    aws_default_region = var.region[terraform.workspace]
    # properties settings
    subdomain = local.workspace["subdomain"]
    browzer_subdomain = local.workspace["browzer_subdomain"]
    rds_endpoint = "jdbc:mysql://${module.rds.this_db_instance_address}:3306/${module.rds.this_db_instance_name}?autoReconnect=true&useSSL=false&serverTimezone=Etc/Universal"
    rds_username = module.rds.this_db_instance_username
    rds_hostname = module.rds.this_db_instance_address
    mysql_pass = data.aws_secretsmanager_secret.mysql_pass.arn
    rds_pool_size = local.workspace["rds_pool_size"]
    ssh_id_rsa = data.aws_secretsmanager_secret.ssh_id_rsa.arn
    beats_pem_key = data.aws_secretsmanager_secret.beats_pem_key.arn
    es_host = data.terraform_remote_state.mop_core.outputs.es_host
    es_micrometer_username = "${data.aws_secretsmanager_secret.es_micrometer_creds.arn}:username::"
    es_micrometer_password = "${data.aws_secretsmanager_secret.es_micrometer_creds.arn}:password::"
    azure_resource_group = "${local.workspace["deploy_env_name"]}-tf-rg"
    nodeweaver_api_user = data.aws_ssm_parameter.nodeweaver_api_user.value
    nodeweaver_api_pass = data.aws_secretsmanager_secret.nodeweaver_api_pass.arn
    auth0_client_id = auth0_client.client.client_id
    auth0_client_secret = auth0_client.client.client_secret
    deploy_environment = local.workspace["deploy_env_name"]
    redis_cluster_address = aws_elasticache_replication_group.default.primary_endpoint_address
    redis_failover_address = aws_elasticache_replication_group.default.reader_endpoint_address
    svc_ssh_publickey = lookup(var.svc_ssh_publickey_map, local.workspace["deploy_env_name"])
    svc_ssh_user = "nfadmin"
    spring_mail_username = data.aws_ssm_parameter.spring_mail_username.value
    spring_mail_password = data.aws_secretsmanager_secret.spring_mail_password.arn
    data_net_url         = data.aws_ssm_parameter.data_net_url.value
    data_net_username    = data.aws_ssm_parameter.data_net_username.value
    data_net_password    = data.aws_secretsmanager_secret.data_net_password.arn
    rabbit_mq_endpoints  = data.terraform_remote_state.central_mq.outputs.central_rabbitmq_endpoints
    rabbit_mq_username  = data.terraform_remote_state.central_mq.outputs.central_rabbitmq_mopuser
    rabbit_mq_secret_arn  = data.terraform_remote_state.central_mq.outputs.central_rabbitmq_secret_arn
    route53_netfoundry_hostedzoneid  = data.terraform_remote_state.mop_core.outputs.zone_id
    route53_browzer_hostedzoneid  = data.terraform_remote_state.mop_core.outputs.browzer_zone_id
  }

}

resource "random_string" "rds_password" {
  length = 16
  special = true
  override_special = "!#+"
}

resource "aws_secretsmanager_secret" "mysql_pass" {
  name = "mysql_pass_core_management_service"
  description = "The password of the MYSQL RDS instance that stores network service information."
}

resource "aws_secretsmanager_secret_version" "mysql_pass" {
  secret_id = aws_secretsmanager_secret.mysql_pass.id
  secret_string = random_string.rds_password.result
  version_stages = [
    local.workspace["subdomain"]]
}

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

module "rds" {
  source = "terraform-aws-modules/rds/aws"
  version = "~> 2.35.0"

# insert the 10 required variables here
  identifier = local.workspace["rds_instance_name"]

  engine = "mysql"
  engine_version = data.aws_db_instance.master.engine_version
  auto_minor_version_upgrade = false
  instance_class = local.workspace["rds_instance_class"]
  allocated_storage = local.workspace["rds_disk_size"]
  major_engine_version = "8.0"
  family = "mysql8.0"
  create_db_parameter_group = "true"

  name = "CoreManagement"
  username = "coreMgmtUser"
  password = random_string.rds_password.result
  port = "3306"
  vpc_security_group_ids = [
    data.terraform_remote_state.mop_core.outputs.sg_mysql_id,
    aws_security_group.core_management_service_mysql.id]
  subnet_ids = [
    data.terraform_remote_state.mop_core.outputs.vpc_subnet_private_ids[0],
    data.terraform_remote_state.mop_core.outputs.vpc_subnet_private_ids[1],
    data.terraform_remote_state.mop_core.outputs.vpc_subnet_private_ids[2]
  ]
  maintenance_window = "Mon:00:00-Mon:03:00"
  backup_window = "03:00-06:00"
  backup_retention_period = local.workspace["db_backup_retention_period"]
  replicate_source_db = local.replicate_source_db

  option_group_description = "Option group for ${local.workspace["rds_instance_name"]}"
  parameter_group_description = "Database parameter group for ${local.workspace["rds_instance_name"]}"
  db_subnet_group_description = "Database subnet group for ${local.workspace["rds_instance_name"]}"

  parameters = [
    {
      name = "character_set_client"
      value = "utf8mb4"
    },
    {
      name = "character_set_server"
      value = "utf8mb4"
    },
    {
      name = "skip_name_resolve"
      value = "1"
    },
    {
      name = "slow_query_log"
      value = local.workspace["rds_slow_log_enable"]
    },
    {
      name = "long_query_time"
      value = local.workspace["rds_slow_log_time"]
    },
    {
      name = "log_output"
      value = local.workspace["rds_slow_log_output"]
    },
    {
      name = "max_connections"
      value = local.workspace["rds_max_connections"]
    },
    {
      name = "performance_schema"
      value = "1"
    }
  ]

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