module "default_policy_template" {
  source = "../../../modules/s3/bucket_policies/default_policy_template"
}

resource "aws_s3_bucket" "sme-stream-reports" {
  bucket = "${local.env_prefix}-sme-stream-reports"

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

resource "aws_s3_bucket_accelerate_configuration" "sme-stream-reports" {
  bucket = aws_s3_bucket.sme-stream-reports.id
  status = "Enabled"
}

resource "aws_s3_bucket_logging" "sme-stream-reports" {
  bucket        = aws_s3_bucket.sme-stream-reports.id
  target_bucket = data.aws_s3_bucket.logs.id
  target_prefix = "s3/${local.name_prefix}/sme-stream-report/"
}

resource "aws_s3_bucket_server_side_encryption_configuration" "sme-stream-reports" {
  bucket = aws_s3_bucket.sme-stream-reports.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

resource "aws_s3_bucket_ownership_controls" "sme-stream-reports" {
  bucket = aws_s3_bucket.sme-stream-reports.id

  rule {
    object_ownership = "BucketOwnerEnforced"
  }
}

resource "aws_s3_bucket" "sme-aggregated-stream-reports" {
  bucket = "${local.env_prefix}-sme-aggregated-stream-reports"

  tags = merge(
    local.common_tags,
    {
      "Name"                   = format("%v-sme-aggregated-stream-reports", local.env_prefix),
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

resource "aws_s3_bucket_accelerate_configuration" "sme-aggregated-stream-reports" {
  bucket = aws_s3_bucket.sme-aggregated-stream-reports.id
  status = "Enabled"
}

resource "aws_s3_bucket_logging" "sme-aggregated-stream-reports" {
  bucket        = aws_s3_bucket.sme-aggregated-stream-reports.id
  target_bucket = data.aws_s3_bucket.logs.id
  target_prefix = "s3/${local.name_prefix}/sme-aggregated-stream-reports/"
}

resource "aws_s3_bucket_server_side_encryption_configuration" "sme-aggregated-stream-reports" {
  bucket = aws_s3_bucket.sme-aggregated-stream-reports.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

resource "aws_s3_bucket_lifecycle_configuration" "sme-aggregated-stream-reports" {
  bucket = aws_s3_bucket.sme-aggregated-stream-reports.id

  rule {
    abort_incomplete_multipart_upload {
      days_after_initiation = 7
    }
    id     = "Expire in 90 days"
    status = "Enabled"
    expiration {
      days                         = 90
      expired_object_delete_marker = false
    }
    noncurrent_version_expiration {
      noncurrent_days = 90
    }
  }
}

resource "aws_s3_bucket_ownership_controls" "sme-aggregated-stream-reports" {
  bucket = aws_s3_bucket.sme-aggregated-stream-reports.id

  rule {
    object_ownership = "BucketOwnerEnforced"
  }
}

resource "aws_s3_bucket" "filtr-apple-music-reports" {
  bucket = "${local.env_prefix}-filtr-apple-music-reports"

  tags = merge(
    local.common_tags,
    {
      "Name"                   = format("%v-filtr-apple-music-reports", local.env_prefix),
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}

resource "aws_s3_bucket_accelerate_configuration" "filtr-apple-music-reports" {
  bucket = aws_s3_bucket.filtr-apple-music-reports.id
  status = "Enabled"
}

resource "aws_s3_bucket_logging" "filtr-apple-music-reports" {
  bucket        = aws_s3_bucket.filtr-apple-music-reports.id
  target_bucket = data.aws_s3_bucket.logs.id
  target_prefix = "s3/${local.name_prefix}/filtr-apple-music-reports/"
}

resource "aws_s3_bucket_server_side_encryption_configuration" "filtr-apple-music-reports" {
  bucket = aws_s3_bucket.filtr-apple-music-reports.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

resource "aws_s3_bucket_policy" "filtr-apple-music-reports" {
  bucket = aws_s3_bucket.filtr-apple-music-reports.id
  policy = replace(
    module.default_policy_template.document.json,
    module.default_policy_template.bucket_arn,
    aws_s3_bucket.filtr-apple-music-reports.arn,
  )
}

resource "aws_s3_bucket_ownership_controls" "filtr-apple-music-reports" {
  bucket = aws_s3_bucket.filtr-apple-music-reports.id

  rule {
    object_ownership = "BucketOwnerEnforced"
  }
}

/*
resource "aws_s3_bucket" "filtr-spotify-analytics" {
  bucket              = "${local.env_prefix}-filtr-spotify-analytics"
  acl                 = "private"
  acceleration_status = "Enabled"

  logging {
    target_bucket = data.aws_s3_bucket.logs.id
    target_prefix = "s3/${local.name_prefix}/filtr-spotify-analytics/"
  }

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }

  tags = merge(
    local.common_tags,
    {
      "Name"                   = format("%v-filtr-spotify-analytics", local.env_prefix),
      project                  = "Data",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_DATA_S3"
    }
  )
}
*/
resource "aws_s3_bucket" "lambda_artifacts" {
  bucket = "${local.name_prefix}-lambda-artifacts"

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

resource "aws_s3_bucket_logging" "lambda_artifacts" {
  bucket        = aws_s3_bucket.lambda_artifacts.id
  target_bucket = data.aws_s3_bucket.logs.id
  target_prefix = "s3/${local.name_prefix}/lambda_artifacts/"
}

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

resource "aws_s3_bucket_policy" "lambda_artifacts" {
  bucket = aws_s3_bucket.lambda_artifacts.id
  policy = replace(
    module.default_policy_template.document.json,
    module.default_policy_template.bucket_arn,
    aws_s3_bucket.lambda_artifacts.arn,
  )
}

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

  rule {
    object_ownership = "BucketOwnerEnforced"
  }
}

resource "aws_s3_bucket_public_access_block" "lambda_artifacts" {
  bucket = aws_s3_bucket.lambda_artifacts.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

# we'll store log id (offset) in S3 bucket
module "s3_auth0_log_ids_bucket" {
  source             = "../../../modules/s3/private_bucket_with_logs_aes256_v2"
  bucket_name        = "${local.name_prefix}-auth0-log-ids"
  logs_bucket_id     = data.aws_s3_bucket.logs.id
  logs_object_prefix = "${local.name_prefix}/auth0-log-ids/"
  default_policy     = true

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

module "track_playlist_history_bucket" {
  source             = "../../../modules/s3/private_bucket_with_logs_aes256_v2"
  bucket_name        = "${local.name_prefix}-track-playlist-history"
  logs_bucket_id     = data.aws_s3_bucket.logs.id
  logs_object_prefix = "${local.name_prefix}/track-playlist-history/"
  default_policy     = true

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

module "export_playlists_daily_bucket" {
  source             = "../../../modules/s3/private_bucket_with_logs_aes256_v2"
  bucket_name        = "${local.name_prefix}-export-playlists-daily"
  logs_bucket_id     = data.aws_s3_bucket.logs.id
  logs_object_prefix = "${local.name_prefix}/export-playlists-daily/"
  default_policy     = false
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "S3",
      plat_env_project_service = "${local.aggregated_tag}_PRL_S3"
    }
  )
}

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

  bucket_name        = "${local.name_prefix}-hot-hits-history"
  logs_bucket_id     = data.aws_s3_bucket.logs.id
  logs_object_prefix = "${local.name_prefix}/hot-hits-history/"
  default_policy     = true

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

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

  bucket_name        = "${local.name_prefix}-update-playlist-digest"
  logs_bucket_id     = data.aws_s3_bucket.logs.id
  logs_object_prefix = "${local.name_prefix}/update-playlist-digest/"
  default_policy     = true

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

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

  bucket_name        = "${local.name_prefix}-load-playlists-tracks-history"
  logs_bucket_id     = data.aws_s3_bucket.logs.id
  logs_object_prefix = "${local.name_prefix}/load-playlists-tracks-history/"
  default_policy     = false

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

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

  full_access_arns = [
    "arn:aws:iam::${module.aws_account_list.accounts["gdb-apollo-dev"]}:role/${local.name_prefix}-aggregate-and-copy-data-from-snowflake-to-mysql_role",
    "arn:aws:iam::${module.aws_account_list.accounts["gdb-delphi-prod"]}:role/prod-delphi-apollo_snowflake_role",
  ]

  bucket_list = [
    module.load_playlists_tracks_history_bucket.bucket.id
  ]
}

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

  full_access_arns = [
    "arn:aws:iam::${module.aws_account_list.accounts["gdb-apollo-dev"]}:role/${local.name_prefix}-etl_s3_rw_ecs_role",
  ]

  bucket_list = [
    aws_s3_bucket.sme-aggregated-stream-reports.id,
    aws_s3_bucket.sme-stream-reports.id,
    module.export_playlists_daily_bucket.bucket.id,
    "dev-sony-editorialimages",
  ]
}

#module "etl_bucket_policies_prod" {
#  source = "../../../modules/s3/bucket_policies/external_access_multibucket"
#
#  read_arns = [
#    "arn:aws:iam::${module.aws_account_list.accounts["gdb-apollo-prod"]}:role/prod-apollo-etl_s3_rw_ecs_role",
#  ]
#
#  bucket_list = [
#    "filtr-new-releases",
#    "filtr-new-releases-upc",
#    "filtr-spotify-browse-export",
#    "sme-aggregated-stream-reports",
#    "sme-spotify-top-reports",
#    "sme-stream-reports",
#    "sony-editorialimages",
#    module.export_playlists_daily_bucket.bucket.id,
#  ]
#}
