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

  allow_execution_inside_vpc = true
}

module "apps_etl_manager_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "apps_etl_manager_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Apps ETL",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_APPE_LMB"
    }
  )
  policies_list = [
    module.iam_map.s3_env_ro.arn,
    module.iam_map.db_rw.arn,
    module.iam_map.sf_execute.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.lambda_xray.arn,
    module.iam_map.s3_sme_data_ro.arn,
  ]

  allow_execution_inside_vpc = true
}

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

  allow_execution_inside_vpc = true
}

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

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


resource "aws_sns_topic" "apps_etl_failures" {
  name              = "${local.name_prefix}-apps_etl_failures"
  display_name      = "${local.name_prefix} Apps ETL failures topic"
  kms_master_key_id = data.aws_kms_key.default_sns_key.id
  tags = merge(
    local.common_tags,
    {
      project                  = "Apps ETL",
      service                  = "SNS",
      plat_env_project_service = "${local.aggregated_tag}_APPE_SNS"
    }
  )
}

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

  allow_execution_inside_vpc = true
}

# This secrets should be accessed programmatically and not as an env variable
resource "aws_secretsmanager_secret" "delphi_api_gras_pg_rw" {
  name       = "${local.secrets_name_prefix}/gras/pg_rw"
  kms_key_id = data.aws_kms_key.secrets_general_key.id
  #rotation_lambda_arn = ?
  #rotation_rules {
  #  automatically_after_days = ?
  #}
  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

data "aws_ecr_repository" "apps_etl_manager" {
  name = "delphi/apps-etl-manager"
}

module "apps_etl_manager_job_def" {
  source          = "../../../modules/batch/job_definition"
  env_prefix      = local.env_prefix
  project_group   = local.project_group
  project         = "apps_etl_manager"
  job_role_arn    = module.apps_etl_manager_batch_role.role.arn
  image           = "${data.aws_ecr_repository.apps_etl_manager.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  vcpus           = 2
  memory          = 7500
  timeout_seconds = 5400
  retry_attempts  = 1
  env_vars = [
    { name = "AWS_DEFAULT_REGION", value = var.aws_region_id },
    { name = "AWS_XRAY_SDK_ENABLED", value = "false" },
    { name = "ENVIRONMENT", value = local.env_prefix },
    { name = "CONFIG_PATH", value = "s3://${local.name_prefix}-configs/apps-etl-config.json" },
    { name = "MAX_FAILURE_COUNT", value = "3" },
    { name = "RDS_SECRETS_KEY", value = "${local.secrets_name_prefix}/slz/storage/pg_proxy/user" },
    { name = "SF_SECRETS_KEY", value = "${local.secrets_name_prefix}/snowflake_reader", },
    { name = "BATCH_SIZE", value = "50" },
    { name = "PRIORITY_DECREASE_PERIOD_DAYS", value = "2" },
    { name = "SENTRY_SECRET_KEY", value = "${local.secrets_name_prefix}/sentry_config" },
  ]
}

module "apps_etl_manager_batch_role" {
  source              = "../../../modules/iam/roles/ecs_task_role"
  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "apps_etl_manager_batch_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Apps ETL",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_APPE_LMB"
    }
  )
  policies_list = [
    module.iam_map.s3_env_ro.arn,
    module.iam_map.db_rw.arn,
    module.iam_map.sf_execute.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
  ]
}

module "appsEtlPrefillFlow_role" {
  source      = "../../../modules/iam/roles/stepfunction_role"
  name_prefix = local.name_prefix
  name        = "appsEtlPrefillFlow_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Apps ETL",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_APPE_LMB"
    }
  )
  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" "appsEtlPrefillFlow" {
  name       = "${local.name_prefix}-appsEtlPrefillFlow"
  role_arn   = module.appsEtlPrefillFlow_role.role.arn
  definition = <<EOF
{
  "StartAt": "Placeholder",
  "States": {
    "Placeholder": {
      "Type": "Pass",
      "End": true
    }
  }
}
EOF
  tags = merge(
    local.common_tags,
    {
      project                  = "Apps ETL",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_APPE_LMB"
    }
  )
  lifecycle {
    ignore_changes = [definition]
  }
}
