data "aws_ecr_repository" "dapd-exporter" {
  name = "delphi/dapd-exporter"
}

data "aws_ecr_repository" "dapd-exporter-api" {
  name = "delphi/dapd-exporter-api"
}

# Exporter
module "dapd_exporter_role" {
  source              = "../../../modules/iam/roles/ecs_task_role"
  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "dapd_exporter_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Batch",
      plat_env_project_service = "${local.aggregated_tag}_PD_BTCH"
    }
  )
  policies_list = [
    module.iam_map.s3_env_rw.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
  ]
}

module "dapd_exporter_job_def" {
  source          = "../../../modules/batch/job_definition"
  env_prefix      = local.env_prefix
  project_group   = local.project_group
  project         = "dapd-exporter"
  job_role_arn    = module.dapd_exporter_role.role.arn
  image           = "${data.aws_ecr_repository.dapd-exporter.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  vcpus           = 2
  memory          = 3000
  timeout_seconds = 10800
  retry_attempts  = 1
  env_vars = [
    {
      name  = "AWS_REGION",
      value = var.aws_region_id
    },
    {
      name  = "SENTRY_SECRET_KEY",
      value = "${local.project_group}/${local.env_prefix}/sentry_config"
    },
    {
      name  = "DD_ENV",
      value = local.env_prefix
    },
  ]
}

module "dapd_exporter_lambda_role" {
  source                     = "../../../modules/iam/roles/lambda_role"
  name_prefix                = local.name_prefix
  name                       = "dapd_exporter_lambda_role"
  allow_execution_inside_vpc = true
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_PD_LMB"
    }
  )
  policies_list = [
    module.iam_map.s3_env_rw.arn,
    module.iam_map.sqs_consumer.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.batch_jobs_sync.arn,
  ]
}

module "batch_run_config_exporter_high_priority" {
  source                   = "../../modules/batch_run_config"
  env_prefix               = local.env_prefix
  delphi-configs           = data.aws_s3_bucket.delphi-configs.bucket
  template_name            = "batch_run_config_hasher.tmpl"
  run_config_filename      = "public-data/exporter/batch-high-priority.json"
  batch_job_definition_arn = module.dapd_exporter_job_def.batch_job_definition.arn
  batch_job_queue_arn      = data.aws_batch_job_queue.dapd.arn
}

module "batch_run_config_exporter_medium_priority" {
  source                   = "../../modules/batch_run_config"
  env_prefix               = local.env_prefix
  delphi-configs           = data.aws_s3_bucket.delphi-configs.bucket
  template_name            = "batch_run_config_hasher.tmpl"
  run_config_filename      = "public-data/exporter/batch-medium-priority.json"
  batch_job_definition_arn = module.dapd_exporter_job_def.batch_job_definition.arn
  batch_job_queue_arn      = data.aws_batch_job_queue.dapd.arn
}

module "batch_run_config_exporter_low_priority" {
  source                   = "../../modules/batch_run_config"
  env_prefix               = local.env_prefix
  delphi-configs           = data.aws_s3_bucket.delphi-configs.bucket
  template_name            = "batch_run_config_hasher.tmpl"
  run_config_filename      = "public-data/exporter/batch-low-priority.json"
  batch_job_definition_arn = module.dapd_exporter_job_def.batch_job_definition.arn
  batch_job_queue_arn      = data.aws_batch_job_queue.dapd.arn
}

# Exporter api
/* module "dapd_exporter_api_role" {
  source              = "../../../modules/iam/roles/ecs_task_role"
  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "dapd_exporter_api_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PD_ECS"
    }
  )
  policies_list = [
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.s3_env_rw.arn,
    module.iam_map.sqs_producer.arn,
  ]
}

module "dapd_exporter_api_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-dapd-exporter-dbx-api"
  container_name  = "dapd-exporter-dbx-api"
  container_image = "${data.aws_ecr_repository.dapd-exporter-api.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  cpu             = 1024
  memory          = 2048

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

  env_vars = [
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
    {
      name  = "DB_SECRET_KEY",
      value = "${local.project_group}/${local.env_prefix}/api/pg/user"
    },
    {
      name  = "SENTRY_SECRET_KEY",
      value = "${local.project_group}/${local.env_prefix}/sentry_config"
    },
    {
      name  = "DBX_SECRET_MANAGER_KEY",
      value = "${local.project_group}/${local.env_prefix}/etl/databricks"
    }
  ]

  datadog_enabled    = true
  dd_apm_enabled     = true
  dd_logs_injection  = true
  dd_container_image = "public.ecr.aws/datadog/agent:latest"
  dd_awslogs_group   = aws_cloudwatch_log_group.datadog-agent.name

  dd_secrets = [{
    name      = "DD_API_KEY",
    valueFrom = aws_secretsmanager_secret.common_env_secrets["common/DD_API_KEY"].arn
  }]

  port_mappings = [{
    containerPort = 8000
    hostPort      = 8000
    protocol      = "tcp"
  }]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PD_ECS"
    }
  )
}

module "dapd_exporter_api_service" {
  source = "../../../modules/ecs/services/service_taskless_v2"

  env_prefix    = local.env_prefix
  project       = "dapd-exporter-dbx-api"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 1

  security_groups = [data.aws_security_group.main.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  route53_zone_id = data.aws_route53_zone.default.zone_id
  alb_dns_name    = data.aws_lb.internal_alb.dns_name
  alb_zone_id     = data.aws_lb.internal_alb.zone_id

  task_definition_arn = module.dapd_exporter_api_task_def.arn

  alb_enabled             = true
  https_listener_arn      = data.aws_lb_listener.internal_https_listener.arn
  tg_health_check_path    = "/api/v1/health"
  tg_health_check_matcher = "200-204"
  container_port          = 8000
  url                     = "${local.env_prefix}-exporter-dbx-api.delphiplatform.io"

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PD_ECS"
    }
  )
}

# Second exporter API with another database creds
module "dapd_exporter_sf_api_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-dapd-exporter-sf-api"
  container_name  = "dapd-exporter-sf-api"
  container_image = "${data.aws_ecr_repository.dapd-exporter-api.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  cpu             = 1024
  memory          = 2048

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

  env_vars = [
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
    {
      name  = "DB_SECRET_KEY",
      value = "${local.project_group}/${local.env_prefix}/api/pg/user"
    },
    {
      name  = "SENTRY_SECRET_KEY",
      value = "${local.project_group}/${local.env_prefix}/sentry_config"
    },
    {
      name  = "DBX_SECRET_MANAGER_KEY",
      value = "${local.project_group}/${local.env_prefix}/etl/databricks"
    }
  ]

  datadog_enabled    = true
  dd_apm_enabled     = true
  dd_logs_injection  = true
  dd_container_image = "public.ecr.aws/datadog/agent:latest"
  dd_awslogs_group   = aws_cloudwatch_log_group.datadog-agent.name

  dd_secrets = [{
    name      = "DD_API_KEY",
    valueFrom = aws_secretsmanager_secret.common_env_secrets["common/DD_API_KEY"].arn
  }]

  port_mappings = [{
    containerPort = 8000
    hostPort      = 8000
    protocol      = "tcp"
  }]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PD_ECS"
    }
  )
}

module "dapd_exporter_sf_api_service" {
  source = "../../../modules/ecs/services/service_taskless_v2"

  env_prefix    = local.env_prefix
  project       = "dapd-exporter-sf-api"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 1

  security_groups = [data.aws_security_group.main.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  route53_zone_id = data.aws_route53_zone.default.zone_id
  alb_dns_name    = data.aws_lb.internal_alb.dns_name
  alb_zone_id     = data.aws_lb.internal_alb.zone_id

  task_definition_arn = module.dapd_exporter_sf_api_task_def.arn

  alb_enabled             = true
  https_listener_arn      = data.aws_lb_listener.internal_https_listener.arn
  tg_health_check_path    = "/api/v1/health"
  tg_health_check_matcher = "200-204"
  container_port          = 8000
  url                     = "${local.env_prefix}-exporter-sf-api.delphiplatform.io"

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PD_ECS"
    }
  )
} */

module "dapd_importer_lambda_role" {
  source                     = "../../../modules/iam/roles/lambda_role"
  name_prefix                = local.name_prefix
  name                       = "dapd_importer_lambda_role"
  allow_execution_inside_vpc = true
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_PD_LMB"
    }
  )
  policies_list = [
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.lambda_invoke.arn,
    module.iam_map.s3_env_ro.arn,
  ]
}

module "dapd_upserter_lambda_role" {
  source                     = "../../../modules/iam/roles/lambda_role"
  name_prefix                = local.name_prefix
  name                       = "dapd_upserter_lambda_role"
  allow_execution_inside_vpc = true
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_PD_LMB"
    }
  )
  policies_list = [
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.s3_env_rw.arn,
  ]
}

module "notification_service_role" {
  source                     = "../../../modules/iam/roles/lambda_role"
  name_prefix                = local.name_prefix
  name                       = "notification_service_role"
  allow_execution_inside_vpc = true
  common_tags = merge(
    local.common_tags,
    {
      project                  = "DAPD",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_DAPD_LMB"
    }
  )
  policies_list = [
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.s3_env_ro.arn,
    module.iam_map.sns_publish.arn,
    module.iam_map.sqs_consumer.arn,
  ]
}

module "apollo_snowflake_role" {
  source             = "../../../modules/iam/roles/client_role"
  name               = "${local.name_prefix}-apollo_snowflake_role"
  client_account_id  = var.snowflake_aws_account_id
  client_iam_entity  = var.snowflake_aws_account_user
  client_external_id = var.snowflake_apollo_aws_external_id
  common_tags = merge(
    local.common_tags,
    {
      project                  = "DAPD",
      service                  = "IAM",
      plat_env_project_service = "${local.aggregated_tag}_DAPD_IAM"
    }
  )
  policies_list = [
    module.iam_map.s3_apollo_data_rw.arn,
  ]
}
