locals {
  influxdb_secrets = [
    "INFLUXDB_ADMIN_USER",
    "INFLUXDB_ADMIN_PASSWORD"
  ]
  influxdb_secrets_json = jsonencode(
    [
      for k, v in aws_secretsmanager_secret.influxdb_secret :
      {
        name      = k,
        valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
      }
    ]
  )
}

data "aws_ecs_cluster" "main" {
  cluster_name = "${local.name_prefix}-clu"
}

resource "aws_secretsmanager_secret" "influxdb_secret" {
  for_each = toset(local.influxdb_secrets)

  name       = "${local.secrets_name_prefix}/influxdb/${each.value}"
  kms_key_id = data.aws_kms_key.serviceonly_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

module "influxdb_task_def" {
  source = "../../../modules/ecs/tasks/fargate_efs"

  cpu                  = 2048
  file_system_id       = aws_efs_file_system.influxdb.id
  env_prefix           = local.env_prefix
  image                = "${module.influxdb.ecr.repository_url}:0.0.1"
  memory               = 4096
  project              = "influxdb"
  project_group        = "prodhub"
  task_exec_role_arn   = data.aws_iam_role.ecs_task_runner_role.arn
  task_family          = "${local.name_prefix}-influxdb"
  task_role_arn        = data.aws_iam_role.ecs_task_runner_role.arn
  volume_name          = "influxdb"
  container_port       = 8086
  protocol             = "tcp"
  port_mapping_enabled = true
  secrets              = local.influxdb_secrets_json
  container_path       = "/var/lib/influxdb"

  env_vars = [
    {
      name  = "INFLUXDB_DB",
      value = "influx"
    }
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_INF_ECS"
    }
  )
}

module "influxdb_service" {
  source = "../../../modules/ecs/services/webservice_taskless"

  cluster_arn             = data.aws_ecs_cluster.main.arn
  env_prefix              = local.env_prefix
  project                 = "influxdb"
  project_group           = local.project_group
  subnets                 = data.aws_subnets.private_subnets.ids
  task_count              = 1
  task_definition_arn     = module.influxdb_task_def.ecs_task_definition.arn
  vpc_id                  = data.aws_vpc.main.id
  container_port          = 8086
  tg_port                 = 8086
  is_public               = false
  enable_ecs_managed_tags = true
  url                     = module.domains.dev.influxdb
  https_listener_arn      = data.aws_alb_listener.internal_alb_https.arn
  tg_health_check_path    = "/health"
  tg_health_check_matcher = "200"

  security_groups = [
    data.aws_security_group.influxdb.id,
    data.aws_security_group.efs.id
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Influxdb",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_INF_ECS"
    }
  )
}

locals {
  grafana_secrets = [
    "GF_SECURITY_ADMIN_USER",
    "GF_SECURITY_ADMIN_PASSWORD",
    "GITHUB_CLIENT_ID",
    "GITHUB_CLIENT_SECRET"
  ]
  grafana_secrets_json = jsonencode(
    [
      for k, v in merge(aws_secretsmanager_secret.grafana_secret, aws_secretsmanager_secret.influxdb_secret) :
      {
        name      = k,
        valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
      }
    ]
  )
}

resource "aws_secretsmanager_secret" "jmeter_runtime_secret" {
  name       = "${local.secrets_name_prefix}/jmeter/RUNTIME_CLIENT_SECRETS"
  kms_key_id = data.aws_kms_key.serviceonly_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

resource "aws_secretsmanager_secret" "jmeter_runtime_secret_prod" {
  name       = "${local.secrets_name_prefix}/jmeter/RUNTIME_CLIENT_SECRETS_prod"
  kms_key_id = data.aws_kms_key.serviceonly_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

resource "aws_secretsmanager_secret" "jmeter_runtime_gr_api_key" {
  name       = "${local.secrets_name_prefix}/jmeter/GR_API_KEY"
  kms_key_id = data.aws_kms_key.serviceonly_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

resource "aws_secretsmanager_secret" "grafana_secret" {
  for_each = toset(local.grafana_secrets)

  name       = "${local.secrets_name_prefix}/grafana/${each.value}"
  kms_key_id = data.aws_kms_key.serviceonly_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_INFRA_SCRT"
    }
  )
}

/*
module grafana_renderer_ecs {
  source = "../../modules/ecs/services/webservice"

  cluster_arn             = aws_ecs_cluster.main.arn
  env_prefix              = local.env_prefix
  project                 = "grafana-renderer"
  project_group           = local.project_group
  security_groups         = [module.main_sg_map.grafana_id]
  subnets                 = module.main_private_subnets.subnet_ids
  task_count              = 1
  vpc_id                  = module.main_vpc.vpc_id
  tg_port                 = 8081
  is_public               = false
  enable_ecs_managed_tags = true
  url                     = var.grafana_renderer_url_internal
  https_listener_arn      = module.internal_alb_listener_http.alb_listener.arn
  cpu                     = 1024
  image                   = "grafana/grafana-image-renderer:2.0.0-beta1"
  memory                  = 2048
  task_exec_role_arn      = module.ecs_task_runner_role.role.arn
  task_role_arn           = module.ecs_task_runner_role.role.arn
  container_port          = 8081
  tg_health_check_path    = "/"
  tg_health_check_matcher = "200"
  //secrets                 = local.grafana_secrets_json
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Grafana",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_GFN_ECS"
    }
  )
  env_vars = [
    {
      name  = "ENABLE_METRICS",
      value = "true"
    }
  ]
}
*/

module "grafana_task_def" {
  source = "../../../modules/ecs/tasks/fargate_efs"

  cpu                  = 2048
  file_system_id       = aws_efs_file_system.grafana.id
  env_prefix           = local.env_prefix
  image                = "483193324480.dkr.ecr.us-east-1.amazonaws.com/infra/autotest/grafana:0.0.4"
  memory               = 4096
  project              = "grafana"
  project_group        = "prodhub"
  task_exec_role_arn   = module.ecs_task_with_cloudwatch_role.role.arn
  task_family          = "${local.name_prefix}-grafana"
  task_role_arn        = module.ecs_task_with_cloudwatch_role.role.arn
  volume_name          = "grafana"
  container_port       = 3000
  protocol             = "tcp"
  port_mapping_enabled = true
  secrets              = local.grafana_secrets_json
  container_path       = "/var/lib/grafana"

  env_vars = [
    {
      name  = "GF_INSTALL_PLUGINS",
      value = ""
    },
    {
      name  = "GF_LOG_FILTERS",
      value = "rendering:debug"
    },
    {
      name  = "CALLBACK_ROOT_URL",
      value = "https://${module.domains.dev.grafana}"
    },
    {
      name  = "INFLUXDB_URL",
      value = "http://${module.domains.dev.influxdb}:80"
    },
    {
      name  = "GF_AUTH_GITHUB_ALLOWED_ORGANIZATIONS",
      value = "theorchard"
    },
  ]

  /*
    {
      name  = "GF_RENDERING_SERVER_URL",
      value = "${var.grafana_renderer_url_internal}:80/render"
    },
    {
      name  = "GF_RENDERING_CALLBACK_URL",
      value = "http://${var.grafana_url_internal}:80"
    },
    GF_RENDERING_SERVER_URL: http://renderer:8081/render
    GF_RENDERING_CALLBACK_URL: http://grafana:3000/
    GF_LOG_FILTERS: rendering:debug
    */
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_INF_ECS"
    }
  )
}

module "grafana_service" {
  source = "../../../modules/ecs/services/webservice_taskless"

  cluster_arn   = data.aws_ecs_cluster.main.arn
  env_prefix    = local.env_prefix
  project       = "grafana"
  project_group = local.project_group


  task_count              = 1
  task_definition_arn     = module.grafana_task_def.ecs_task_definition.arn
  vpc_id                  = data.aws_vpc.main.id
  subnets                 = data.aws_subnets.public_subnets.ids
  container_port          = 3000
  tg_port                 = 3000
  is_public               = true
  enable_ecs_managed_tags = true
  url                     = module.domains.dev.grafana
  https_listener_arn      = data.aws_alb_listener.private_alb_https.arn
  tg_health_check_path    = "/login"
  tg_health_check_matcher = "200"

  security_groups = [
    data.aws_security_group.grafana.id,
    data.aws_security_group.efs.id,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Influxdb",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_INF_ECS"
    }
  )
}
