/*
locals {
  artistapp_api_secrets_list = [
    "DELPHI_API_CLIENT_ID",
    "DELPHI_API_CLIENT_SECRET",
    "INTERCOM_API_AUTH_TOKEN",
    "SENTRY_DSN",
  ]

  artistapp_api_secrets_mapping = [
    for k, v in aws_secretsmanager_secret.artistapp_api_secret :
    {
      name      = k,
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
    }
  ]

  artistapp_api_env_vars = [
    {
      name  = "DELPHI_API_URL",
      value = "https://delphi-api-ext.delphiplatform.io/v3"
    },
    {
      name  = "ATLAS_API_URL",
      value = "https://images-api.atlas.stream"
    },
    {
      name  = "ATLASUM_ISSUER",
      value = "https://static-um.atlas.stream"
    },
    {
      name  = "AUTH0_AUDIENCE",
      value = "https://api.sma.stream"
    },
    {
      name  = "AUTH0_ISSUER",
      value = "https://prod-dna-apps.auth0.com"
    },
    {
      name  = "IMAGES_MAPPING_BUCKET",
      value = "prod-core-images-mapping"
    },
    {
      name  = "USER_PREFERENCES_URL",
      value = "http://user-preferences.${local.env_prefix}.${local.project_group}.local:8080"
    },
    {
      name  = "INTERCOM_BULLETINS_COLLECTION_ID",
      value = "2732115"
    },
    {
      name  = "RTI_SERVER_ENVIRONMENT",
      value = local.environment
    },
    {
      name  = "ALLOWED_CORS_ORIGINS",
      value = "https://${module.domains.prod_sma["website"]},https://${module.domains.prod_insights["website"]}"
    },
    {
      name  = "REDIS_URL",
      value = "rediss://${data.aws_elasticache_replication_group.main.primary_endpoint_address}:${data.aws_elasticache_replication_group.main.port}/0?ssl_cert_reqs=none"
    },
    {
      name  = "RTI_AMADEUS_RESPONSE_TIMEOUT",
      value = "120000"
    }
  ]
}

data "aws_ecr_repository" "artistapp_api_ecr" {
  name     = "artistapp/api"
  provider = aws.gdb-artistapp-dev
}

resource "aws_secretsmanager_secret" "artistapp_api_secret" {
  for_each = toset(local.artistapp_api_secrets_list)

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

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

module "artistapp_api_ecs_role" {
  source = "../../../modules/iam/roles/ecs_task_role"

  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "api_ecs_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-ro.arn,
    data.aws_iam_policy.logging_policy.arn,
    data.aws_iam_policy.images_mapping_ro.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "API",
      service                  = "IAM",
      plat_env_project_service = "${local.aggregated_tag}_API_IAM"
    }
  )
}

module "artistapp_api_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix      = local.env_prefix
  project_group   = local.project_group
  family          = "${local.env_prefix}-${local.project_group}-api"
  container_name  = "api"
  container_image = "${data.aws_ecr_repository.artistapp_api_ecr.repository_url}:master"
  cpu             = 1024
  memory          = 2048

  awslogs_retention = module.cloudwatch_logs_retention_by_env[local.env_prefix]

  task_role_arn = module.artistapp_api_ecs_role.role.arn
  exec_role_arn = data.aws_iam_role.ecs_tasks_execution_role.arn

  env_vars = local.artistapp_api_env_vars
  secrets  = local.artistapp_api_secrets_mapping

  datadog_enabled    = true
  dd_apm_enabled     = true
  dd_logs_injection  = true
  dd_container_image = "public.ecr.aws/datadog/agent:latest"
  dd_awslogs_group   = aws_cloudwatch_log_group.datadog-agent.name

  dd_secrets = [
    {
      name      = "DD_API_KEY",
      valueFrom = aws_secretsmanager_secret.common_secret["DD_API_KEY"].arn
    }
  ]

  dd_env_vars = [
    {
      name  = "DD_APM_IGNORE_RESOURCES",
      value = "GET /_health"
    },
    {
      name  = "DD_TAGS",
      value = "service:artistapp-api application_family:rti"
    },
  ]

  port_mappings = [
    {
      containerPort = 8080
      hostPort      = 8080
      protocol      = "tcp"
    }
  ]

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

module "artistapp_api_service" {
  source = "../../../modules/ecs/services/service_taskless_v2"

  env_prefix    = local.env_prefix
  project       = "api"
  project_group = local.project_group

  cluster_arn   = data.aws_ecs_cluster.main.arn
  desired_count = 1

  security_groups = [data.aws_security_group.main.id]
  subnets         = data.aws_subnets.private_subnets.ids
  vpc_id          = data.aws_vpc.main.id

  route53_zone_id = data.aws_route53_zone.sma_stream_zone.zone_id
  alb_dns_name    = data.aws_lb.external_alb.dns_name
  alb_zone_id     = data.aws_lb.external_alb.zone_id

  task_definition_arn = module.artistapp_api_task_def.arn

  alb_enabled             = true
  https_listener_arn      = data.aws_lb_listener.external_https_listener.arn
  tg_health_check_path    = "/_health"
  tg_health_check_matcher = "200"
  container_port          = 8080
  // TODO: update URL after migration to insights.stream
  url = module.domains["${local.env_prefix}_sma"]["api"]

  sd_enabled   = true
  namespace_id = aws_service_discovery_private_dns_namespace.main.id

  enable_ecs_managed_tags = true

  common_tags = merge(
    local.common_tags,
    {
      project                  = "API",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_API_ECS",
      service_name             = "artistapp-api"
    }
  )
}

module "artistapp_api_appautoscaling" {
  source        = "../../../modules/appautoscaling/ecs"
  env_prefix    = local.env_prefix
  max_capacity  = 10
  min_capacity  = 2
  project       = "api"
  project_group = local.project_group
  resource_id   = "service/${data.aws_ecs_cluster.main.cluster_name}/${module.artistapp_api_service.ecs_service.name}"
}


resource "aws_cloudwatch_metric_alarm" "artistapp_api_high_usage_alarm" {
  alarm_name          = "${local.name_prefix}-api-high_usage"
  alarm_description   = "Memory/CPU usage is higher than threshold."
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = 1
  threshold           = 1
  actions_enabled     = true
  alarm_actions       = [module.artistapp_api_appautoscaling.scaling_up_policy.arn]

  metric_query {
    id          = "check_thresholds"
    expression  = "(cpu >= 30 OR memory >= 60)"
    label       = "CPU and Memory utilization limits"
    return_data = true
  }

  metric_query {
    id          = "cpu"
    return_data = false

    metric {
      metric_name = "CPUUtilization"
      namespace   = "AWS/ECS"
      period      = "60"
      stat        = "Average"

      dimensions = {
        ClusterName = data.aws_ecs_cluster.main.cluster_name
        ServiceName = module.artistapp_api_service.ecs_service.name
      }
    }
  }

  metric_query {
    id          = "memory"
    return_data = false

    metric {
      metric_name = "MemoryUtilization"
      namespace   = "AWS/ECS"
      period      = "60"
      stat        = "Average"

      dimensions = {
        ClusterName = data.aws_ecs_cluster.main.cluster_name
        ServiceName = module.artistapp_api_service.ecs_service.name
      }
    }
  }
}

resource "aws_cloudwatch_metric_alarm" "artistapp_api_low_usage_alarm" {
  alarm_name          = "${local.name_prefix}-api_low_usage"
  alarm_description   = "Memory/CPU usage is lower than threshold."
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = 3
  threshold           = 1
  actions_enabled     = true
  alarm_actions       = [module.artistapp_api_appautoscaling.scaling_down_policy.arn]

  metric_query {
    id          = "check_thresholds"
    expression  = "(cpu < 10 AND memory < 40)"
    label       = "CPU and Memory utilization limits"
    return_data = true
  }

  metric_query {
    id          = "memory"
    return_data = false

    metric {
      metric_name = "MemoryUtilization"
      namespace   = "AWS/ECS"
      period      = "180"
      stat        = "Average"

      dimensions = {
        ClusterName = data.aws_ecs_cluster.main.cluster_name
        ServiceName = module.artistapp_api_service.ecs_service.name
      }
    }
  }

  metric_query {
    id          = "cpu"
    return_data = false

    metric {
      metric_name = "CPUUtilization"
      namespace   = "AWS/ECS"
      period      = "180"
      stat        = "Average"

      dimensions = {
        ClusterName = data.aws_ecs_cluster.main.cluster_name
        ServiceName = module.artistapp_api_service.ecs_service.name
      }
    }
  }
}

resource "aws_route53_record" "api_insights_record" {
  zone_id = data.aws_route53_zone.insights_stream_zone.zone_id
  name    = module.domains["${local.env_prefix}_insights"]["api"]
  type    = "A"
  alias {
    name                   = data.aws_lb.external_alb.dns_name
    zone_id                = data.aws_lb.external_alb.zone_id
    evaluate_target_health = false
  }
}

// TODO: remove after configuration update for the service
resource "aws_alb_listener_rule" "api_insights_listener_rule" {
  listener_arn = data.aws_lb_listener.external_https_listener.arn

  action {
    type             = "forward"
    target_group_arn = module.artistapp_api_service.tg_arn
  }

  condition {
    host_header {
      values = [module.domains["${local.env_prefix}_insights"]["api"]]
    }
  }
}
*/
