data "aws_ecr_repository" "slz_hasher" {
  name = "delphi/slz-hasher"
}

module "slz_hasher_job_def" {
  source          = "../../../modules/batch/job_definition"
  env_prefix      = local.env_prefix
  project_group   = local.project_group
  project         = "slz_hasher"
  job_role_arn    = module.slz_hasher_role.role.arn
  image           = "${data.aws_ecr_repository.slz_hasher.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  vcpus           = 1
  memory          = 512
  timeout_seconds = 3600
  retry_attempts  = 1
  env_vars        = [{ name = "AWS_DEFAULT_REGION", value = var.aws_region_id }]
}

module "slz_hasher_long_job_def" {
  source          = "../../../modules/batch/job_definition"
  env_prefix      = local.env_prefix
  project_group   = local.project_group
  project         = "slz_hasher_long"
  job_role_arn    = module.slz_hasher_role.role.arn
  image           = "${data.aws_ecr_repository.slz_hasher.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  vcpus           = 1
  memory          = 512
  timeout_seconds = 25200
  retry_attempts  = 1
  env_vars        = [{ name = "AWS_DEFAULT_REGION", value = var.aws_region_id }]
}

module "slz_hasher_role" {
  source              = "../../../modules/iam/roles/ecs_task_role"
  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "slz_hasher_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_LMB"
    }
  )
  policies_list = [
    module.iam_map.s3_env_rw.arn,
    module.iam_map.s3_sme_data_rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.db_rw.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
  ]
}

module "slz_meta_manager_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_meta_manager_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_LMB"
    }
  )
  policies_list = [
    module.iam_map.sf_execute.arn,
    module.iam_map.sqs_consumer.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.s3_env_ro.arn,
    module.iam_map.db_rw.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slzMetaFlow_role" {
  source      = "../../../modules/iam/roles/stepfunction_role"
  name_prefix = local.name_prefix
  name        = "slzMetaFlow_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "Step Functions",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_SFU"
    }
  )
  policies_list = [
    module.iam_map.s3_env_ro.arn,
    module.iam_map.lambda_invoke.arn,
    module.iam_map.batch_jobs_sync.arn,
    data.aws_iam_policy.logging.arn,
  ]
}

resource "aws_sfn_state_machine" "slzMetaFlow" {
  name       = "${local.name_prefix}-slzMetaFlow"
  role_arn   = module.slzMetaFlow_role.role.arn
  definition = <<EOF
{
  "StartAt": "Placeholder",
  "States": {
    "Placeholder": {
      "Type": "Pass",
      "End": true
    }
  }
}
EOF
  tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "Step Functions",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_SFU"
    }
  )
  lifecycle {
    ignore_changes = [definition]
  }
}

resource "aws_sqs_queue" "reports-meta-dlq" {
  name                       = "${local.name_prefix}-reports-meta-dlq"
  visibility_timeout_seconds = 120
  #redrive_policy              = length(var.dead_letter_queue) > 0 ? data.template_file.redrive_policy.rendered : ""
  #delay_seconds               = var.delay_seconds
  #max_message_size            = var.max_message_size
  #message_retention_seconds   = var.message_retention_seconds
  #receive_wait_time_seconds   = var.receive_wait_time_seconds
  #content_based_deduplication = var.content_based_deduplication

  tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "SQS",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_SQS"
    }
  )
}

resource "aws_sqs_queue" "reports-meta" {
  name                       = "${local.name_prefix}-reports-meta"
  visibility_timeout_seconds = 120
  redrive_policy             = "{\"deadLetterTargetArn\":\"${aws_sqs_queue.reports-meta-dlq.arn}\",\"maxReceiveCount\":5}"
  #delay_seconds               = var.delay_seconds
  #max_message_size            = var.max_message_size
  #message_retention_seconds   = var.message_retention_seconds
  #receive_wait_time_seconds   = var.receive_wait_time_seconds
  #content_based_deduplication = var.content_based_deduplication

  tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "SQS",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_SQS"
    }
  )
}

module "batch_run_config_hasher" {
  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      = "batch-run-config-hasher.json"
  batch_job_definition_arn = module.slz_hasher_job_def.batch_job_definition.arn
  batch_job_queue_arn      = data.aws_batch_job_queue.slz_downloader_utility.arn
}

module "batch_run_config_hasher_long" {
  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      = "batch-run-config-hasher-long.json"
  batch_job_definition_arn = module.slz_hasher_long_job_def.batch_job_definition.arn
  batch_job_queue_arn      = data.aws_batch_job_queue.slz_downloader_utility_long.arn
}

module "slz_meta_status_reset" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_meta_status_reset"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_LMB"
    }
  )
  policies_list = [
    data.aws_iam_policy.logging.arn,
    module.iam_map.db_rw.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_meta_retrigger_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_meta_retrigger_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_LMB"
    }
  )
  policies_list = [
    module.iam_map.sqs_producer.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.s3_env_ro.arn,
    module.iam_map.db_rw.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.assume_isnt_role.arn,
  ]

  allow_execution_inside_vpc = true
}
