# AWS Batch part
data "aws_kms_alias" "default_ebs" {
  name = "alias/default_ebs"
}

module "batch_service_role" {
  source      = "../../../modules/iam/roles/batch_role"
  name_prefix = local.name_prefix
  name        = "BatchServiceRole"
}

# create policy which will allow instance to change its health status
data "aws_iam_policy_document" "ecs_instance_policy" {
  statement {
    sid    = "AllowSetHealthActions"
    effect = "Allow"

    actions = [
      "autoscaling:SetInstanceHealth",
    ]

    resources = [
      "arn:aws:autoscaling:${var.aws_region_id}:${local.account_id}:autoScalingGroup:*:autoScalingGroupName/${local.name_prefix}-*"
    ]
  }
  statement {
    sid    = "AllowTerminateItself"
    effect = "Allow"

    actions = [
      "ec2:TerminateInstances",
    ]

    resources = [
      "arn:aws:ec2:${var.aws_region_id}:${local.account_id}:instance/$${ec2:InstanceId}"
    ]
  }
}

resource "aws_iam_policy" "ecs_instance_policy" {
  name        = "${local.name_prefix}-batch-as-policy"
  description = "Allows EC2 instance in AS group to perform SetInstanceHealth on itself"
  policy      = data.aws_iam_policy_document.ecs_instance_policy.json
}

module "ecs_instance_role" {
  source        = "../../../modules/iam/roles/ecs_instance_role"
  name_prefix   = local.name_prefix
  name          = "EcsInstanceRole"
  policies_list = [aws_iam_policy.ecs_instance_policy.arn]
}

module "spot_fleet_role" {
  source      = "../../../modules/iam/roles/spot_fleet_role"
  name_prefix = local.name_prefix
  name        = "SpotFleetRole"
}

module "compute_env_ec2" {
  source             = "../../../modules/batch/compute_env/ec2_lt"
  env_prefix         = lower(var.platform["prefix"])
  project_group      = lower(var.platform["name"])
  name               = "standard"
  batch_service_role = module.batch_service_role.role.arn
  instance_role      = module.ecs_instance_role.profile.arn
  instance_types     = ["c5.2xlarge"]
  max_vcpus          = 200
  min_vcpus          = 8
  ec2_key_pair       = var.key_pair_name
  security_groups    = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets            = module.main_private_subnets.subnet_ids
  disk2_size         = 105
  docker_pool_disk   = 50
  kms_key_arn        = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_EC2"
  })
}

module "compute_env_spot" {
  source              = "../../../modules/batch/compute_env/spot_lt"
  env_prefix          = lower(var.platform["prefix"])
  project_group       = lower(var.platform["name"])
  name                = "spot"
  batch_service_role  = module.batch_service_role.role.arn
  spot_iam_fleet_role = module.spot_fleet_role.role.arn
  instance_role       = module.ecs_instance_role.profile.arn
  instance_types      = ["m5.xlarge", "m5a.xlarge", "m5n.xlarge", "c5.2xlarge", "c5n.2xlarge", ]
  bid_percentage      = 99
  max_vcpus           = 200
  min_vcpus           = 0
  ec2_key_pair        = var.key_pair_name
  security_groups     = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets             = module.main_private_subnets.subnet_ids
  disk2_size          = 105
  docker_pool_disk    = 50
  kms_key_arn         = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_SPOT"
  })
}

module "compute_env_fallback" {
  source             = "../../../modules/batch/compute_env/ec2_lt"
  env_prefix         = lower(var.platform["prefix"])
  project_group      = lower(var.platform["name"])
  name               = "fallback"
  batch_service_role = module.batch_service_role.role.arn
  instance_role      = module.ecs_instance_role.profile.arn
  instance_types     = ["m5.xlarge", "m5a.xlarge", "m5n.xlarge", "c5.2xlarge", "c5n.2xlarge", ]
  max_vcpus          = 24
  min_vcpus          = 0
  ec2_key_pair       = var.key_pair_name
  security_groups    = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets            = module.main_private_subnets.subnet_ids
  disk2_size         = 105
  docker_pool_disk   = 50
  kms_key_arn        = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_FALLBACK"
  })
}


// DS-6975 - out of Memory issue.
module "compute_env_ec2_m5xlarge" {
  source             = "../../../modules/batch/compute_env/ec2_lt"
  env_prefix         = lower(var.platform["prefix"])
  project_group      = lower(var.platform["name"])
  name               = "standard_m5_xlarge"
  batch_service_role = module.batch_service_role.role.arn
  instance_role      = module.ecs_instance_role.profile.arn
  instance_types     = ["m5.2xlarge", "m5a.2xlarge"]
  max_vcpus          = 24
  min_vcpus          = 0
  ec2_key_pair       = var.key_pair_name
  security_groups    = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets            = module.main_private_subnets.subnet_ids
  disk2_size         = 105
  docker_pool_disk   = 50
  kms_key_arn        = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_EC2_M5XL"
  })
}


module "batch_job_queue_main" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "main"
  comp_env_arns = {
    0 = module.compute_env_ec2.compute_env.arn,
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_MAIN"
  })
}


module "batch_job_queue_m5xlarge" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "main_m5xlarge"
  comp_env_arns = {
    0 = module.compute_env_ec2_m5xlarge.compute_env.arn,
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_EC2_M5XL"
  })
}


module "batch_job_queue_spot" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "spotqueue"
  comp_env_arns = {
    0 = module.compute_env_spot.compute_env.arn,
    1 = module.compute_env_fallback.compute_env.arn,
  }
  priority = 2
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_SPOT"
  })
}

module "batch_job_queue_hasher" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "hasher"
  comp_env_arns = {
    0 = module.compute_env_spot.compute_env.arn,
    1 = module.compute_env_fallback.compute_env.arn,
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_HASHER"
  })
}

module "batch_job_queue_hasher_long" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "hasher-long"
  comp_env_arns = {
    0 = module.compute_env_spot.compute_env.arn,
    1 = module.compute_env_fallback.compute_env.arn
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_HASHER_LONG"
  })
}

# Maintenance environments and decompress queue
module "compute_env_maintenance_spot" {
  source              = "../../../modules/batch/compute_env/spot_lt"
  env_prefix          = lower(var.platform["prefix"])
  project_group       = lower(var.platform["name"])
  name                = "maintenance-spot"
  batch_service_role  = module.batch_service_role.role.arn
  spot_iam_fleet_role = module.spot_fleet_role.role.arn
  instance_role       = module.ecs_instance_role.profile.arn
  instance_types      = ["m5.xlarge", "m5a.xlarge", "m5n.xlarge", "c5.2xlarge", "c5n.2xlarge", ]
  max_vcpus           = 200
  min_vcpus           = 0
  ec2_key_pair        = var.key_pair_name
  security_groups     = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets             = module.main_private_subnets.subnet_ids
  disk2_size          = 105
  docker_pool_disk    = 50
  kms_key_arn         = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_SPOT_MTNCE"
  })
}

module "compute_env_maintenance_standard" {
  source             = "../../../modules/batch/compute_env/ec2_lt"
  env_prefix         = lower(var.platform["prefix"])
  project_group      = lower(var.platform["name"])
  name               = "maintenance-standard"
  batch_service_role = module.batch_service_role.role.arn
  instance_role      = module.ecs_instance_role.profile.arn
  instance_types     = ["m5.xlarge", "m5a.xlarge", "m5n.xlarge", "c5.2xlarge", "c5n.2xlarge", ]
  max_vcpus          = 200
  min_vcpus          = 0
  ec2_key_pair       = var.key_pair_name
  security_groups    = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets            = module.main_private_subnets.subnet_ids
  disk2_size         = 105
  docker_pool_disk   = 50
  kms_key_arn        = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_EC2_MTNCE"
  })
}

module "batch_job_queue_decompress" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "decompress"
  comp_env_arns = {
    0 = module.compute_env_maintenance_standard.compute_env.arn,
    1 = module.compute_env_maintenance_spot.compute_env.arn,
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_DECMPRS"
  })
}

# BIG DISKS
module "compute_env_ec2_enhanced_storage" {
  source             = "../../../modules/batch/compute_env/ec2_lt"
  env_prefix         = lower(var.platform["prefix"])
  project_group      = lower(var.platform["name"])
  name               = "enhanced-storage"
  batch_service_role = module.batch_service_role.role.arn
  instance_role      = module.ecs_instance_role.profile.arn
  instance_types = [
    "c5.2xlarge", "m5.xlarge", "m5a.xlarge", "m5n.xlarge", "c5.2xlarge", "c5n.2xlarge",
    "c5.xlarge", "m5.large", "m5a.large", "m5n.large", "c5.xlarge", "c5n.xlarge",
  ]
  max_vcpus = 200
  min_vcpus = 0
  #ec2_key_pair     = "batch-debug"
  ec2_key_pair     = var.key_pair_name
  security_groups  = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets          = module.main_private_subnets.subnet_ids
  disk2_size       = 1010
  docker_pool_disk = 500
  kms_key_arn      = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_ENH_STOR"
  })
}

module "batch_job_queue_enhanced_storage" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "enhanced-storage"
  comp_env_arns = {
    0 = module.compute_env_ec2_enhanced_storage.compute_env.arn,
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_ENH_STOR"
  })
}

//hasher env and queues
module "compute_env_utility" {
  source              = "../../../modules/batch/compute_env/spot_lt"
  env_prefix          = lower(var.platform["prefix"])
  project_group       = lower(var.platform["name"])
  name                = "utility"
  batch_service_role  = module.batch_service_role.role.arn
  spot_iam_fleet_role = module.spot_fleet_role.role.arn
  instance_role       = module.ecs_instance_role.profile.arn
  instance_types = [
    "c5.2xlarge", "m5.xlarge", "m5a.xlarge", "m5n.xlarge", "c5.2xlarge", "c5n.2xlarge",
    "c5.xlarge", "m5.large", "m5a.large", "m5n.large", "c5.xlarge", "c5n.xlarge",
  ]
  bid_percentage   = 99
  max_vcpus        = 200
  min_vcpus        = 0
  ec2_key_pair     = var.key_pair_name
  security_groups  = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets          = module.main_private_subnets.subnet_ids
  disk2_size       = 105
  docker_pool_disk = 50
  kms_key_arn      = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_UTLTY"
  })
}

module "batch_job_queue_utility" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "utility"
  comp_env_arns = {
    0 = module.compute_env_utility.compute_env.arn,
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_UTLTY"
  })
}

module "batch_job_queue_utility_long" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "utility-long"
  comp_env_arns = {
    0 = module.compute_env_utility.compute_env.arn,
  }
  priority = 1
  common_tags = merge(local.common_tags, {
    project                  = "SLZ Ingestion",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_SLZI_BTCH_UTLTY_LONG"
  })
}

# DAPD envs and queues queue
module "compute_env_dapd" {
  source             = "../../../modules/batch/compute_env/ec2_lt"
  env_prefix         = lower(var.platform["prefix"])
  project_group      = lower(var.platform["name"])
  name               = "dapd"
  batch_service_role = module.batch_service_role.role.arn
  instance_role      = module.ecs_instance_role.profile.arn
  instance_types = [
    "m5.xlarge", "m5a.xlarge", "m5n.xlarge",
  ]
  max_vcpus        = 200
  min_vcpus        = 16
  ec2_key_pair     = var.key_pair_name
  security_groups  = [module.main_sg_map.management_id, module.main_sg_map.batch_id]
  subnets          = module.main_private_subnets.subnet_ids
  disk2_size       = 105
  docker_pool_disk = 50
  kms_key_arn      = data.aws_kms_alias.default_ebs.target_key_arn
  common_tags = merge(local.common_tags, {
    project                  = "DAPD",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_DAPD_BTCH_EC2"
  })
}

module "batch_job_queue_dapd" {
  source        = "../../../modules/batch/job_queue"
  env_prefix    = lower(var.platform["prefix"])
  project_group = lower(var.platform["name"])
  name          = "dapd"
  priority      = 1

  #scheduling_policy_arn = aws_batch_scheduling_policy.dapd.arn
  comp_env_arns = {
    0 = module.compute_env_dapd.compute_env.arn,
  }

  common_tags = merge(local.common_tags, {
    project                  = "DAPD",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_DAPD_BTCH_EC2"
  })
}

resource "aws_batch_scheduling_policy" "dapd" {
  name = "${local.name_prefix}-dapd"

  fair_share_policy {

    share_distribution {
      share_identifier = "highPriority"
      weight_factor    = 0.25
    }

    share_distribution {
      share_identifier = "mediumPriority"
      weight_factor    = 1.0
    }

    share_distribution {
      share_identifier = "lowPriority"
      weight_factor    = 4.0
    }
  }

  tags = merge(local.common_tags, {
    Name                     = "${local.name_prefix}-dapd",
    project                  = "DAPD",
    service                  = "Batch",
    plat_env_project_service = "${local.aggregated_tag}_DAPD_BTCH_EC2"
  })
}
