provider "aws" {
  region = var.aws_region
}

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

# ows-abacus-event
module "ows_abacus_event_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//?ref=1.6.2"

  environment        = var.environment
  service_name       = "ows-abacus-event"
  aws_region         = var.aws_region
  desired_task_count = 1
  minimum_capacity   = 1
  maximum_capacity   = 2
  task_cpu           = 512
  task_memory        = 1024
  vpc_id             = var.vpc_id

  datadog_function_destination_arn = var.dd_arn
  fargate_service_subnets          = var.subnets
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  environment_variables = [
    { Environment = var.environment },
    { MYSQL_DB_HOST = var.mysql_db_host },
    { MYSQL_DB_USER = var.mysql_db_user },
    { MYSQL_DB_PASS = var.mysql_db_pass },
    { HISTORICAL_ISO_CODES = var.historical_iso_codes },
    { OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map },
    { FORCE_HTTPS = "1" },
    { DATADOG_TRACE_ENABLED = "FALSE" }
  ]
}

# ows-abacus-contract
module "ows_abacus_contract_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//?ref=1.6.2"

  environment        = var.environment
  service_name       = "ows-abacus-contract"
  aws_region         = var.aws_region
  desired_task_count = 1
  minimum_capacity   = 1
  maximum_capacity   = 2
  task_cpu           = 512
  task_memory        = 1024
  vpc_id             = var.vpc_id

  datadog_function_destination_arn = var.dd_arn
  fargate_service_subnets          = var.subnets
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  environment_variables = [
    { Environment = var.environment },
    { MYSQL_DB_HOST = var.mysql_db_host },
    { MYSQL_DB_USER = var.mysql_db_user },
    { MYSQL_DB_PASS = var.mysql_db_pass },
    { HISTORICAL_ISO_CODES = var.historical_iso_codes },
    { OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map },
    { FORCE_HTTPS = "1" },
    { DATADOG_TRACE_ENABLED = "FALSE" },
    { SNOWFLAKE_SCHEMA = var.snowflake_schema },
    { SNOWFLAKE_WAREHOUSE = var.snowflake_warehouse },
    { SNOWFLAKE_ACCOUNT = var.snowflake_account },
    { SNOWFLAKE_DATABASE = var.snowflake_database },
    { SNOWFLAKE_ROLE = var.snowflake_role }
  ]
}

# ows-ledger
module "ows_ledger_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//?ref=1.6.2"

  environment        = var.environment
  service_name       = "ows-ledger"
  aws_region         = var.aws_region
  desired_task_count = 1
  minimum_capacity   = 1
  maximum_capacity   = 2
  task_cpu           = 512
  task_memory        = 1024
  vpc_id             = var.vpc_id

  datadog_function_destination_arn = var.dd_arn
  fargate_service_subnets          = var.subnets
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  environment_variables = [
    { Environment = var.environment },
    { MYSQL_DB_HOST = var.mysql_db_host },
    { MYSQL_DB_USER = var.mysql_db_user },
    { MYSQL_DB_PASS = var.mysql_db_pass },
    { HISTORICAL_ISO_CODES = var.historical_iso_codes },
    { OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map },
    { FORCE_HTTPS = "1" },
    { DATADOG_TRACE_ENABLED = "FALSE" },
    { SNOWFLAKE_USER = var.snowflake_user },
    { SNOWFLAKE_SCHEMA = var.snowflake_schema },
    { SNOWFLAKE_WAREHOUSE = var.snowflake_warehouse },
    { SNOWFLAKE_ACCOUNT = var.snowflake_account },
    { SNOWFLAKE_DATABASE = var.snowflake_database },
    { SNOWFLAKE_ROLE = var.snowflake_role },
    { SNOWFLAKE_PASSWORD = var.snowflake_password }
  ]
}

# ows-payee
module "ows_payee_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//?ref=1.6.2"

  environment        = var.environment
  service_name       = "ows-payee"
  aws_region         = var.aws_region
  desired_task_count = 1
  minimum_capacity   = 1
  maximum_capacity   = 2
  task_cpu           = 512
  task_memory        = 1024
  vpc_id             = var.vpc_id

  iam_managed_policy_attachments = [
    aws_iam_policy.task_kms_policy.arn,
    aws_iam_policy.task_dev_access.arn
  ]
  datadog_function_destination_arn = var.dd_arn
  fargate_service_subnets          = var.subnets
  environment_variables = [
    { Environment = var.environment },
    { MYSQL_DB_HOST = var.mysql_db_host },
    { MYSQL_DB_USER = var.mysql_db_user },
    { MYSQL_DB_PASS = var.mysql_db_pass },
    { HISTORICAL_ISO_CODES = var.historical_iso_codes },
    { OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map },
    { FORCE_HTTPS = "1" },
    { DATADOG_TRACE_ENABLED = "FALSE" },
    { KMS_KEY_ALIAS = "${var.environment}-ows-payee-data-key" },
    { DYNAMODB_TABLE_NAME = "${var.environment}-ows-payee-payee-info" }
  ]
}
module "ows_payee_dynamodb_table" {
  source = "git@github.com:theorchard/terraform-dynamodb.git//?ref=1.1.4"

  env               = var.environment
  table_name        = "ows-payee-payee-info"
  hash_key          = "owner"
  hash_type         = "S"
  range_key_enabled = true
  range_key         = "revision"
  range_type        = "S"
}
resource "aws_kms_key" "dev_ows_payee_data_key" {
  description = "${var.environment}-ows-payee-data-key"
}
resource "aws_kms_alias" "dev_ows_payee_kms_key_alias" {
  name          = "alias/${var.environment}-ows-payee-data-key"
  target_key_id = aws_kms_key.dev_ows_payee_data_key.key_id
}
data "aws_iam_policy_document" "task_kms_policy_document" {
  statement {
    effect = "Allow"
    resources = [
      aws_kms_key.dev_ows_payee_data_key.arn
    ]
    actions = [
      "kms:DescribeKey",
      "kms:GenerateDataKey",
      "kms:Decrypt"
    ]
  }
  statement {
    effect = "Allow"
    resources = [
      module.ows_payee_dynamodb_table.aws_dynamodb_table_arn_with_sort_key
    ]
    actions = [
      "dynamodb:BatchGetItem",
      "dynamodb:BatchWriteItem",
      "dynamodb:DescribeTable",
      "dynamodb:GetItem",
      "dynamodb:PutItem",
      "dynamodb:Query",
      "dynamodb:Scan",
      "dynamodb:UpdateItem",
      "dynamodb:DeleteItem",
    ]
  }
}
resource "aws_iam_policy" "task_kms_policy" {
  name   = "KMS-${var.environment}-ows-payee-kms-policy"
  policy = data.aws_iam_policy_document.task_kms_policy_document.json
}

# ows-payment
module "ows_payment_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//?ref=1.6.2"

  environment        = var.environment
  service_name       = "ows-payment"
  aws_region         = var.aws_region
  desired_task_count = 1
  minimum_capacity   = 1
  maximum_capacity   = 2
  task_cpu           = 512
  task_memory        = 1024
  vpc_id             = var.vpc_id

  datadog_function_destination_arn = var.dd_arn
  fargate_service_subnets          = var.subnets
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  environment_variables = [
    { Environment = var.environment },
    { MYSQL_DB_HOST = var.mysql_db_host },
    { MYSQL_DB_USER = var.mysql_db_user },
    { MYSQL_DB_PASS = var.mysql_db_pass },
    { HISTORICAL_ISO_CODES = var.historical_iso_codes },
    { OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map },
    { FORCE_HTTPS = "1" },
    { DATADOG_TRACE_ENABLED = "FALSE" }
  ]
}

# ows-royalties
module "ows_royalties_fargate_environment" {
  source = "git@github.com:theorchard/terraform-fargate.git//?ref=1.6.2"

  environment        = var.environment
  service_name       = "ows-royalties"
  aws_region         = var.aws_region
  desired_task_count = 1
  minimum_capacity   = 1
  maximum_capacity   = 2
  task_cpu           = 512
  task_memory        = 1024
  vpc_id             = var.vpc_id

  datadog_function_destination_arn = var.dd_arn
  fargate_service_subnets          = var.subnets
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  environment_variables = [
    { Environment = var.environment },
    { MYSQL_DB_HOST = var.mysql_db_host },
    { MYSQL_DB_USER = var.mysql_db_user },
    { MYSQL_DB_PASS = var.mysql_db_pass },
    { HISTORICAL_ISO_CODES = var.historical_iso_codes },
    { OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map },
    { FORCE_HTTPS = "1" },
    { DATADOG_TRACE_ENABLED = "FALSE" },
    { SNOWFLAKE_USER = var.snowflake_user },
    { SNOWFLAKE_SCHEMA = var.snowflake_schema },
    { SNOWFLAKE_WAREHOUSE = var.snowflake_warehouse },
    { SNOWFLAKE_ACCOUNT = var.snowflake_account },
    { SNOWFLAKE_DATABASE = var.snowflake_database },
    { SNOWFLAKE_ROLE = var.snowflake_role },
    { SNOWFLAKE_PASSWORD = var.snowflake_password },
    { SNOWFLAKE_ROYALTY_DATABASE = var.snowflake_royalty_database },
    { SNOWFLAKE_ROYALTY_SCHEMA = var.snowflake_royalty_schema },
    { S3_SALES_BUCKET_NAME = var.s3_sales_bucket }
  ]
}

# ows-royalties-workflows
# module "s3_dev_royalties_airflow_logs_bucket" {
#   source          = "git@github.com:theorchard/terraform-s3.git//modules/s3_bucket?ref=2.2.0"
#   env             = var.environment
#   bucket_name     = "royalties-airflow-logs"
#   kms_key_enabled = false
# }

module "s3_dev_abacus_static_data_bucket" {
  source                                  = "git@github.com:theorchard/terraform-s3.git//modules/s3_bucket?ref=2.2.0"
  env                                     = var.environment
  bucket_name                             = "abacus-static-data"
  kms_key_enabled                         = false
  apply_server_side_encryption_by_default = {}
}

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

  environment         = var.environment
  service_name        = "ows-royalties-workflows"
  aws_region          = var.aws_region
  desired_task_count  = 1
  minimum_capacity    = 1
  maximum_capacity    = 1
  task_cpu            = 2048
  task_memory         = 8192
  autoscaling_enabled = false
  health_check_path   = "/admin/sales-processing/"
  vpc_id              = var.vpc_id

  datadog_function_destination_arn = var.dd_arn
  fargate_service_subnets          = var.subnets
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  environment_variables = [
    { Environment = var.environment },
    # TODO - define PG DB here
    { POSTGRES_HOST = "dev-ows-royalties-workflows.co2yckwm6hcp.us-east-1.rds.amazonaws.com" },
    { POSTGRES_USER = "postgres" },
    { POSTGRES_PASSWORD = "welcomehome" },
    { POSTGRES_PORT = "5432" },
    { POSTGRES_DB = "airflow" },
    { HISTORICAL_ISO_CODES = var.historical_iso_codes },
    { OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map },
    { FORCE_HTTPS = "1" },
    { DATADOG_TRACE_ENABLED = "FALSE" },
    { EXECUTOR = "Local" },
    { LOAD_EX = "n" },
    { AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX = "True" },
    { AIRFLOW__CORE__REMOTE_BASE_LOG_FOLDER = "s3://${var.environment}-royalties-airflow-logs" },
    { SNOWFLAKE_USER = var.snowflake_user },
    { SNOWFLAKE_SCHEMA = var.snowflake_schema },
    { SNOWFLAKE_WAREHOUSE = var.snowflake_warehouse },
    { SNOWFLAKE_ACCOUNT = var.snowflake_account },
    { SNOWFLAKE_DATABASE = var.snowflake_database },
    { SNOWFLAKE_ROLE = var.snowflake_role },
    { SNOWFLAKE_PASSWORD = var.snowflake_password },
    { S3_SALES_BUCKET_NAME = var.s3_sales_bucket },
    { S3_STATIC_DATA_BUCKET_NAME = "${var.environment}-abacus-static-data" },
    { AIRFLOW__CORE__FERNET_KEY = "I9xQStKl6bVwxoPMcZT_rrk1w86ampk75KAphIotFNg=" },
    { AIRFLOW__WEBSERVER__SECRET_KEY = "448c1beb6f911de318e663608150da55f04ba19ec50c6fcc907eb5d903ff" },
    { OWS_ENV = var.environment },
    { REPORTS_PARQUET_STAGE = var.snowflake_stage },
    { ROYALTY_TSV_STAGE = var.snowflake_stage },
    { ROYALTY_PARQUET_STAGE = var.snowflake_stage },
    { ROYALTY_TSV_STAGE_2 = var.snowflake_stage },
    { SNAPSHOT_CONTRACT_LAMBDA_NAME = "dev-lambda-abacus-snapshot-contract" },
    { SNAPSHOT_ADJUSTMENTS_LAMBDA_NAME = "dev-lambda-abacus-snapshot-adjustments" },
    { SNAPSHOT_EXCHANGE_RATES_LAMBDA_NAME = "dev-lambda-abacus-snapshot-exchange-rates" }

  ]
}

# lambda-abacus-snapshot-exchange-rates
module "lambda_abacus_snapshot_exchange_rates" {
  source = "git@github.com:theorchard/terraform-lambda.git//?ref=1.1.1"

  environment             = var.environment
  lambda_function_timeout = 900
  use_container_image     = true
  vpc_security_group_ids  = var.vpc_security_group_ids
  lambda_description      = "Combine exchange rates and terms data in parquet format"
  lambda_name             = "lambda-abacus-snapshot-exchange-rates"
  vpc_subnet_ids          = var.subnets

  lambda_function_reserved_concurrent_executions = 1
  lambda_function_memory_size                    = 1024
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  lambda_function_environment_variables = {
    ENVIRONMENT            = var.environment,
    S3_BUCKET_SALES        = var.s3_sales_bucket,
    HISTORICAL_ISO_CODES   = var.historical_iso_codes,
    OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map
    FORCE_HTTPS = "1"
  }
}

# lambda-abacus-snapshot-contract
module "lambda_abacus_snapshot_contract" {
  source = "git@github.com:theorchard/terraform-lambda.git//?ref=1.1.1"

  environment             = var.environment
  lambda_function_timeout = 900
  use_container_image     = true
  vpc_security_group_ids  = var.vpc_security_group_ids
  lambda_description      = ""
  lambda_name             = "lambda-abacus-snapshot-contract"
  vpc_subnet_ids          = var.subnets

  lambda_function_reserved_concurrent_executions = 1
  lambda_function_memory_size                    = 1024
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  lambda_function_environment_variables = {
    ENVIRONMENT            = var.environment,
    S3_BUCKET_SALES        = var.s3_sales_bucket,
    HISTORICAL_ISO_CODES   = var.historical_iso_codes,
    OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map,
    FORCE_HTTPS = "1"
  }
}

# lambda-abacus-snapshot-adjustments
module "lambda_abacus_snapshot_adjustments" {
  source = "git@github.com:theorchard/terraform-lambda.git//?ref=1.1.1"

  environment             = var.environment
  lambda_function_timeout = 900
  use_container_image     = true
  vpc_security_group_ids  = var.vpc_security_group_ids
  lambda_description      = ""
  lambda_name             = "lambda-abacus-snapshot-adjustments"
  vpc_subnet_ids          = var.subnets

  lambda_function_reserved_concurrent_executions = 1
  lambda_function_memory_size                    = 1024
  iam_managed_policy_attachments = [
    aws_iam_policy.task_dev_access.arn
  ]
  lambda_function_environment_variables = {
    ENVIRONMENT            = var.environment,
    S3_BUCKET_SALES        = var.s3_sales_bucket,
    HISTORICAL_ISO_CODES   = var.historical_iso_codes,
    OWSREQUEST_SERVICE_MAP = var.owsrequest_service_map
    FORCE_HTTPS = "1"
  }
}

data "aws_iam_policy_document" "dev_general_access" {
  statement {
    effect = "Allow"
    resources = [
      "arn:aws:s3:::${var.environment}-abacus-static-data",
      "arn:aws:s3:::${var.environment}-abacus-static-data/*",
      "arn:aws:s3:::${var.environment}-royalties-sales-files",
      "arn:aws:s3:::${var.environment}-royalties-sales-files/*"
    ]
    actions = [
      "s3:AbortMultipartUpload",
      "s3:DeleteObject",
      "s3:DeleteObjectVersion",
      "s3:GetBucketLocation",
      "s3:GetBucketVersioning",
      "s3:GetLifecycleConfiguration",
      "s3:GetObject",
      "s3:GetObjectAcl",
      "s3:GetObjectTorrent",
      "s3:GetObjectVersion",
      "s3:CopyObject",
      "s3:GetObjectVersionAcl",
      "s3:GetObjectVersionTorrent",
      "s3:GetReplicationConfiguration",
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads",
      "s3:ListBucketVersions",
      "s3:ListMultipartUploadParts",
      "s3:PutObject",
      "s3:PutObjectAcl",
      "s3:PutObjectVersionAcl",
      "s3:ReplicateDelete",
      "s3:ReplicateObject",
      "s3:RestoreObject",
      "s3:ListAllMyBuckets"
    ]
  }
  statement {
    effect = "Allow"
    resources = [
      module.lambda_abacus_snapshot_adjustments.lambda_arn,
      module.lambda_abacus_snapshot_contract.lambda_arn,
      module.lambda_abacus_snapshot_exchange_rates.lambda_arn
    ]
    actions = [
      "lambda:InvokeFunction"
    ]
  }
}
resource "aws_iam_policy" "task_dev_access" {
  name   = "dev-abacus-policy"
  policy = data.aws_iam_policy_document.dev_general_access.json
}

# EMR

data "template_file" "emr_configurations" {
  template = "${file("default.json")}"
}

data "aws_vpc" "dev" {
  tags = {
    Name = "dev"
  }
}
data "aws_subnet_ids" "private1" {
  vpc_id = "${data.aws_vpc.dev.id}"
}

# Private subnet for TCP 8998 access
data "aws_subnet_ids" "private_subnets" {
  vpc_id = "${data.aws_vpc.dev.id}"
}

# This syntax is required until https://github.com/terraform-providers/terraform-provider-aws/issues/7522 is resolved
data "aws_subnet" "private_subnets" {
  count = "${length(data.aws_subnet_ids.private_subnets.ids)}"
  id    = element(tolist(data.aws_subnet_ids.private_subnets.ids), count.index)
}

# resource "aws_s3_bucket_object" "bootstrapscript" {
#   bucket = "dev-orcdbucket1"
#   key    = "/royalties${var.bootstrap_script_name}"
#   source = "royalties/scripts/${var.bootstrap_script_name}"
# }

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

  environment   = "${var.environment}"
  service_name  = "abacus"
  release_label = "emr-5.29.0"

  applications = [
    "Hadoop",
    "Hive",
    "Pig",
    "Hue",
    "Spark",
    "Ganglia",
    "Livy",
    "Sqoop",
  ]
  emr_service_role_arn         = var.emr_service_role_arn
  emr_ec2_instance_profile_arn = var.emr_ec2_instance_profile_arn
  configurations               = "${data.template_file.emr_configurations.rendered}"
  key_name                     = "jfidlow5"
  subnet_id                    = sort(data.aws_subnet_ids.private1.ids)[0]

  job_flow_keep_alive = true

  master_instance_group_name           = "MasterInstanceGroup"
  master_instance_group_instance_type  = "m5.xlarge"
  master_instance_group_instance_count = "1"
  dev_8998_listener_allow_cidr_blocks = concat(
    data.aws_subnet.private_subnets.*.cidr_block,
    var.livy_ui_ip_origins
  )
  route53_zone_id = var.route53_zone_id
  master_instance_group_ebs_size = "64"
  master_instance_group_ebs_type = "gp2"

  core_instance_group_name           = "CoreInstanceGroup"
  core_instance_group_instance_type  = "m5.xlarge"
  core_instance_group_instance_count = "2"
  core_instance_group_ebs_size       = "64"

  bootstrap_name = "custom_royalties_s3_action"
  bootstrap_uri  = var.bootstrap_uri
  bootstrap_args = []
  log_uri        = "s3://aws-logs-103233932089-us-east-1/elasticmapreduce/dev-royalties/"
}
