variable "environment" {
}

variable "route53_zone_id" {
}

variable "service_name" {
}

provider "aws" {
  region = "us-east-1"
}

# Terraform backends cannot contain interpolations
terraform {
  backend "s3" {
    bucket         = "orcd-terraform-state"
    key            = "prod/dd-search/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = "true"
    dynamodb_table = "terraform-prod-dd-search"
  }
}

module "elasticsearch" {
  source = "git@github.com:theorchard/terraform-elasticsearch.git//?ref=1.2.0"

  env                            = var.environment
  aws_es_domain_name             = var.service_name
  aws_es_instance_type           = "m5.xlarge.elasticsearch"
  aws_es_instance_count          = 3
  aws_es_disk_size               = 100
  vpc_subnet_ids                 = ["subnet-cb4dbae0"]
  backup_s3_bucket_name          = "prod-orcdbucket"
  schedule_exp                   = "rate(6 hours)"
  vpc_security_group_ids         = ["sg-21f1ed44"]
  aws_route53_params_zone_id     = "Z2RSKZ9M7TJ9Z"
  aws_es_version                 = 6.2
  encrypt_at_rest_enabled        = false
  node_to_node_encryption_option = false
  zone_awareness_enabled         = false
  log_publishing_options = [
    {
      cloudwatch_log_group_arn = "arn:aws:logs:us-east-1:437795906767:log-group:/aws/aes/domains/prod-dd-search/application-logs"
      enabled                  = true
      log_type                 = "ES_APPLICATION_LOGS"
    },
    {
      cloudwatch_log_group_arn = "arn:aws:logs:us-east-1:437795906767:log-group:/aws/aes/domains/prod-dd-search/index-logs"
      enabled                  = true
      log_type                 = "INDEX_SLOW_LOGS"
    },
    {
      cloudwatch_log_group_arn = "arn:aws:logs:us-east-1:437795906767:log-group:/aws/aes/domains/prod-dd-search/search-logs"
      enabled                  = true
      log_type                 = "SEARCH_SLOW_LOGS"
    },
  ]
}

resource "aws_route53_record" "prod_elasticsearch_record" {
  name    = "${var.environment}-${var.service_name}"
  zone_id = var.route53_zone_id
  type    = "CNAME"
  ttl     = "60"
  records = [module.elasticsearch.aws_elasticsearch_route53_fqdn]
}

module "kinesis" {
  source = "../modules/kinesis"

  env                 = var.environment
  kinesis_stream_name = var.service_name

  # Note: this can not be increased more than 100% at a time.
  shard_count = 20
}

data "aws_secretsmanager_secret" "ar_mysql_password" {
  name = "${var.environment}/${var.service_name}/AR_MYSQL_PASSWORD"
}

data "aws_secretsmanager_secret_version" "ar_mysql_password" {
  secret_id = data.aws_secretsmanager_secret.ar_mysql_password.id
}

data "aws_secretsmanager_secret" "dd_mysql_password" {
  name = "${var.environment}/${var.service_name}/DD_MYSQL_PASSWORD"
}

data "aws_secretsmanager_secret_version" "dd_mysql_password" {
  secret_id = data.aws_secretsmanager_secret.dd_mysql_password.id
}

data "aws_secretsmanager_secret" "sentry_dsn" {
  name = "${var.environment}/${var.service_name}/SENTRY_DSN"
}

data "aws_secretsmanager_secret_version" "sentry_dsn" {
  secret_id = data.aws_secretsmanager_secret.sentry_dsn.id
}

module "lambda" {
  source = "../modules/lambda"

  env                                   = var.environment
  lambda_name                           = var.service_name
  lambda_function_package_path          = "${path.module}/lambda.zip"
  vpc_subnet_ids                        = ["subnet-cb4dbae0", "subnet-5366ef24"]
  vpc_security_group_ids                = ["sg-21f1ed44"]
  kinesis_stream_name                   = module.kinesis.kinesis_stream_arn
  kinesis_batch_size                    = 6
  lambda_function_concurrent_executions = 20
  lambda_function_memory_size           = 512
  lambda_function_environment_variables = {
    Environment            = var.environment
    LOGGER_LEVEL           = "INFO"
    AR_MYSQL_HOST          = "ar-db.theorchard.com"
    AR_MYSQL_PASSWORD      = data.aws_secretsmanager_secret_version.ar_mysql_password.secret_string
    AR_MYSQL_USER          = var.service_name
    AR_MYSQL_PORT          = 3306
    DD_MYSQL_HOST          = "dd-db.theorchard.com"
    DD_MYSQL_PASSWORD      = data.aws_secretsmanager_secret_version.dd_mysql_password.secret_string
    DD_MYSQL_USER          = var.service_name
    DD_MYSQL_PORT          = 3306
    ELASTICSEARCH_HOST     = aws_route53_record.prod_elasticsearch_record.fqdn
    ELASTICSEARCH_PORT     = 80
    ELASTICSEARCH_USE_AUTH = "True"
    ELASTICSEARCH_USE_SSL  = ""
    LOGGER_DSN             = "https://${var.environment}-fluentd-applications.theorchard.io:8888/application"
    SENTRY_DSN             = data.aws_secretsmanager_secret_version.sentry_dsn.secret_string
    SNS_TARGET_ARN         = "arn:aws:sns:us-east-1:437795906767:prod-dd-search-errors"
  }
}
