provider "aws" {
  region = var.aws_region
}

terraform {
  backend "s3" {
    bucket  = "dev-orcd-terraform-state"
    key     = "dev/asset-transcoder/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }
}

data "aws_caller_identity" "current" {}

data "aws_secretsmanager_secret" "rds_master_username" {
  name = "${var.Environment}/${var.service_name}/rds_master_username"
}

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

data "aws_secretsmanager_secret" "rds_master_password" {
  name = "${var.Environment}/${var.service_name}/rds_master_password"
}

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

module "asset_transcoder_rds" {
  source = "git@github.com:theorchard/terraform-rds//?ref=1.0.0"

  environment                = var.Environment
  service_name               = var.service_name
  rds_cluster_instance_class = "db.r4.large"
  rds_cluster_instance_count = "1"
  rds_master_username        = data.aws_secretsmanager_secret_version.rds_master_username.secret_string
  rds_master_password        = data.aws_secretsmanager_secret_version.rds_master_password.secret_string
}

module "ows_asset_transcoder_owsrequest" {
  source = "git@github.com:theorchard/terraform-owsrequest.git//?ref=1.0.0"

  environment_name   = var.Environment
  service_name       = var.service_name
  aws_account_number = data.aws_caller_identity.current.account_id
}

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

  environment           = var.Environment
  service_name          = var.service_name
  aws_region            = var.aws_region
  commit_sha            = "latest"
  container_port        = "8080"
  task_type             = "web_service"
  desired_task_count    = 1
  task_cpu              = 1024
  task_memory           = 2048
  maximum_capacity      = 2
  minimum_capacity      = 1
  scale_up_adjustment   = 1
  scale_down_adjustment = -1
  health_check_path     = "/hello/"
  datadog_enabled       = false
  http_listener_enabled = true

  iam_managed_policy_attachments = [
    module.ows_asset_transcoder_owsrequest.policy_arn_output,
    module.buckets.output_buckets_readonly_policy_arn,
    module.buckets.browser_upload_assume_role_policy_arn,
    module.buckets.output_buckets_readwrite_policy_arn
  ]

  environment_variables = [
    {
      Environment = var.Environment
    },
    {
      DATADOG_TRACE_DEBUG = "false"
    },
    {
      DD_LOGS_INJECTION = "false"
    },
    {
      LOGGER_DSN = "https://${var.Environment}-fluentd-applications.theorchard.io:8888/application"
    },
    {
      INPUT_ASSETS_BUCKET_NAME = module.buckets.input_bucket_name
    },
    {
      OUTPUT_ASSETS_PODCAST_BUCKET_NAME = var.podcast_output_bucket_name
    },
    {
      PREVIEW_ASSETS_PODCAST_BUCKET_NAME = var.podcast_output_bucket_name
    },
    {
      ELASTIC_TRANSCODER_PODCAST_ID = module.podcast_elastic_transcoder.pipeline_id
    },
    {
      OUTPUT_PODCAST_CDN = var.podcast_output_cdn
    },
    {
      UPLOAD_ROLE_ARN = module.buckets.browser_upload_role_arn
    },
    {
      OWSREQUEST_SERVICE_MAP = "{\"ows-podcast\": \"dev-ows-podcast.dev.theorchard.io\"}"
    }
  ]
}

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

  environment          = var.Environment
  input_bucket_cors    = var.input_assets_bucket_cors
  fargate_task_role    = module.ows_asset_transcoder_fargate.fargate_task_iam_role_arn
  additional_roles     = var.additional_browser_assume_role_arns
  output_buckets_names = [var.podcast_output_bucket_name]
}

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

  environment                          = var.Environment
  vpc_security_group_ids               = var.lambdas_vpc_security_group_ids
  vpc_subnet_ids                       = var.lambdas_vpc_subnet_ids
  image_previews_bucket                = var.podcast_output_bucket_name
  input_bucket_name                    = module.buckets.input_bucket_name
  output_buckets_names                 = [var.podcast_output_bucket_name]
  image_encoding_lambda_memory_size    = 3008
  audio_waveform_lambda_execution_time = 900
  lambda_concurrent_executions         = 2
  datadog_enabled                      = false
}

module "podcast_elastic_transcoder" {
  source                      = "../modules/elastic_transcoder"
  environment                 = var.Environment
  pipeline_name               = "podcast"
  input_bucket_name           = module.buckets.input_bucket_name
  output_bucket_name          = var.podcast_output_bucket_name
  notifications_sns_topic_arn = module.lambdas.sns_final_status_topic_arn
}

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

  environment                 = var.Environment
  region                      = var.aws_region
  acknowledge_lambda_arn      = module.lambdas.acknowledge_lambda_arn
  encoding_route_lambda_arn   = module.lambdas.encoding_route_lambda_arn
  audio_validation_lambda_arn = module.lambdas.audio_validation_lambda_arn
  audio_waveform_lambda_arn   = module.lambdas.audio_waveform_lambda_arn
  image_validation_lambda_arn = module.lambdas.image_validation_lambda_arn
  image_encoding_lambda_arn   = module.lambdas.image_encoding_lambda_arn
  error_reporting_lambda_arn  = module.lambdas.error_reporting_lambda_arn
  input_assets_bucket         = module.buckets.input_bucket_name
}
