# Note: all of these variables can be configured in a
# terraform.tfvars file which should not be commited.
variable "env" {
}

variable "region" {
}

variable "OWS_SENTRY_DSN" {
}

variable "VIDEO_DB_HOST" {
}

variable "DAEMON_SENTRY_DSN" {
}

variable "CONFIG_KEYPAIR" {
}

variable "AR_DB_NAME" {
}

variable "AR_DB_HOST" {
}

variable "AR_DB_PORT" {
}

variable "video_assets_bucket_cors_policy" {
}

variable "s3_raw_dir_browser_upload_role_arn_output" {
}

variable "s3_raw_dir_putonly_policy_output" {
}

variable "s3_raw_dir_readonly_policy_output" {
}

variable "s3_raw_dir_rw_policy_output" {
}

variable "s3_mezzanine_dir_readonly_policy_output" {
}

variable "s3_mezzanine_dir_putonly_policy_output" {
}

variable "s3_mezzanine_dir_rw_policy_output" {
}

variable "s3_streamable_preview_dir_readonly_policy_output" {
}

variable "s3_streamable_preview_dir_putonly_policy_output" {
}

variable "s3_thumbnails_dir_readonly_policy_output" {
}

variable "s3_thumbnails_dir_putonly_policy_output" {
}

variable "s3_blank_dir_readonly_policy_output" {
}

variable "s3_blank_dir_putonly_policy_output" {
}

variable "s3_ingest_dir_rwd_policy_output" {
}

variable "s3_video_dashboard_item_policy_output" {
}

variable "s3_list_bucket_policy_output" {
}

variable "rekognition_policy_output" {
}

variable "MEDIACONVERT_URL" {
}

variable "MEDIACONVERT_QUEUE" {
}

variable "NUM_ACTIVITY_TASK_HANDLING_WORKERS" {
}

variable "ACTIVITY_ARN_PREFIX" {
}

variable "video_mediaconvert_role_arn_output" {
}

variable "ows_video_browser_upload_assume_role_policy_output" {
}

variable "ows_video_service_owsrequest_policy_arn_output" {
}

variable "ows_video_stepfunctions_policy_output" {
}

variable "video_mediaconvert_create_job_policy_arn_output" {
}

variable "video_mediaconvert_get_job_policy_arn_output" {
}

variable "video_mediaconvert_get_role_policy_arn_output" {
}

variable "video_mediaconvert_pass_role_policy_arn_output" {
}

variable "daemon_video_service_owsrequest_policy_arn_output" {
}

variable "daemon_video_stepfunctions_policy_output" {
}

variable "daemon_video_activity_task_sqs_queue_name" {
}

variable "daemon_video_on_prem_sqs_policy_arn_output" {
}

variable "video_assets_bucket_name" {
}

variable "video_dashboard_item_id_key" {
}

variable "video_ingestion_workflow_state_machine_arn_output" {
}

variable "video_approval_workflow_state_machine_arn_output" {
}

variable "sqs_minimal_policy_arn_output" {
}

variable "thumbnails_distribution_alias" {
}

variable "thumbnails_acm_certificate_arn" {
}

variable "video_ingestion_workflow_state_machine_execution_arn" {
}

variable "video_approval_workflow_state_machine_execution_arn" {
}

provider "aws" {
  region = var.region
}

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

# Setup master password.
data "aws_secretsmanager_secret" "rds_master_username" {
  name = "${var.env}/ows-video/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.env}/ows-video/rds_master_password"
}

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

#
# Run:
#   1. `terraform init`
#   2. `terraform plan`
#   3. `terraform apply -target module.ows_video_rds`
#
# Be sure to store your DB_USERNAME and DB_PASSWORD in your
# password manager of choice.
#
module "ows_video_rds" {
  source = "git@github.com:theorchard/terraform-rds//"

  environment                = var.env
  service_name               = "ows-video"
  rds_cluster_instance_class = "db.t2.small"
  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
}

#
# Run:
#   1. terraform plan -target module.s3_video_bucket
#   2. terraform apply -target module.s3_video_bucket
#
module "s3_video_bucket" {
  source                   = "../modules/s3"
  environment              = var.env
  video_assets_bucket_cors = var.video_assets_bucket_cors_policy
}

module "rekognition_daemon_video" {
  source       = "../modules/rekognition"
  environment  = var.env
  service_name = "daemon-video"
}

#
# Run:
#   1. terraform plan -target module.ows_video_service_owsrequest
#   2. terraform apply -target module.ows_video_service_owsrequest
#
module "ows_video_service_owsrequest" {
  source = "git@github.com:theorchard/terraform-owsrequest.git//"

  environment_name = var.env
  service_name     = "ows-video"
}

#
# Run:
#   1. terraform plan -target module.daemon_video_service_owsrequest
#   2. terraform apply -target module.daemon_video_service_owsrequest
#   3. terraform output -module=daemon_video_service_owsrequest
#   4. Paste output of step 3 into your terraform.tfvars file with the variable name of
#      `daemon_video_service_owsrequest_policy_arn_output`.
module "daemon_video_service_owsrequest" {
  source = "git@github.com:theorchard/terraform-owsrequest.git//"

  environment_name = var.env
  service_name     = "daemon-video"
}

#
# Run:
#   1. Connect to DB with master creds and create service db username and password. Add to tfvars.
#   2. Share creds securely with systems.
#   3. terraform output -module=ows_video_rds
#   4. replace DB_HOST in terraform.tfvars
#   5. terraform output -module=s3_video_bucket
#   6. replace s3_mezzanine_readonly_policy_output and s3_raw_putonly_policy_output in tfvars.
#   7. terraform plan -target module.ows_video_service_environment
#   8. terraform apply -target module.ows_video_service_environment
#
module "ows_video_service_environment" {
  source = "git@github.com:theorchard/terraform-elasticbeanstalk.git//"

  environment      = var.env
  service_name     = "ows-video"
  update_max_batch = "1"
  vpc_elb_subnets  = "subnet-44c19a21,subnet-b649dfef"
  vpc_subnets      = "subnet-44c19a21,subnet-b649dfef"
  vpc_id           = "vpc-34dbfd51"
  iam_managed_policy_attachments = [
    var.s3_mezzanine_dir_readonly_policy_output,
    var.s3_thumbnails_dir_readonly_policy_output,
    var.ows_video_browser_upload_assume_role_policy_output,
    var.ows_video_service_owsrequest_policy_arn_output,
    var.ows_video_stepfunctions_policy_output,
    var.s3_list_bucket_policy_output,
    var.sqs_minimal_policy_arn_output,
  ]

  launchconfiguration_keypair             = var.CONFIG_KEYPAIR
  load_balancer_listener_port             = "443"
  load_balancer_listener_protocol         = "HTTPS"
  load_balancer_ssl_certificate_arn       = "arn:aws:acm:us-east-1:103233932089:certificate/a1a3c6c2-523f-4f79-ba24-ce69f21ac066"
  notification_endpoints                  = "systems@theorchard.com"
  process_port                            = "80"
  process_protocol                        = "HTTP"
  process_instance_health_check_path      = "/hello/"
  launchconfiguration_instance_type       = "t3.medium"
  trigger_measure_name                    = "CPUUtilization"
  trigger_period                          = "1"
  trigger_breach_duration                 = "10"
  trigger_statistic                       = "Average"
  trigger_unit                            = "Percent"
  trigger_upper_threshold                 = "75"
  trigger_lower_threshold                 = "50"
  launchconfiguration_monitoring_interval = "1 minute"
  deployment_batch_size_type              = "Percentage"
  deployment_batch_size                   = "100"
  asg_cooldown                            = "60"
  asg_min_size                            = "2"
  asg_max_size                            = "8"
  deployment_timeout                      = "3600"
  update_type                             = "Immutable"
  deployment_update_type                  = "RollingWithAdditionalBatch"
  elb_connection_draining_enabled         = "true"

  environment_variables = [
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "Environment"
      value     = var.env
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "SENTRY_DSN"
      value     = var.OWS_SENTRY_DSN
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "VIDEO_DB_HOST"
      value     = var.VIDEO_DB_HOST
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "VIDEO_DB_NAME"
      value     = "ows_video"
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "VIDEO_DB_PORT"
      value     = "3306"
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "AR_DB_NAME"
      value     = var.AR_DB_NAME
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "AR_DB_HOST"
      value     = var.AR_DB_HOST
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "AR_DB_PORT"
      value     = var.AR_DB_PORT
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "UPLOAD_RAW_ROLE_ARN"
      value     = var.s3_raw_dir_browser_upload_role_arn_output
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "VIDEO_INGESTION_WORKFLOW_STATE_MACHINE_ARN"
      value     = var.video_ingestion_workflow_state_machine_arn_output
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "VIDEO_APPROVAL_WORKFLOW_STATE_MACHINE_ARN"
      value     = var.video_approval_workflow_state_machine_arn_output
    },
  ]
}

#
# Run:
#   1. terraform plan -target module.daemon_video_service_environment
#   2. terraform apply -target module.daemon_video_service_environment
#
module "daemon_video_service_environment" {
  source = "git@github.com:theorchard/terraform-elasticbeanstalk.git//"

  environment      = var.env
  service_name     = "daemon-video"
  environment_tier = "Worker"
  update_max_batch = "1"
  vpc_elb_subnets  = "subnet-44c19a21,subnet-b649dfef"
  vpc_subnets      = "subnet-44c19a21,subnet-b649dfef"
  vpc_id           = "vpc-34dbfd51"
  iam_managed_policy_attachments = [
    var.s3_raw_dir_rw_policy_output,
    var.s3_mezzanine_dir_rw_policy_output,
    var.s3_ingest_dir_rwd_policy_output,
    var.rekognition_policy_output,
    var.daemon_video_service_owsrequest_policy_arn_output,
    var.daemon_video_stepfunctions_policy_output,
    var.video_mediaconvert_create_job_policy_arn_output,
    var.video_mediaconvert_get_job_policy_arn_output,
    var.video_mediaconvert_get_role_policy_arn_output,
    var.video_mediaconvert_pass_role_policy_arn_output,
  ]
  process_instance_health_check_path      = ""
  launchconfiguration_instance_type       = "t3.small"
  trigger_measure_name                    = "CPUUtilization"
  trigger_period                          = "1"
  trigger_breach_duration                 = "10"
  trigger_statistic                       = "Average"
  trigger_unit                            = "Percent"
  trigger_upper_threshold                 = "100"
  trigger_lower_threshold                 = "0"
  launchconfiguration_monitoring_interval = "1 minute"
  deployment_batch_size_type              = "Percentage"
  deployment_batch_size                   = "100"
  asg_cooldown                            = "60"
  asg_min_size                            = "2"
  asg_max_size                            = "8"
  deployment_timeout                      = "3600"
  update_type                             = "Immutable"
  deployment_update_type                  = "RollingWithAdditionalBatch"

  environment_variables = [
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "Environment"
      value     = var.env
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "SENTRY_DSN"
      value     = var.DAEMON_SENTRY_DSN
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "MEDIACONVERT_ROLE"
      value     = var.video_mediaconvert_role_arn_output
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "MEDIACONVERT_URL"
      value     = var.MEDIACONVERT_URL
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "MEDIACONVERT_QUEUE"
      value     = var.MEDIACONVERT_QUEUE
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "NUM_ACTIVITY_TASK_HANDLING_WORKERS"
      value     = var.NUM_ACTIVITY_TASK_HANDLING_WORKERS
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "ACTIVITY_TASK_SQS_QUEUE_NAME"
      value     = var.daemon_video_activity_task_sqs_queue_name
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "ACTIVITY_ARN_PREFIX"
      value     = var.ACTIVITY_ARN_PREFIX
    },
  ]
}

module "video_state_machines" {
  source                                               = "../modules/step_functions"
  environment                                          = var.env
  video_ingestion_workflow_state_machine_execution_arn = var.video_ingestion_workflow_state_machine_execution_arn
  video_approval_workflow_state_machine_execution_arn  = var.video_approval_workflow_state_machine_execution_arn
}

#
# Run:
#   1. terraform apply -target module.s3_video_bucket
#   2. terraform output -module=s3_video_bucket
#   3. Take the output from step 2 and add it to terraform.tfvars.
#   4. terraform apply -target module.video_mediaconvert
#
module "video_mediaconvert" {
  source                                          = "../modules/mediaconvert"
  environment                                     = var.env
  s3_blank_dir_readonly_policy_output             = var.s3_blank_dir_readonly_policy_output
  s3_raw_dir_readonly_policy_output               = var.s3_raw_dir_readonly_policy_output
  s3_streamable_preview_dir_putonly_policy_output = var.s3_streamable_preview_dir_putonly_policy_output
  s3_thumbnails_dir_putonly_policy_output         = var.s3_thumbnails_dir_putonly_policy_output
  s3_mezzanine_dir_putonly_policy_output          = var.s3_mezzanine_dir_putonly_policy_output
}

# Run:
#   1. terraform apply -target module.s3_video_bucket
#   2. terraform output -module=s3_video_bucket
#   3. Take the output from step 2 and add it to terraform.tfvars.
#   4. terraform apply -target module.thumbnails_distribution
module "thumbnails_distribution" {
  source = "../modules/cloudfront"

  environment              = var.env
  video_assets_bucket_name = var.video_assets_bucket_name
  distribution_alias       = var.thumbnails_distribution_alias
  acm_certificate_arn      = var.thumbnails_acm_certificate_arn
  logging_bucket           = "dev-orcd-cloudfront-logs.s3.amazonaws.com"
}

# Run:
#   1. terraform apply -target module.video_sqs
#   2. terraform output -module=video_sqs
#   3. Take sqs_minimal_policy_arn_output from step 2
#      and paste into terraform.tfvars.
module "video_sqs" {
  source = "git@github.com:theorchard/terraform-sqs.git"

  environment                    = var.env
  queue_name                     = "daemon-video"
  sqs_delay_seconds              = 0
  sqs_max_message_size           = 131000
  sqs_message_retention_seconds  = 86400
  sqs_receive_wait_time_seconds  = 20
  sqs_visibility_timeout_seconds = 43200
}

# Run:
#   1. terraform apply -target module.video_on_prem_sqs
#   2. The policy with this queue needs to be applied to the daemon
#      video .
module "video_on_prem_sqs" {
  source = "git@github.com:theorchard/terraform-sqs.git"

  environment                    = var.env
  queue_name                     = "daemon-video-on-prem"
  sqs_delay_seconds              = 0
  sqs_max_message_size           = 131000
  sqs_message_retention_seconds  = 86400
  sqs_receive_wait_time_seconds  = 20
  sqs_visibility_timeout_seconds = 43200
}

# Run:
#   1. terraform apply -target module.on_prem_daemon_video_user_policy_attachment
#   Note: depends on output of video_on_prem_sqs.
module "on_prem_daemon_video_user_policy_attachment" {
  source = "../modules/attach_policy_to_user"

  policy_user = "${var.env}-daemon-video"
  policy_arn  = var.daemon_video_on_prem_sqs_policy_arn_output
}

# Run:
#   1. terraform apply -target module.on_prem_daemon_video_mezzanine_readonly_policy_attachement
#   Note: depends on output of s3_video_bucket
module "on_prem_daemon_video_mezzanine_readonly_policy_attachment" {
  source = "../modules/attach_policy_to_user"

  policy_user = "${var.env}-daemon-video"
  policy_arn  = var.s3_mezzanine_dir_readonly_policy_output
}

# Run:
#   1. terraform apply -target module.on_prem_daemon_video_list_object_attachment
#   Note: depends on output of s3_video_bucket
module "on_prem_daemon_video_list_object_attachment" {
  source = "../modules/attach_policy_to_user"

  policy_user = "${var.env}-daemon-video"
  policy_arn  = var.s3_list_bucket_policy_output
}

