# Terraform backends cannot contain interpolations
terraform {
  backend "s3" {
    bucket  = "orcd-terraform-state"
    key     = "qa/kafka-infra/kafka-cluster/topics/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }

  required_providers {
    kafka = {
      source  = "mongey/kafka"
      version = ">= 0.2.10"
    }
  }
}

provider "kafka" {
  bootstrap_servers = var.bootstrap_servers
  tls_enabled       = true
}

resource "kafka_topic" "cdc_analytics_participants_streams_v02" {
  name               = "cdc.analytics.participantsStreams.v02"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "max.message.bytes" = "15728640"
    "retention.ms"      = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "cdc_analytics_sound_recordings_streams_v02" {
  name               = "cdc.analytics.soundRecordingsStreams.v02"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "max.message.bytes" = "15728640"
    "retention.ms"      = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_music_event_social_media" {
  name               = "event.musicEvent.socialMedia"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "max.message.bytes" = "15728640"
    "retention.ms"      = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_publishing_fileingestion" {
  name               = "event.publishing.fileIngestion"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "max.message.bytes" = "15728640"
    "retention.ms"      = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_snowflake_newmusicfriday_newtrack" {
  name               = "event.snowflake.newmusicfriday.newtrack"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_snowflake_globalsoundrecording_releasedate" {
  name               = "event.snowflake.globalsoundrecording.releasedate"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "dlq_event_snowflake_globalsoundrecording_releasedate" {
  name               = "dlq.event.snowflake.globalsoundrecording.releasedate"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "-1"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_snowflake_released_content" {
  name               = "event.snowflake.releasedContent"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_snowflake_spotify_artist_label_participant_ai_matching" {
  name               = "event.snowflake.spotifyArtistLabelParticipantAIMatching"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "dlq_event_snowflake_released_content" {
  name               = "dlq.event.snowflake.releasedContent"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "-1"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "dlq_event_snowflake_spotify_artist_label_participant_ai_matching" {
  name               = "dlq.event.snowflake.spotifyArtistLabelParticipantAIMatching"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_orchardSoundRecording_delivery" {
  name               = "event.orchardSoundRecording.delivery"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "max.message.bytes" = "15728640"
    "retention.ms"      = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_ows_product_digital_product" {
  name               = "event.owsProductDigital.product"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_nr_fileingestion" {
  name               = "event.nr.fileIngestion"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "max.message.bytes" = "15728640"
    "retention.ms"      = "1296000000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_ows_assets_asset_final" {
  name               = "stream.owsAssets.assetFinal"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "cleanup.policy" = "compact"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_ows_assets_asset_upload" {
  name               = "stream.owsAssets.assetUpload"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "cleanup.policy" = "compact"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "table_owsassets_assets" {
  name               = "table.owsassets.assets"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "cleanup.policy" = "compact"
    "retention.ms"   = "-1"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "table_owsassets_assets_dlq" {
  name               = "dlq.owsAssets.neo4jSink.orchardAsset"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "cleanup.policy" = "delete"
    "retention.ms"   = "1"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_globalParticipant_elasticSearch_dbtAnalytics_split_v04" {
  name               = "stream.globalParticipant.elasticSearch.dbtAnalytics.split.v04"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms"      = "8200000"
    "max.message.bytes" = "15728640"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_globalParticipant_elasticSearch_dbtAnalytics_partitioned_v04" {
  name               = "stream.globalParticipant.elasticSearch.dbtAnalytics.partitioned.v04"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "max.message.bytes"     = "15728640"
    "cleanup.policy"        = "compact"
    "delete.retention.ms"   = "2419200000" # 4 weeks
    "min.compaction.lag.ms" = "604800000"  # 1 week
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_globalSoundRecording_elasticSearch_dbtAnalytics_split_v04" {
  name               = "stream.globalSoundRecording.elasticSearch.dbtAnalytics.split.v04"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "8200000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_globalSoundRecording_elasticSearch_dbtAnalytics_partitioned_v04" {
  name               = "stream.globalSoundRecording.elasticSearch.dbtAnalytics.partitioned.v04"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "cleanup.policy"        = "compact"
    "delete.retention.ms"   = "2419200000" # 4 weeks
    "min.compaction.lag.ms" = "604800000"  # 1 week
    "min.insync.replicas" = "2"
  }
}

# GraphQL Subscription Producer Topics
resource "kafka_topic" "graphql_subscription_abacus_account_payee_payoneer_status_updated" {
  name               = "graphql.subscription.abacusAccountPayeePayoneerStatusUpdated"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_payee_payoneer_released" {
  name               = "graphql.subscription.abacusAccountPayeePayoneerReleased"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "1800000" # fix for overload QA ows-payee, rollback value: 86400000
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_payee_payoneer_details_changed" {
  name               = "graphql.subscription.abacusAccountPayeePayoneerDetailsChanged"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_payee_payoneer_bank_details_changed" {
  name               = "graphql.subscription.abacusAccountPayeePayoneerBankDetailsChanged"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_payee_vat_info_saved" {
  name               = "graphql.subscription.abacusAccountPayeeVATInfoSaved"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "1800000" # fix for overload QA ows-payee, rollback value: 86400000
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_payee_payoneer_wform_collected" {
  name               = "graphql.subscription.abacusAccountPayeePayoneerWFormCollected"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "1800000" # fix for overload QA ows-payee, rollback value: 86400000
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_tax_info_updated" {
  name               = "graphql.subscription.abacusAccountTaxInfoUpdated"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "1800000" # fix for overload QA ows-payee, rollback value: 86400000
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_payee_resunc_eligibility" {
  name               = "graphql.subscription.abacusAccountPayeeResyncEligibility"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "1800000" # fix for overload QA ows-payee, rollback value: 86400000
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "graphql_subscription_abacus_account_payee_resync_payment_readiness" {
  name               = "graphql.subscription.abacusAccountPayeeResyncPaymentReadiness"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "1800000" # fix for overload QA ows-payee, rollback value: 86400000
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "cdc_store_api_request_spotify" {
  name               = "cdc.storeAPIRequest.spotify"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_store_api_request_spotify_split" {
  name               = "stream.storeAPIRequest.spotify.split"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_spotify_api_album_search_by_upc" {
  name               = "event.spotifyapi.album"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_spotify_api_album_artist" {
  name               = "event.spotifyapi.album.artist"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_spotify_api_track_artist" {
  name               = "event.spotifyapi.track.artist"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_spotify_api_track" {
  name               = "event.spotifyapi.track"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_spotify_api_audio_features" {
  name               = "event.spotifyapi.audioFeatures"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "dlq_spotifyapi_neo4j_sink" {
  name               = "dlq.spotifyapi.neo4jSink"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "cleanup.policy" = "delete"
    "retention.ms"   = "604800000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "cdc_store_api_request_apple_music" {
  name               = "cdc.storeAPIRequest.appleMusic"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_store_api_request_apple_music_split" {
  name               = "stream.storeAPIRequest.appleMusic.split"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_apple_music_api_album_artist" {
  name               = "event.applemusicapi.album.artist"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_asset_mezzanine_audio_flac" {
  name               = "stream.asset.mezzanine.audio.flac"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "604800000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_asset_mezzanine_coverart" {
  name               = "stream.asset.mezzanine.coverart"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "cleanup.policy" = "delete"
    "retention.ms" = "604800000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "stream_acoustic_brainz_audio_features" {
  name               = "stream.acousticBrainz.audioFeatures"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}


resource "kafka_topic" "event_sme_analytics_account_creation" {
  name               = "event.smeAnalyticsAccountCreation"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "dlq_snowflake_sink_no_gsr" {
  name               = "dlq.snowflakeSink.noGSR"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "cleanup.policy" = "delete"
    "retention.ms"   = "-1"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "dlq_snowflake_sink_gsr" {
  name               = "dlq.snowflakeSink.GSR"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "cleanup.policy" = "delete"
    "retention.ms"   = "-1"
    "min.insync.replicas" = "2"
  }
}

# partial product documents for use in migrated product search
# produced from cdc.artRelations.releases
resource "kafka_topic" "stream_artRelations_release_es" {
  name               = "stream.artRelations.release.es"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 1
  config = {
    "max.message.bytes" = "15728640"
    "retention.ms"      = "86400000"
    "cleanup.policy"    = "delete"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "event_payee_program_move" {
  name               = "event.payee.programMove"
  replication_factor = var.kafka_minimum_replication_factor
  partitions         = 3
  config = {
    "retention.ms" = "86400000"
    "min.insync.replicas" = "2"
  }
}

resource "kafka_topic" "cdc_dynamodb_masters_active" {
  name                = "cdc.dynamodb.masters_active"
  replication_factor = var.kafka_minimum_replication_factor
  partitions          = 1
  config = {
    "max.message.bytes" = "15728640"
    "min.insync.replicas" = "2"
  }
}

