module "jobs_responses_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-jobs-responses"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/jobs-responses/"

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

module "filtr_spotify_browse_export_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.env_prefix}-filtr-spotify-browse-export"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/filtr-spotify-browse-export/"

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

module "data_dumps_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-data-dumps"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/data-dumps/"

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

module "filtrmoodagent_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.env_prefix}-filtrmoodagent"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/filtrmoodagent/"

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

module "external_access_bucket_policies" {
  source = "../../../modules/s3/bucket_policies/external_access_multibucket"

  full_access_arns = [local.delphi_dev_root_arn]
  bucket_list = [
    module.jobs_responses_bucket.bucket.id,
    module.filtr_spotify_browse_export_bucket.bucket.id,
    module.data_dumps_bucket.bucket.id,
    module.filtrmoodagent_bucket.bucket.id,
    module.filtr_new_releases.bucket.id,
    module.filtr_new_releases_upc.bucket.id,
  ]
}

module "s3-spotify_charts" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-spotify-charts"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/spotify-charts/"
  default_policy     = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

module "filtr_new_releases" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.env_prefix}-filtr-new-releases"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/filtr-new-releases/"

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

module "filtr_new_releases_upc" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.env_prefix}-filtr-new-releases-upc"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/filtr-new-releases-upc/"

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

module "apollo_go_mobile_artifacts_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-go-mobile-artifacts"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/go-mobile-artifacts/"
  deep_archive_days  = 180
  default_policy     = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

// We have to use dev-apollo-new prefix because bucket without -new prefix already exists
module "lambda_artifacts_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-new-lambda-artifacts"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/lambda_artifacts/"
  default_policy     = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_S3"
    }
  )
}

module "vendor_image_caching_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-vendor-image-caching"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/vendor-image-caching/"
  expiration_days    = 2

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_PRL_S3"
    }
  )
}

module "admin_panel_assets" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-admin-panel-assets"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/admin-panel-assets/"
  ignore_public_acls = false
  block_public_acls  = false
  default_policy     = true
  object_ownership   = "BucketOwnerPreferred"


  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_PRL_S3"
    }
  )
}

module "apollo_notifications_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-notifications"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/notifications/"
  default_policy     = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_PRL_S3"
    }
  )
}

resource "aws_s3_bucket" "apollo_go_swagger" {
  bucket        = "${local.env_prefix}-insights-swagger.apollo.stream"
  force_destroy = true

  tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_PRL_S3"
    }
  )
}

resource "aws_s3_bucket_logging" "apollo_go_swagger" {
  bucket        = aws_s3_bucket.apollo_go_swagger.bucket
  target_bucket = data.aws_s3_bucket.security_logs.id
  target_prefix = "s3/${local.name_prefix}/insights-swagger.apollo.stream/"
}

resource "aws_s3_bucket_website_configuration" "apollo_go_swagger" {
  bucket = aws_s3_bucket.apollo_go_swagger.bucket

  index_document {
    suffix = "swagger.html"
  }

  error_document {
    key = "swagger.html"
  }
}

resource "aws_s3_bucket_server_side_encryption_configuration" "apollo_go_swagger" {
  bucket = aws_s3_bucket.apollo_go_swagger.bucket
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

resource "aws_s3_bucket_ownership_controls" "apollo_go_swagger" {
  bucket = aws_s3_bucket.apollo_go_swagger.id

  rule {
    object_ownership = "BucketOwnerEnforced"
  }
}

module "default_bucket_policy" {
  source              = "../../../modules/s3/bucket_policies/default_policy_template"
  template_bucket_arn = aws_s3_bucket.apollo_go_swagger.arn
}

data "aws_iam_policy_document" "apollo_go_swagger_policy_document" {
  version                 = "2012-10-17"
  policy_id               = "CloudFrontRO"
  source_policy_documents = [module.default_bucket_policy.document.json]

  statement {
    sid       = "CloudFrontRO"
    effect    = "Allow"
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.apollo_go_swagger.arn}/*"]

    principals {
      identifiers = [aws_cloudfront_origin_access_identity.apollo_go_swagger_identity.iam_arn]
      type        = "AWS"
    }
  }
}

resource "aws_s3_bucket_policy" "apollo_go_swagger_policy" {
  bucket = aws_s3_bucket.apollo_go_swagger.id
  policy = data.aws_iam_policy_document.apollo_go_swagger_policy_document.json
}

module "auth0_log_offset_bucket" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-auth0-log-offset"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/auth0-log-offset/"
  default_policy     = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_PRL_S3"
    }
  )
}

module "s3_athena_output" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-athena-output"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/athena-output/"
  default_policy     = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_S3"
    }
  )
}

module "s3_load_testing_config" {
  source = "../../../modules/s3/private_bucket_with_logs_aes256_v2"

  bucket_name        = "${local.name_prefix}-load-testing-config"
  logs_bucket_id     = data.aws_s3_bucket.security_logs.id
  logs_object_prefix = "${local.name_prefix}/load-testing-config/"
  default_policy     = true
  versioning         = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_S3"
    }
  )
}
