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


module "default_tags" {
  source             = "git@github.com:theorchard/terraform-default-tags.git//?ref=1.0.0"
  environment        = var.environment
  application_family = var.application_family
  service_name       = local.service_name
}

provider "aws" {
  region = var.aws_region

  default_tags {
    tags = module.default_tags.tags
  }
}

data "aws_caller_identity" "current" {}

module "kafka_neo_sink_neo4j_v5_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//?ref=5.5.3"

  providers = {
    aws.dns = aws
  }

  environment                           = var.environment
  application_family                    = var.application_family
  additional_tags                       = var.additional_tags
  service_name                          = local.service_name
  non_ecr_image                         = "103233932089.dkr.ecr.us-east-1.amazonaws.com/kc-neo-cdc-sink-custom:latest"
  aws_region                            = var.aws_region
  service_platform_version              = "1.4.0"
  desired_task_count                    = 0
  minimum_capacity                      = 0
  maximum_capacity                      = 0
  task_cpu                              = 1024
  task_memory                           = 3072
  container_port                        = 8083
  health_check_grace_period_seconds     = 300
  blocking_waf_enabled                  = true
  health_check_path                     = "/connectors/${local.service_name}"
  web_service_health_check_command      = "[[ $(curl -s http://localhost:8083/connectors/${local.service_name}/status | jq -r '.tasks[].state' | sort | uniq) == 'RUNNING' ]] || exit 1"
  fargate_spot_capacity_provider_weight = 100
  task_placement_failure_alert_enabled  = true
  propagate_tags                        = true

  # datadog agent crashes due to OutOfMemoryError with JMX. So increase it from 256
  datadog_task_memory = 512
  vpc_id              = "vpc-34dbfd51"

  datadog_custom_image = "086679231553.dkr.ecr.${var.aws_region}.amazonaws.com/orchard-datadog-agent-jmx:latest"

  datadog_agent_environment_variables = [
    {
      JMX_PORT = "9095"
    },
    {
      DD_ENV = var.environment
    },
    {
      SERVICE_NAME = local.service_name
    },
    {
      CONNECTOR_TYPE = "default_sink"
    },
  ]

  environment_variables = [
    {
      Environment = var.environment
    },
    {
      CONNECT_GROUP_UNIQUE_IDENTIFIER = "${var.environment}-${local.service_name}"
    },
    {
      CONNECTOR_NAME = local.service_name
    },
    {
      SERVICE_NAME = local.service_name
    },
    {
      CONNECT_BOOTSTRAP_SERVERS = var.connect_bootstrap_servers
    },
    {
      NEO4J_SERVER_URI = "neo4j+s://dev-neo4j-5-cluster.dev.theorchard.io"
    },
    {
      MAX_TASKS = "1"
    },
    {
      NEO4J_BATCH_SIZE = "1000"
    },
    {
      NEO4J_BATCH_EXEC_TIMEOUT = "15m"
    },
    {
      OFFSET_FLUSH_TIMEOUT = "150000" # msec = 2.5 min
    },
    {
      NEO4J_RETRY_MAX_ATTEMPTS = "2"
    },
    {
      NEO4J_RETRY_TIME = "1m"
    },
    {
      SYNC_SCHEMA_TOPICS = join(",", [
        "cdc.musicGraph.acrid",
        "cdc.musicGraph.aggregatedParticipantSocialStat",
        "cdc.musicGraph.aggregatedSocialAccountStat",
        "cdc.musicGraph.companyBrand",
        "cdc.musicGraph.fingerprintRule",
        "cdc.musicGraph.globalParticipant",
        "cdc.musicGraph.globalSoundRecording",
        "cdc.musicGraph.identity",
        "cdc.musicGraph.labelParticipant",
        "cdc.musicGraph.labelSoundRecording",
        "cdc.musicGraph.orchardAsset",
        "cdc.musicGraph.orchardSoundRecording",
        "cdc.musicGraph.parentCompany",
        "cdc.musicGraph.participantIdentifier",
        "cdc.musicGraph.product",
        "cdc.musicGraph.profile",
        "cdc.musicGraph.project",
        "cdc.musicGraph.publicParticipant",
        "cdc.musicGraph.publicSoundRecording",
        "cdc.musicGraph.publishingAgreement",
        "cdc.musicGraph.publishingComposition",
        "cdc.musicGraph.publishingPublisher",
        "cdc.musicGraph.publishingSongWriter",
        "cdc.musicGraph.releaseArtist",
        "cdc.musicGraph.serviceTier",
        "cdc.musicGraph.subAccount",
        "cdc.musicGraph.track",
        "cdc.musicGraph.trackArtist",
        "cdc.musicGraph.trackWriter",
        "cdc.musicGraph.vendor",
        "cdc.musicGraph.video",
        # relations
        "cdc.musicGraph.belongsTo",
        "cdc.musicGraph.containsFingerprint",
        "cdc.musicGraph.contributedTo",
        "cdc.musicGraph.createdFrom",
        "cdc.musicGraph.deletedHasAccessTo",
        "cdc.musicGraph.deletedHasAdminAccessTo",
        "cdc.musicGraph.deletedHasFingerprintRule",
        "cdc.musicGraph.deletedHasProfile",
        "cdc.musicGraph.fingerprintedAs",
        "cdc.musicGraph.hasAccessTo",
        "cdc.musicGraph.hasAdminAccessTo",
        "cdc.musicGraph.hasAggregatedParticipantSocialStat",
        "cdc.musicGraph.hasAgreement",
        "cdc.musicGraph.hasAsset",
        "cdc.musicGraph.hasAutoFollowed",
        "cdc.musicGraph.hasComposition",
        "cdc.musicGraph.hasFeaturedArtist",
        "cdc.musicGraph.hasFingerprintRule",
        "cdc.musicGraph.hasLabel",
        "cdc.musicGraph.hasLabelParticipant",
        "cdc.musicGraph.hasPrimaryArtist",
        "cdc.musicGraph.hasProfile",
        "cdc.musicGraph.hasSignedWriter",
        "cdc.musicGraph.hasSoundRecording",
        "cdc.musicGraph.hasSourceArtist",
        "cdc.musicGraph.hasSubscription",
        "cdc.musicGraph.inServiceTier",
        "cdc.musicGraph.includes",
        "cdc.musicGraph.isPlacementOf",
        "cdc.musicGraph.mergedTo",
        "cdc.musicGraph.owns",
        "cdc.musicGraph.ownsProduct",
        "cdc.musicGraph.participatedIn",
        "cdc.musicGraph.represents",
      ])
    },
    {
      CONNECT_LOG4J_ROOT_LOGLEVEL = "ERROR"
    },
    {
      DLQ_TOPIC_NAME = "dlq.neo4jV5.sink"
    },
    {
      AWS_SECRETS_MANAGER = "true"
    },
    {
      AWS_REGION = var.aws_region
    },
    {
      DEBUG_MODE = "true"
    }
  ]
}

# This rule will allow kafka-connect tasks to communicate with each other in distributed mode
resource "aws_security_group_rule" "allow_intra_cluster_communication_neo4j_v5" {
  from_port         = 8083
  to_port           = 8083
  protocol          = "tcp"
  security_group_id = module.kafka_neo_sink_neo4j_v5_fargate_environment.fargate_security_group_id
  self              = true
  type              = "ingress"
}

module "service_credentials_secret" {
  source = "git@github.com:theorchard/terraform-secrets-manager.git//?ref=1.3.0"

  environment                    = var.environment
  application_family             = var.application_family
  additional_tags                = var.additional_tags
  service_name                   = local.service_name
  secret_name                    = "NEO4J_CREDENTIALS"
  secret_recovery_window_in_days = 7
}

module "fargate_service_dashboard_neo4j_v5" {
  source = "git@github.com:theorchard/terraform-datadog.git//modules/kafka_connector?ref=6.10.8"

  environment        = var.environment
  application_family = var.application_family
  additional_tags    = var.additional_tags
  service_name       = local.service_name
  connector_type     = "default_sink"

  environment_type = "fargate"

  notification_endpoints            = "@slack-kafka-data-highway-alerts"
  escalation_notification_endpoints = "@slack-data"
  healthy_tasks_monitor_enabled     = false
  monitor_kafka_topics = [
    "cdc.musicGraph.acrid",
    "cdc.musicGraph.aggregatedParticipantSocialStat",
    "cdc.musicGraph.aggregatedSocialAccountStat",
    "cdc.musicGraph.companyBrand",
    "cdc.musicGraph.fingerprintRule",
    "cdc.musicGraph.globalParticipant",
    "cdc.musicGraph.globalSoundRecording",
    "cdc.musicGraph.identity",
    "cdc.musicGraph.labelParticipant",
    "cdc.musicGraph.labelSoundRecording",
    "cdc.musicGraph.orchardAsset",
    "cdc.musicGraph.orchardSoundRecording",
    "cdc.musicGraph.parentCompany",
    "cdc.musicGraph.participantIdentifier",
    "cdc.musicGraph.product",
    "cdc.musicGraph.profile",
    "cdc.musicGraph.project",
    "cdc.musicGraph.publicParticipant",
    "cdc.musicGraph.publicSoundRecording",
    "cdc.musicGraph.publishingAgreement",
    "cdc.musicGraph.publishingComposition",
    "cdc.musicGraph.publishingPublisher",
    "cdc.musicGraph.publishingSongWriter",
    "cdc.musicGraph.releaseArtist",
    "cdc.musicGraph.serviceTier",
    "cdc.musicGraph.subAccount",
    "cdc.musicGraph.track",
    "cdc.musicGraph.trackArtist",
    "cdc.musicGraph.trackWriter",
    "cdc.musicGraph.vendor",
    "cdc.musicGraph.video",
    "dlq.neo4jV5.sink",
    # relations
    "cdc.musicGraph.belongsTo",
    "cdc.musicGraph.containsFingerprint",
    "cdc.musicGraph.contributedTo",
    "cdc.musicGraph.createdFrom",
    "cdc.musicGraph.deletedHasAccessTo",
    "cdc.musicGraph.deletedHasAdminAccessTo",
    "cdc.musicGraph.deletedHasFingerprintRule",
    "cdc.musicGraph.deletedHasProfile",
    "cdc.musicGraph.fingerprintedAs",
    "cdc.musicGraph.hasAccessTo",
    "cdc.musicGraph.hasAdminAccessTo",
    "cdc.musicGraph.hasAggregatedParticipantSocialStat",
    "cdc.musicGraph.hasAgreement",
    "cdc.musicGraph.hasAsset",
    "cdc.musicGraph.hasAutoFollowed",
    "cdc.musicGraph.hasComposition",
    "cdc.musicGraph.hasFeaturedArtist",
    "cdc.musicGraph.hasFingerprintRule",
    "cdc.musicGraph.hasLabel",
    "cdc.musicGraph.hasLabelParticipant",
    "cdc.musicGraph.hasPrimaryArtist",
    "cdc.musicGraph.hasProfile",
    "cdc.musicGraph.hasSignedWriter",
    "cdc.musicGraph.hasSoundRecording",
    "cdc.musicGraph.hasSourceArtist",
    "cdc.musicGraph.hasSubscription",
    "cdc.musicGraph.inServiceTier",
    "cdc.musicGraph.includes",
    "cdc.musicGraph.isPlacementOf",
    "cdc.musicGraph.mergedTo",
    "cdc.musicGraph.owns",
    "cdc.musicGraph.ownsProduct",
    "cdc.musicGraph.participatedIn",
    "cdc.musicGraph.represents",
  ]
  service_cpu_monitor_enabled     = false
  error_monitor_enabled           = false
  dlq_topic_name                  = "dlq.neo4jV5.sink"
  healthy_tasks_evaluation_window = "last_15m"
  service_cpu_time_window         = "last_15m"
}
