provider "aws" {
  region = var.aws_region
}

terraform {
  backend "s3" {
    bucket  = "dev-orcd-terraform-state"
    key     = "dev/ows-podcast/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 "ows_podcast_rds" {
  source = "git@github.com:theorchard/terraform-rds//"

  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}"
}

resource "aws_ecr_repository" "ows_repository" {
  name = var.service_name
}

module "ows_podcast_owsrequest" {
  source = "git@github.com:theorchard/terraform-owsrequest.git//"

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

module "ows_podcast_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//"

  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   = 4
  minimum_capacity   = 1
  datadog_enabled    = false

  environment_variables = [
    {
      Environment = var.Environment
    },
    {
      DATADOG_TRACE_ENABLED = "false"
    },
    {
      UPLOAD_ROLE_ARN = module.buckets.ows_podcast_browser_upload_role_arn
    },
    {
      INPUT_ASSETS_BUCKET_NAME = module.buckets.input_bucket_name
    },
    {
      OUTPUT_ASSETS_BUCKET_NAME = module.buckets.output_bucket_name
    },
    {
      OUTPUT_CDN_BASE_URL = var.output_assets_domain
    },
    {
      AUTH0_CLIENT_ID = var.auth0_client_id
    },
  ]

  iam_managed_policy_attachments = [
    "arn:aws:iam::${data.aws_caller_identity.current.account_id}:policy/Dynamo-${var.Environment}-${var.service_name}-owsrequest",
    "${module.buckets.output_bucket_readonly_policy_arn}",
    "${module.buckets.ows_podcast_browser_upload_assume_role_policy_arn}",
  ]
}

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

  environment        = "${var.Environment}"
  input_bucket_cors  = "${var.input_assets_bucket_cors}"
  output_bucket_cors = "${var.output_assets_bucket_cors}"

  output_assets_cdn_certificate_arn = "${var.output_assets_cdn_certificate_arn}"
  output_assets_domain              = "${var.output_assets_domain}"

  fargate_task_role      = "${module.ows_podcast_fargate_environment.fargate_task_iam_role_arn}"
  additional_roles       = var.additional_browser_assume_role_arns
  cloudfront_logs_bucket = "dev-orcd-cloudfront-logs.s3.amazonaws.com"
}

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

  environment                          = "${var.Environment}"
  sns_general_topic_name               = "podcast_asset_general_status"
  sns_encoding_status_topic_name       = "podcast_asset_encoding_status"
  vpc_security_group_ids               = "${var.vpc_security_group_ids}"
  vpc_subnet_ids                       = "${var.vpc_subnet_ids}"
  elastic_transcoder_pipeline_id       = "${module.elastic_transcoder.pipeline_id}"
  image_previews_bucket                = "${module.buckets.output_bucket_name}"
  output_assets_bucket                 = "${module.buckets.output_bucket_name}"
  image_encoding_lambda_memory_size    = "${var.image_encoding_lambda_memory_size}"
  audio_waveform_lambda_execution_time = "${var.audio_waveform_lambda_execution_time}"
  lambda_concurrent_executions         = 2
  datadog_enabled                      = false

  sentry_dsn_acknowledge      = "https://14bdbf3ab9ad4e6b835b89b8d0c50a78@sentry.io/1795544"
  sentry_dsn_encoding_route   = "https://cf28c1de84664266992438d70c190d58@sentry.io/1795547"
  sentry_dsn_image_validation = "https://2ac09b3452ef494cab4ace12c8e98c6f@sentry.io/1795549"
  sentry_dsn_image_encoding   = "https://dd6eff322b3f462282dd20420733ac1c@sentry.io/1795560"
  sentry_dsn_audio_validation = "https://be30234f3ed9401bbac571c9dcc82612@sentry.io/1795565"
  sentry_dsn_audio_waveform   = "https://415a6b04c4f543a68c3059639ab50133@sentry.io/1795568"
  sentry_dsn_general_status   = "https://80a6ca16cfd34ea4b8975a43797f877e@sentry.io/1795571"
  sentry_dsn_final_status     = "https://ac90130924ad4488ad51e09a32c6b712@sentry.io/1795578"
  sentry_dsn_error_reporting  = "https://252f2aff08544e44bb2e69bdbe1f543b@sentry.io/1796641"
}

module "elastic_transcoder" {
  source                 = "../modules/elastic_transcoder"
  environment            = "${var.Environment}"
  input_bucket_arn       = "${module.buckets.input_bucket_arn}"
  output_bucket_arn      = "${module.buckets.output_bucket_arn}"
  input_bucket_name      = "${module.buckets.input_bucket_name}"
  output_bucket_name     = "${module.buckets.output_bucket_name}"
  encoding_sns_topic_arn = "${module.lambdas.sns_encoding_status_topic_arn}"
}

module "state_machine" {
  source = "../modules/transcoding_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}"
}

module "ows_podcast_gateway_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//"

  environment        = "${var.Environment}"
  service_name       = "podcast-gateway"
  aws_region         = "${var.aws_region}"
  commit_sha         = "latest"
  container_port     = "3000"
  task_type          = "web_service"
  desired_task_count = 1
  task_cpu           = 1024
  task_memory        = 2048
  maximum_capacity   = 4
  minimum_capacity   = 1
  datadog_enabled    = false

  environment_variables = [
    {
      Environment = var.Environment
    },
    {
      AUTH0_DOMAIN = var.auth0_domain
    },
    {
      AUTH0_CLIENT_ID = var.auth0_client_id
    },
    {
      AUTH0_APP_NAME = var.auth0_app_name
    },
    {
      AUTH0_AUDIENCE = var.auth0_audience
    },
    {
      CDN_URL = var.cdn_url
    },
    {
      OWS_GRASS_URL = var.ows_grass_url
    },
  ]

}

resource "aws_route53_record" "podcast_gateway_lb_cname" {
  zone_id = var.route53_zone_id
  name    = "podcast"
  type    = "CNAME"
  ttl     = "60"
  records = [module.ows_podcast_gateway_environment.fargate_load_balancer_dns_name]
}
