locals {
  slz_tags = merge(local.common_tags, tomap({ "project" = "SLZ" }))
}

resource "aws_sfn_state_machine" "slz_state_machine" {
  name       = "${local.name_prefix}-slzMainFlow"
  role_arn   = module.slz_stepfunction_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_sns_topic" "slz_reprocessing_topic" {
  name              = "${local.name_prefix}-slz-reprocessing_topic"
  display_name      = "SLZ Reprocesiing Topic"
  kms_master_key_id = data.aws_kms_key.default_sns_key.id
  tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "SNS",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_SNS"
    }
  )
}

resource "aws_sns_topic" "slz_completeness_topic" {
  name              = "${local.name_prefix}-slz-completeness_topic"
  display_name      = "SLZ Completness Topic"
  kms_master_key_id = data.aws_kms_key.default_sns_key.id
  tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion",
      service                  = "SNS",
      plat_env_project_service = "${local.aggregated_tag}_SLZI_SNS"
    }
  )
}

module "slz_generic_lambda_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz-generic_lambda_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_ro.arn,
    data.aws_iam_policy.logging.arn
  ]
}

module "slz_job_manager_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_job_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.s3_env_ro.arn,
    module.iam_map.sf_execute.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.batch_jobs_sync.arn,
    module.iam_map.sns_publish.arn,
    module.iam_map.db_rw.arn,
    module.iam_map.lambda_xray.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_job_executor_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_job_executor_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_ro.arn,
    module.iam_map.sf_execute.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.batch_jobs_sync.arn,
    module.iam_map.sns_publish.arn,
    module.iam_map.db_rw.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_house_keeper_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_house_keeper_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_ro.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.db_rw.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_stepfunction_role" {
  source      = "../../../modules/iam/roles/stepfunction_role"
  name_prefix = local.name_prefix
  name        = "slz_stepfunction_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,
    module.iam_map.sns_publish.arn,
    module.iam_map.sns_subscribe.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.run_ecs_task.arn,
  ]
}

module "slz_check_complete_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_check_complete_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_ro.arn,
    module.iam_map.sns_publish.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.db_rw.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_content_status_table_cleanup_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_content_status_table_cleanup_role"
  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,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.db_rw.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_uow_reset_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_uow_reset_role"
  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,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.db_rw.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_clean_up_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_cleanup_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,
    module.iam_map.sf_stop.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.db_rw.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_availability_check_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz-availability-check-role"
  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.secrets-services-ro.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.s3_env_ro.arn,
    module.iam_map.s3_sme_data_ro.arn,
    module.iam_map.db_rw.arn,
    module.iam_map.assume_isnt_role.arn,
    module.iam_map.s3_linkfire_ro.arn,
    data.aws_iam_policy.ddex_feed_ro_policy.arn,
    module.iam_map.s3_prod_orcd_ftp_ro.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_prepare_configuration_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz-prepare-configuration-role"
  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.secrets-services-ro.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.s3_env_rw.arn,
    module.iam_map.db_ro.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_uow_monitoring_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz-uow-monitoring-role"
  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.secrets-services-ro.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.s3_env_ro.arn,
    module.iam_map.s3_sme_data_ro.arn,
    module.iam_map.db_ro.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_dbx_job_runner_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "slz_dbx_job_runner_role"
  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.secrets-services-ro.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.s3_env_ro.arn,
    module.iam_map.s3_sme_data_ro.arn,
  ]

  allow_execution_inside_vpc = true
}

module "data_completeness_updater_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "data_completeness_updater_role"
  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.secrets-services-ro.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.db_rw.arn,
    module.iam_map.main_db_rw.arn,
  ]

  allow_execution_inside_vpc = true
}

module "slz_flow_config" {
  source = "../../modules/sf_flow_config"
  bucket = data.aws_s3_bucket.delphi-configs.bucket
  config = "slz-flow.json"
  args = {
    "standard"                      = aws_sfn_state_machine.slz_state_machine.arn,
    "apollo_api_flow"               = aws_sfn_state_machine.slzApolloApiFlow.arn,
    "gdpr_appreciationengine_email" = aws_sfn_state_machine.slzGdprAeEmailFlow.arn,
    "appreciationengine_flow"       = aws_sfn_state_machine.slzAppreciationEngineFlow.arn,
    "ddex_release_flow"             = aws_sfn_state_machine.slzDdexReleaseFlow.arn,
    "spotify_charts_flow"           = aws_sfn_state_machine.slzSpotifyChartsFlow.arn,
    "apple_music_charts_flow"       = aws_sfn_state_machine.slzAppleMusicChartsFlow.arn,
    "dapd_apollo_sync_flow"         = module.dapd_apollo_sync_flow.sf_arn,
  }
}
