terraform {
  backend "s3" {
    bucket                  = "dev-dna-tfstate"
    key                     = "Delphi/Common/main.tfstate"
    region                  = "us-east-1"
    shared_credentials_file = "~/.aws/credentials"
    profile                 = "gdb-delphi-dev"
    dynamodb_table          = "terraform-state-lock-dynamodb"
  }
}

# Get current account ID and global accounts list
data "aws_caller_identity" "current" {}

module "aws_accounts_list" {
  source = "../../modules/iam/aws_accounts_list"
}

locals {
  region_zones = formatlist("%s-%s", var.gcp_region_id, ["a", "b", "c", "f"])
  project_id   = lower("delphi-common")

  # define AZ in region id
  availability_zones = formatlist("%v%v", var.aws_region_id, ["a", "b", "c"])
  name_prefix        = lower("${var.platform["prefix"]}-${var.platform["name"]}")
  env_prefix         = lower(var.platform["prefix"])
  account_id         = data.aws_caller_identity.current.account_id
  platform           = lower(var.platform["name"])
  aggregated_tag     = "${var.platform.short_platform_name}_${var.platform.prefix}"

  ro_accounts = [module.aws_accounts_list.accounts["gdb-delphi-prod"]]
  rw_accounts = [module.aws_accounts_list.accounts["gdb-delphi-prod"]]

  gcp_ro_members = [
    "serviceAccount:716045849926-compute@developer.gserviceaccount.com",
    "serviceAccount:468921537061-compute@developer.gserviceaccount.com"
  ]

  common_tags = {
    platform          = var.platform["name"]
    environment       = var.platform["environment"]
    platform_with_env = "${var.platform["name"]} ${var.platform["environment"]}"
    managed_by        = "Terraform"
  }

  slza_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ API"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_SLZA_ECR")
    }
  )
  slzi_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Ingestion"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_SLZI_ECR")
    }
  )
  appe_tags = merge(
    local.common_tags,
    {
      project                  = "Apps ETL"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_APPE_ECR")
    }
  )
  appa_tags = merge(
    local.common_tags,
    {
      project                  = "Apps API"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_APPA_ECR")
    }
  )
  setl_tags = merge(
    local.common_tags,
    {
      project                  = "Simple ETL"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_SETL_ECR")
    }
  )
  chmt_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetrics"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_CHMT_ECR")
    }
  )
  dcbl_tags = merge(
    local.common_tags,
    {
      project                  = "Decibel"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_DCBL_ECR")
    }
  )
  exp_tags = merge(
    local.common_tags,
    {
      project                  = "Exploration Area"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_EXP_ECR")
    }
  )
  pd_tags = merge(
    local.common_tags,
    {
      project                  = "Public Data"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_PD_ECR")
    }
  )
  infra_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure"
      service                  = "ECR"
      plat_env_project_service = upper("${local.aggregated_tag}_INFRA_ECR")
    }
  )
}

module "api-service" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/api-service"
  rw_accounts = local.rw_accounts
  common_tags = local.appa_tags
}

module "api-service-java" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/api-service-java"
  rw_accounts = local.rw_accounts
  common_tags = local.appa_tags
}

module "api-service-nginx-cache" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/api-service-nginx-cache"
  rw_accounts = local.rw_accounts
  common_tags = local.appa_tags
}

module "slack-notifications" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slack-notifications"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-availability-check" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-availability-check"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "slz-check-complete" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-check-complete"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-clean-up" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-clean-up"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-job-manager" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-job-manager"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-job-executor" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-job-executor"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-house-keeper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-house-keeper"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-meta-manager" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-meta-manager"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-prepare-configuration" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-prepare-configuration"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-uow-reset" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-uow-reset"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-gdpr-email-downloader" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-gdpr-email-downloader"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-gdpr-email-sender" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-gdpr-email-sender"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-gdpr-deletion-diff-sender" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-gdpr-deletion-diff-sender"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true
}

module "slz-url-to-s3" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-url-to-s3"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true
}

module "slz-decompressor" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-decompressor"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true
}

module "slz-validator" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-validator"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true
}

module "slz-spotify-partitions-wrapper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-spotify-partitions-wrapper"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true
}

module "slz-scheduler" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-scheduler"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-spotify-charts-scraper" {
  source      = "../../modules/ecr/repository_v2"
  repo_name   = "${local.platform}/lambda/slz-spotify-charts-scraper"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true

  replication_destination = {
    gdb-delphi-prod = {
      region                 = "us-east-1"
      destination_account_id = module.aws_accounts_list.accounts["gdb-delphi-prod"]
    }
  }

  providers = {
    aws        = aws
    aws.target = aws.gdb-delphi-prod
  }
}

module "slz-spotify-charts-data-extender" {
  source      = "../../modules/ecr/repository_v2"
  repo_name   = "${local.platform}/lambda/slz-spotify-charts-data-extender"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true

  replication_destination = {
    gdb-delphi-prod = {
      region                 = "us-east-1"
      destination_account_id = module.aws_accounts_list.accounts["gdb-delphi-prod"]
    }
  }

  providers = {
    aws        = aws
    aws.target = aws.gdb-delphi-prod
  }
}

module "slz-spotify-charts-clean-up" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-spotify-charts-clean-up"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-appreciationengine-scrapper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-appreciationengine-scrapper"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-appreciationengine-availability-check" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-appreciationengine-availability-check"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-appreciationengine-clean-up" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-appreciationengine-clean-up"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-appreciationengine-prepare-configuration" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-appreciationengine-prepare-configuration"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-amazon-music-scraper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-amazon-music-scraper"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-amazon-music-availability-check" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-amazon-music-availability-check"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-amazon-music-clean-up" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-amazon-music-clean-up"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-amazon-music-prepare-configuration" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-amazon-music-prepare-configuration"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-youtubereporting-scraper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-youtubereporting-scraper"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-youtubereporting-availability-check" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-youtubereporting-availability-check"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-youtubereporting-clean-up" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-youtubereporting-clean-up"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-youtubereporting-prepare-configuration" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-youtubereporting-prepare-configuration"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "migration-tool" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/migration-tool"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "s3-cleanup" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/s3-cleanup"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "cross-account-secret-sync" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/cross-account-secret-sync"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
  lambda      = true
}

module "lambda_daily_data_alert" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda-daily-data-alert"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true
}

module "slz-api-service" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-api-service"
  rw_accounts = local.rw_accounts
  common_tags = local.slza_tags
}

module "slz-apollo-delphi-migration" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-apollo-delphi-migration"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-downloader" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-downloader"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-hasher" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-hasher"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-secrets-manager-client" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-secrets-manager-client"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-backfill-lambda" {
  source      = "../../modules/ecr/repository_v4"
  repo_name   = "${local.platform}/backfill-lambda"
  lambda      = true
  rw_accounts = local.rw_accounts
  ro_accounts = local.ro_accounts
  common_tags = local.slzi_tags
}

module "dapd-apollo-sync-service-lambda" {
  source      = "../../modules/ecr/repository_v4"
  repo_name   = "${local.platform}/lambda/dapd-apollo-sync-service"
  lambda      = true
  rw_accounts = local.rw_accounts
  ro_accounts = local.ro_accounts
  common_tags = local.pd_tags
}

module "dapd-apollo-sync-service-batch" {
  source      = "../../modules/ecr/repository_v4"
  repo_name   = "${local.platform}/dapd-apollo-sync-service"
  lambda      = true
  rw_accounts = local.rw_accounts
  ro_accounts = local.ro_accounts
  common_tags = local.pd_tags
}

module "dapd-apollo-sync-finalizer-lambda" {
  source      = "../../modules/ecr/repository_v4"
  repo_name   = "${local.platform}/lambda/dapd-apollo-sync-finalizer"
  lambda      = true
  rw_accounts = local.rw_accounts
  ro_accounts = local.ro_accounts
  common_tags = local.pd_tags
}

module "uow-status-switcher" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/uow-status-switcher"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "sbt" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "sbt"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "sfpoc" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "sfpoc"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "slz" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "slz"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "slz-downloader-java-test" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "slz-downloader-java-test"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "slz-meta-status-reset" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-meta-status-reset"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-meta-retrigger" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-meta-retrigger"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "apps-etl-databricks" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/apps-etl-databricks"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "apps-etl-manager" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/apps-etl-manager"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "apps-etl-manager-batch" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/apps-etl-manager"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "apps-etl-set-uow-status" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/apps-etl-set-uow-status"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "apps-etl-runner" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/apps-etl-runner"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "simple-etl-databricks" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/simple-etl-databricks"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "simple-etl-manager" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/simple-etl-manager"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "simple-etl-set-uow-status" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/simple-etl-set-uow-status"
  rw_accounts = local.rw_accounts
  common_tags = local.appe_tags
}

module "slz-db-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-db-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "main-db-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/main-db-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.appa_tags
}

module "workflowdb-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/workflowdb-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "pd-etldb-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/pd-etldb-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "pd-apidb-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/pd-apidb-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "notification_service" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/notification-service"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "slz-uow-monitoring" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-uow-monitoring"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz-dbx-job-runner" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-dbx-job-runner"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "bulk-decompress-task" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/bulk-decompress-task"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "bulk-decompress-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/bulk-decompress-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "exp-dbx-status-checker-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/exp-dbx-status-checker-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.exp_tags
}

module "exp-sf-runner-lambda-role" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/exp-sf-runner-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.exp_tags
}

module "bulk-copy-task" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/bulk-copy-task"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "bulk-copy-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/bulk-copy-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "s3-parquet-transformer" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/s3-parquet-transformer"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "split-and-compress-task" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/split-and-compress-task"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "exp-manager-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/exp-manager-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.exp_tags
}

module "kinesis-firehose-processing" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-process-cfg"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-retrieval" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/chartmetric"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-data-check" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-data-checker"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-manager" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-manager"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-hist-manager" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-hist-manager"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-db-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/chartmetric-db-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-invoker" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-invoker"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-status" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-status"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-migrate" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-migrate"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-migrator" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/chartmetric-migrator"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-api-alerts" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-api-alerts"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-artist-alerts" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-artist-alerts"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "chartmetric-artist-mapping" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/chartmetric-artist-mapping"
  rw_accounts = local.rw_accounts
  common_tags = local.chmt_tags
}

module "bigtable-autoscaler" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/bigtable-autoscaler"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "bigtable-autoscaler-db-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/bigtable-autoscaler-db-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "apps-etl-prefill" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/apps-etl-prefill"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "exp-dbx-runner-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/exp-dbx-runner-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.exp_tags
}

module "exp-archive-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/exp-archive-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.exp_tags
}

module "exp-results-process-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/exp-results-process-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.exp_tags
}

module "slz-admin" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-admin"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "dapd-public-api-scraper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/dapd-public-api-scraper"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-api-scraper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/dapd-api-scraper"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-db-seed" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/dapd-db-seed"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-scheduler-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/dapd-scheduler-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-exporter" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/dapd-exporter"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-exporter-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/dapd-exporter-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-importer-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/dapd-importer-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-upserter-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/dapd-upserter-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-transformation-service" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/dapd-transformation-service"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dapd-exporter-api" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/dapd-exporter-api"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "data-completeness-updater" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/data-completeness-updater"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "delphi-x-ref" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/delphi-x-ref"
  rw_accounts = local.rw_accounts
  common_tags = local.dcbl_tags
}

module "delphi-snowflake-etl" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/delphi-snowflake-etl"
  rw_accounts = local.rw_accounts
  common_tags = local.dcbl_tags
}

module "s3-to-postgres" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/s3-to-postgres"
  rw_accounts = local.rw_accounts
  common_tags = local.dcbl_tags
}

module "snowflake-to-s3" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/snowflake-to-s3"
  rw_accounts = local.rw_accounts
  common_tags = local.dcbl_tags
}

module "update-status" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/update-status"
  rw_accounts = local.rw_accounts
  common_tags = local.dcbl_tags
}

module "kong" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/kong"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "ae-backfill" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/ae-backfill"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
  lambda      = true
}

module "generate-events" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/generate-events"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "master-data-db-schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/master-data-db-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.pd_tags
}

module "dae-s3-consumer-events-distribution-lambda" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/dae-s3-consumer-events-distribution-lambda"
  rw_accounts = local.rw_accounts
  common_tags = local.dcbl_tags
}

module "dae-apollo-api-scraper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/dae-apollo-api-scraper"
  rw_accounts = local.rw_accounts
  common_tags = local.dcbl_tags
}

module "slz_ddex_downloader" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-ddex-downloader"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "slz_ddex_housekeeping" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/slz-ddex-housekeeping"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "pgsync" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/pgsync"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "tiktok_chartmetrics_loader" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/tiktok-chartmetrics-loader"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "delphi_es_utils" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/lambda/delphi-es-utils"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "daily_data_alert" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/daily-data-alert"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "qa_automation" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/qa-automation"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

module "slz-apple-music-charts-data-processor" {
  source      = "../../modules/ecr/repository_v2"
  repo_name   = "${local.platform}/lambda/slz-apple-music-charts-data-processor"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true

  replication_destination = {
    gdb-delphi-prod = {
      region                 = "us-east-1"
      destination_account_id = module.aws_accounts_list.accounts["gdb-delphi-prod"]
    }
  }

  providers = {
    aws        = aws
    aws.target = aws.gdb-delphi-prod
  }
}

module "slz-apple-music-charts-pipeline-configurator" {
  source      = "../../modules/ecr/repository_v2"
  repo_name   = "${local.platform}/lambda/slz-apple-music-charts-pipeline-configurator"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
  lambda      = true

  replication_destination = {
    gdb-delphi-prod = {
      region                 = "us-east-1"
      destination_account_id = module.aws_accounts_list.accounts["gdb-delphi-prod"]
    }
  }

  providers = {
    aws        = aws
    aws.target = aws.gdb-delphi-prod
  }
}

module "slz-apple-music-charts-scrapper" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/slz-apple-music-charts-scrapper"
  rw_accounts = local.rw_accounts
  common_tags = local.slzi_tags
}

module "dh_data_health_agent" {
  source      = "../../modules/ecr/repository_v2"
  repo_name   = "${local.platform}/lambda/dh-data-health-agent"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
  lambda      = true

  replication_destination = {
    gdb-delphi-prod = {
      region                 = "us-east-1"
      destination_account_id = module.aws_accounts_list.accounts["gdb-delphi-prod"]
    }
  }

  providers = {
    aws        = aws
    aws.target = aws.gdb-delphi-prod
  }
}

module "data_health_schema" {
  source      = "../../modules/ecr/repository_v1"
  repo_name   = "${local.platform}/data-health-schema"
  rw_accounts = local.rw_accounts
  common_tags = local.infra_tags
}

# Linkfire temp replica
locals {
  linkfire_aws_id = "880172922216"
  linkfire_read_aws_acc_list = [
    "arn:aws:iam::${module.aws_accounts_list.accounts.gdb-delphi-prod}:root",
    "arn:aws:iam::${module.aws_accounts_list.accounts.gdb-databricks-dev}:root",
    "arn:aws:iam::${module.aws_accounts_list.accounts.gdb-databricks-prod}:root",
  ]
}

data "aws_s3_bucket" "logs" {
  bucket = "security-${local.account_id}-logs"
}

module "sme_linkfire_replica" {
  source             = "../../modules/s3/private_bucket_with_logs_aes256_v2"
  bucket_name        = "sme-linkfire-replica"
  logs_bucket_id     = data.aws_s3_bucket.logs.id
  logs_object_prefix = "sme-linkfire-replica/"
  versioning         = true
  common_tags = merge(
    local.common_tags,
    {
      project                  = "SLZ Data",
      service                  = "S3",
      plat_env_project_service = "DLP_CMN_SLZD_S3"
    }
  )
}

module "default_bucket_policy" {
  source              = "../../modules/s3/bucket_policies/default_policy_template"
  template_bucket_arn = module.sme_linkfire_replica.bucket.arn
}

data "aws_iam_policy_document" "sme_linkfire_replica" {
  source_policy_documents = [module.default_bucket_policy.document.json]
  statement {
    sid    = "1"
    effect = "Allow"
    actions = [
      "s3:GetBucketVersioning",
      "s3:PutBucketVersioning",
      "s3:ReplicateObject",
      "s3:ReplicateDelete",
      "s3:ObjectOwnerOverrideToBucketOwner"
    ]
    resources = [
      "${module.sme_linkfire_replica.bucket.arn}/*",
      module.sme_linkfire_replica.bucket.arn
    ]
    principals {
      type        = "AWS"
      identifiers = ["arn:aws:iam::${local.linkfire_aws_id}:root"]
    }
  }
  statement {
    sid    = "Explicit allow for external read"
    effect = "Allow"
    actions = [
      "s3:GetObject",
      "s3:ListBucket",
      "s3:GetObjectTagging",
      "s3:GetObjectVersion",
      "s3:GetObjectVersionTagging"
    ]
    resources = [
      "${module.sme_linkfire_replica.bucket.arn}/*",
      module.sme_linkfire_replica.bucket.arn
    ]
    principals {
      type        = "AWS"
      identifiers = local.linkfire_read_aws_acc_list
    }
  }
}

resource "aws_s3_bucket_policy" "sme_linkfire_replica" {
  bucket = module.sme_linkfire_replica.bucket.id
  policy = data.aws_iam_policy_document.sme_linkfire_replica.json
}

module "registry_replication_policy" {
  source = "../../modules/ecr/registry_policy"

  source_account_id = local.account_id
  target_account_id = module.aws_accounts_list.accounts["gdb-delphi-prod"]

  providers = {
    aws = aws.gdb-delphi-prod
  }
}

