data "aws_s3_bucket" "exploration" {
  bucket = "${local.name_prefix}-exploration"
}

resource "aws_s3_bucket_notification" "exploration_bucket_notifications" {
  bucket = data.aws_s3_bucket.exploration.id

  queue {
    queue_arn = var.snowflake_sqs_arn
    events    = ["s3:ObjectCreated:*"]
  }
}

resource "aws_sqs_queue" "exploration-split-notification-dlq" {
  name                       = "${local.name_prefix}-exploration-split-notification-dlq"
  visibility_timeout_seconds = 120
  kms_master_key_id          = data.aws_kms_key.default_sqs_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Exploration Area",
      service                  = "SQS",
      plat_env_project_service = "${local.aggregated_tag}_EXP_SQS"
    }
  )
}

resource "aws_sqs_queue" "exploration-split-notification" {
  name                       = "${local.name_prefix}-exploration-split-notification"
  visibility_timeout_seconds = 1200
  message_retention_seconds  = 345600
  kms_master_key_id          = data.aws_kms_key.default_sqs_key.id
  redrive_policy             = "{\"deadLetterTargetArn\":\"${aws_sqs_queue.exploration-split-notification-dlq.arn}\",\"maxReceiveCount\":50}"

  tags = merge(
    local.common_tags,
    {
      project                  = "Exploration Area",
      service                  = "SQS",
      plat_env_project_service = "${local.aggregated_tag}_EXP_SQS"
    }
  )
}

module "snowflake_role" {
  source             = "../../../modules/iam/roles/client_role"
  name               = "${local.name_prefix}-snowflake_role"
  client_account_id  = var.snowflake_aws_account_id
  client_iam_entity  = var.snowflake_aws_account_user
  client_external_id = var.snowflake_aws_external_id
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Exploration Area",
      service                  = "IAM",
      plat_env_project_service = "${local.aggregated_tag}_EXP_IAM"
    }
  )
  policies_list = [
    module.iam_map.sns_subscribe.arn,
    module.iam_map.s3_env_rw.arn,
    module.iam_map.s3_sme_data_ro.arn,
  ]
}

module "explorationFlow_role" {
  //New name explorationFlow_role
  source      = "../../../modules/iam/roles/stepfunction_role"
  name_prefix = local.name_prefix
  name        = "explorationFlow_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,
    data.aws_iam_policy.secrets-services-ro.arn,
  ]
}

resource "aws_sfn_state_machine" "explorationFlow" {
  // New name: explorationFlow
  name       = "${local.name_prefix}-explorationFlow"
  role_arn   = module.explorationFlow_role.role.arn
  definition = <<EOF
{
  "StartAt": "Placeholder",
  "States": {
    "Placeholder": {
      "Type": "Pass",
      "End": true
    }
  }
}
EOF
  tags = merge(
    local.common_tags,
    {
      project                  = "Exploration Area",
      service                  = "Step Functions",
      plat_env_project_service = "${local.aggregated_tag}_EXP_SFU"
    }
  )
  lifecycle {
    ignore_changes = [definition]
  }
}

module "exp_manager_lambda_role" {
  //New name: exp_manager_lambda_role
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "exp_manager_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.sf_execute.arn,
    data.aws_iam_policy.logging.arn,
    data.aws_iam_policy.secrets-services-ro.arn,
    module.iam_map.s3_env_ro.arn,
    module.iam_map.db_rw.arn,
    module.iam_map.s3_sme_data_ro.arn,
    module.s3_bulk_crossenv_ro_policy.policy.arn,
    module.iam_map.sqs_consumer.arn,
  ]

  allow_execution_inside_vpc = true
}

module "exp_archive_lambda_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "exp_archive_lambda_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.s3_env_rw.arn,
    module.iam_map.s3_sme_data_rw.arn,
    module.iam_map.db_rw.arn,
  ]
  allow_execution_inside_vpc = true
}

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

  allow_execution_inside_vpc = true
}

module "exp_dbx_runner_lambda_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "exp_dbx_runner_lambda_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,
  ]

  allow_execution_inside_vpc = true
}

module "exp_dbx_status_checker_lambda_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "exp_dbx_status_checker_lambda_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,
  ]
  allow_execution_inside_vpc = true
}

module "exp_results_process_lambda_role" {
  source      = "../../../modules/iam/roles/lambda_role"
  name_prefix = local.name_prefix
  name        = "exp_results_process_lambda_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,
  ]

  allow_execution_inside_vpc = true
}
