locals {
  data_cleaner_user_data_secrets_combined = [
    {
      name      = "ATLASAPI_CLIENT_SECRET",
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:apollo/${local.env_prefix}/data_cleaner/ATLASAPI_CLIENT_SECRET"
    },
    {
      name      = "SENTRY_DSN",
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:apollo/${local.env_prefix}/data_cleaner/SENTRY_DSN"
    },
    {
      name      = "DD_API_KEY",
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:apollo/${local.env_prefix}/common/DD_API_KEY"
    },
    {
      name      = "DB_PASS",
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:apollo/${local.env_prefix}/user_data/pg/user:password::"
    },
    {
      name      = "DB_USER",
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:apollo/${local.env_prefix}/user_data/pg/user:username::"
    },
    {
      name      = "DB_HOST",
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:apollo/${local.env_prefix}/user_data/pg/user:host::"
    },
  ]

  user_data_models = {
    a = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "models.user_data.Message",
      FILTER_BY           = "created_at"
      BY_CHUNKS           = 0
      schedule_expression = "cron(0 1 * * ? *)"
    },
    b = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "models.user_data.FeedMessage",
      FILTER_BY           = "created_at"
      BY_CHUNKS           = 0
      schedule_expression = "cron(0 2 * * ? *)"
    },
    c = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "models.user_data.PushMessage",
      FILTER_BY           = "created_at"
      BY_CHUNKS           = 0
      schedule_expression = "cron(0 3 * * ? *)"
    },
    d = {
      STORED_PERIOD       = 30,
      MODEL_PATH          = "models.user_data.Event",
      FILTER_BY           = "created_at"
      BY_CHUNKS           = 0
      schedule_expression = "cron(0 4 * * ? *)"
    }
  }
}

resource "aws_cloudwatch_log_group" "data_cleaner_user_data_log_group" {
  name              = "/ecs/${local.name_prefix}-data_cleaner_user_data"
  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_user_data_task_def" {
  for_each = local.user_data_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_user_data-${each.key}"
  container_name  = "data_cleaner_user_data-${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_user_data_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_TYPE",
      value = "PSQL"
    },
    {
      name  = "DB_NAME",
      value = "user_data"
    },
    {
      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"
    },
    {
      name  = "DB_PORT",
      value = 5432
    },
  ]
  secrets = local.data_cleaner_user_data_secrets_combined

  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_user_data" {
  for_each = local.user_data_models
  source   = "../../../modules/ecs/tasks/scheduled_taskless"

  cluster_arn         = data.aws_ecs_cluster.main.arn
  env_prefix          = local.env_prefix
  project             = "data_cleaner_user_data-${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_user_data_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"
    }
  )
}
