locals {
  data_cleaner_main_secrets = [
    "ATLASAPI_CLIENT_SECRET",
    "SENTRY_DSN",
  ]

  data_cleaner_main_common_secrets = {
    DB_USER            = aws_secretsmanager_secret.apollo_api_secret["MYSQL_DB_USER"]
    DB_PASS            = aws_secretsmanager_secret.apollo_api_secret["MYSQL_DB_PASS"]
    DD_API_KEY         = aws_secretsmanager_secret.common_secret["DD_API_KEY"]
    USERDATAAPI_APIKEY = aws_secretsmanager_secret.apollo_user_data_secret["AUTH_API_KEY"]
  }

  data_cleaner_main_secrets_mapping = [
    for k, v in merge(aws_secretsmanager_secret.data_cleaner_main_secret, local.data_cleaner_main_common_secrets) :
    {
      name      = k,
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
    }
  ]

  models = {
    f = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "accounts"
      FILTER_BY           = ""
      BY_CHUNKS           = 0
      schedule_expression = "cron(0 4 ? * SUN *)"
    },
    g = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "inactive_accounts"
      FILTER_BY           = "updated_at"
      BY_CHUNKS           = 0
      schedule_expression = "cron(30 4 ? * SUN *)"
    },
    k = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "events"
      FILTER_BY           = "created_at"
      BY_CHUNKS           = 0
      schedule_expression = "cron(0 5 ? * SUN *)"
    },
    l = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "messages",
      FILTER_BY           = "created_at"
      BY_CHUNKS           = 0
      schedule_expression = "cron(30 5 ? * SUN *)"
    }
  }
}

data "aws_ecr_repository" "data_cleaner_main_ecr" {
  name = "${local.project_group}/data_cleaner_job"
}

resource "aws_secretsmanager_secret" "data_cleaner_main_secret" {
  for_each = toset(local.data_cleaner_main_secrets)

  name       = "${local.secrets_name_prefix}/data_cleaner/${each.value}"
  kms_key_id = data.aws_kms_key.secrets_general_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

resource "aws_cloudwatch_log_group" "data_cleaner_main_log_group" {
  name              = "/ecs/${local.name_prefix}-data_cleaner_main"
  retention_in_days = module.cloudwatch_logs_retention_by_env[local.env_prefix]

  tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "CloudWatch",
      plat_env_project_service = "${local.aggregated_tag}_PRL_CW"
    }
  )
}

module "data_cleaner_ecs_role" {
  source = "../../../modules/iam/roles/ecs_task_role"

  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "data_cleaner_ecs_role"

  policies_list = [
    data.aws_iam_policy.secrets_deployment_ro.arn,
    data.aws_iam_policy.logging_policy.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PRL_ECS"
    }
  )
}

module "data_cleaner_main_task_def" {
  for_each = local.models
  source   = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-data_cleaner_main-${each.key}"
  container_name  = "data_cleaner_main-${each.key}"
  container_image = "${data.aws_ecr_repository.data_cleaner_main_ecr.repository_url}:${local.docker_image_env_tag[local.env_prefix]}"
  cpu             = 512
  memory          = 1024

  awslogs_create_group = false
  awslogs_group_name   = aws_cloudwatch_log_group.data_cleaner_main_log_group.name

  task_role_arn = module.data_cleaner_ecs_role.role.arn
  exec_role_arn = data.aws_iam_role.standard_exec.arn

  env_vars = [
    {
      name  = "ENVIRONMENT",
      value = local.environment
    },
    {
      name  = "DB_NAME",
      value = "dbSony_dbo"
    },
    {
      name  = "DB_TYPE",
      value = "MYSQL"
    },
    {
      name  = "DB_PORT",
      value = 3306
    },
    {
      name  = "DB_HOST",
      value = module.domains[local.env_prefix]["main-db-rw"]
    },
    {
      name  = "SLAVE_DB_HOST",
      value = module.domains[local.env_prefix]["main-db-ro"]
    },
    {
      name  = "ALLOW_DB_REPLICATION",
      value = "True"
    },
    {
      name  = "REDIS_HOST",
      value = data.aws_elasticache_cluster.main.cache_nodes.0.address
    },
    {
      name  = "STORED_PERIOD",
      value = lookup(each.value, "STORED_PERIOD")
    },
    {
      name  = "MODEL_PATH",
      value = lookup(each.value, "MODEL_PATH")
    },
    {
      name  = "FILTER_BY",
      value = lookup(each.value, "FILTER_BY")
    },
    {
      name  = "BY_CHUNKS",
      value = lookup(each.value, "BY_CHUNKS")
    },
    {
      name  = "ECS_CLUSTER",
      value = data.aws_ecs_cluster.main.cluster_name
    },
    {
      name  = "PROJECT",
      value = local.project_group
    },
    {
      name  = "ECS_SERVICE",
      value = "data_cleaner_main"
    },
    {
      name  = "ATLASAPI_HOST",
      value = module.atlas_domains.uat["atlas-um"]
    },
    {
      name  = "ATLASAPI_CLIENT_ID",
      value = "e45e9239-37c6-4ee4-8c4e-ced22448f688"
    },
    {
      name  = "USERDATAAPI_HOST",
      value = module.domains[local.env_prefix]["user-data-api"]
    },
  ]
  secrets = local.data_cleaner_main_secrets_mapping

  docker_labels = {
    "traefik.enable" = "false"
  }

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PRL_ECS"
    }
  )
}

module "data_cleaner_main" {
  for_each = local.models
  source   = "../../../modules/ecs/tasks/scheduled_taskless"

  cluster_arn         = data.aws_ecs_cluster.main.arn
  env_prefix          = local.env_prefix
  project             = "data_cleaner_main-${each.key}"
  project_group       = local.project_group
  scheduler_role_arn  = data.aws_iam_role.scheduler_role.arn
  security_groups     = [data.aws_security_group.main.id]
  subnets             = data.aws_subnets.private_subnets.ids
  task_definition_arn = module.data_cleaner_main_task_def[each.key].arn

  schedule_expression = {
    a = {
      expression = lookup(each.value, "schedule_expression")
      enabled    = lookup(each.value, "schedule_enabled", false)
    }
  }

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PRL_ECS"
    }
  )
}
