# locals {
#   artistapp_api_secrets_list = [
#     "INTERCOM_API_AUTH_TOKEN",
#     "SENTRY_DSN",
#   ]
#
#   delphi_api_stage_credentials = {
#     DELPHI_API_CLIENT_ID     = aws_secretsmanager_secret.common_secret["DELPHI_API_CLIENT_ID_STAGE"]
#     DELPHI_API_CLIENT_SECRET = aws_secretsmanager_secret.common_secret["DELPHI_API_CLIENT_SECRET_STAGE"]
#   }
#
#   delphi_api_prod_credentials = {
#     DELPHI_API_CLIENT_ID     = aws_secretsmanager_secret.common_secret["DELPHI_API_CLIENT_ID_PROD"]
#     DELPHI_API_CLIENT_SECRET = aws_secretsmanager_secret.common_secret["DELPHI_API_CLIENT_SECRET_PROD"]
#   }
#
#   artistapp_api_delphi_stage_secrets_mapping = [
#     for k, v in merge(aws_secretsmanager_secret.artistapp_api_secret, local.delphi_api_stage_credentials) :
#     {
#       name      = k,
#       valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
#     }
#   ]
#
#   artistapp_api_delphi_prod_secrets_mapping = [
#     for k, v in merge(aws_secretsmanager_secret.artistapp_api_secret, local.delphi_api_prod_credentials) :
#     {
#       name      = k,
#       valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
#     }
#   ]
#
#   artistapp_api_env_vars = [
#     {
#       name  = "ATLAS_API_URL",
#       value = "https://images-api.atlas.stream"
#     },
#     {
#       name  = "AUTH0_AUDIENCE",
#       value = "https://qa-api.sma.stream"
#     },
#     {
#       name  = "AUTH0_ISSUER",
#       value = "https://sme-dna.auth0.com"
#     },
#     {
#       name  = "IMAGES_MAPPING_BUCKET",
#       value = "prod-core-images-mapping"
#     },
#     {
#       name  = "USER_PREFERENCES_URL",
#       value = "https://${module.domains.dev_insights["user-preferences"]}"
#     },
#     {
#       name  = "INTERCOM_BULLETINS_COLLECTION_ID",
#       value = "2745698"
#     },
#     {
#       name  = "RTI_SERVER_ENVIRONMENT",
#       value = local.environment
#     },
#     {
#       name  = "ALLOWED_CORS_ORIGINS",
#       value = "https://${module.domains.dev_sma["amadeus"]},https://${module.domains.dev_insights["amadeus"]}"
#     },
#     {
#       name  = "RTI_AMADEUS_RESPONSE_TIMEOUT",
#       value = "120000"
#     }
#   ]
# }
#
# 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                  = "Portal",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PRL_ECS"
    }
  )
}

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

  env_prefix         = local.env_prefix
  project_group      = local.project_group
  family             = "${local.name_prefix}-api-stage-no-cache"
  container_name     = "api"
  container_image    = "${data.aws_ecr_repository.artistapp_api_ecr.repository_url}:qa"
  cpu                = 1024
  memory             = 2048
  awslogs_group_name = "${local.name_prefix}-api-stage-no-cache"
  awslogs_retention  = module.logs_retention[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 = concat(
    local.artistapp_api_env_vars,
    [
      {
        name  = "DELPHI_API_URL",
        value = "https://stage-delphi-api.delphiplatform.io/v3"
      }
    ]
  )
  secrets = local.artistapp_api_delphi_stage_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
    }
  ]

  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_stage_mobile_no_cache_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix         = local.env_prefix
  project_group      = local.project_group
  family             = "${local.name_prefix}-api-stage-mobile-no-cache"
  container_name     = "api"
  container_image    = "${data.aws_ecr_repository.artistapp_api_ecr.repository_url}:qa"
  cpu                = 1024
  memory             = 2048
  awslogs_group_name = "${local.name_prefix}-api-stage-mobile-no-cache"
  awslogs_retention  = module.logs_retention[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 = concat(
    local.artistapp_api_env_vars,
    [
      {
        name  = "DELPHI_API_URL",
        value = "https://stage-mobile-delphi-api.delphiplatform.io/v3"
      }
    ]
  )
  secrets = local.artistapp_api_delphi_stage_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
    }
  ]

  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_prod_no_cache_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix         = local.env_prefix
  project_group      = local.project_group
  family             = "${local.name_prefix}-api-prod-no-cache"
  container_name     = "api"
  container_image    = "${data.aws_ecr_repository.artistapp_api_ecr.repository_url}:qa"
  cpu                = 1024
  memory             = 2048
  awslogs_group_name = "${local.name_prefix}-api-prod-no-cache"
  awslogs_retention  = module.logs_retention[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 = concat(
    local.artistapp_api_env_vars,
    [
      {
        name  = "DELPHI_API_URL",
        value = "https://delphi-api.delphiplatform.io/v3"
      }
    ]
  )
  secrets = local.artistapp_api_delphi_prod_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
    }
  ]

  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_stage_with_cache_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix         = local.env_prefix
  project_group      = local.project_group
  family             = "${local.name_prefix}-api-stage-with-cache"
  container_name     = "api"
  container_image    = "${data.aws_ecr_repository.artistapp_api_ecr.repository_url}:qa"
  cpu                = 1024
  memory             = 2048
  awslogs_group_name = "${local.name_prefix}-api-stage-with-cache"
  awslogs_retention  = module.logs_retention[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 = concat(
    local.artistapp_api_env_vars,
    [
      {
        name  = "DELPHI_API_URL",
        value = "https://stage-delphi-api-ext.delphiplatform.io/v3"
      }
    ]
  )
  secrets = local.artistapp_api_delphi_stage_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
    }
  ]

  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_stage_mobile_with_cache_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix         = local.env_prefix
  project_group      = local.project_group
  family             = "${local.name_prefix}-api-stage-mobile-with-cache"
  container_name     = "api"
  container_image    = "${data.aws_ecr_repository.artistapp_api_ecr.repository_url}:qa"
  cpu                = 1024
  memory             = 2048
  awslogs_group_name = "${local.name_prefix}-api-stage-mobile-with-cache"
  awslogs_retention  = module.logs_retention[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 = concat(
    local.artistapp_api_env_vars,
    [
      {
        name  = "DELPHI_API_URL",
        value = "https://stage-mobile-delphi-api-ext.delphiplatform.io/v3"
      }
    ]
  )
  secrets = local.artistapp_api_delphi_stage_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
    }
  ]

  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_prod_with_cache_task_def" {
  source = "../../../modules/ecs/tasks/fargate_v3"

  env_prefix         = local.env_prefix
  project_group      = local.project_group
  family             = "${local.name_prefix}-api-prod-with-cache"
  container_name     = "api"
  container_image    = "${data.aws_ecr_repository.artistapp_api_ecr.repository_url}:qa"
  cpu                = 1024
  memory             = 2048
  awslogs_group_name = "${local.name_prefix}-api-prod-with-cache"
  awslogs_retention  = module.logs_retention[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 = concat(
    local.artistapp_api_env_vars,
    [
      {
        name  = "DELPHI_API_URL",
        value = "https://delphi-api-ext.delphiplatform.io/v3"
      }
    ]
  )
  secrets = local.artistapp_api_delphi_prod_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
    }
  ]

  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"
    }
  )
}



resource "aws_lb_target_group" "api" {
  name                 = "${local.name_prefix}-api"
  port                 = 8080
  protocol             = "HTTP"
  vpc_id               = data.aws_vpc.main.id
  deregistration_delay = 60
  target_type          = "ip"

  health_check {
    path     = "/_health"
    port     = "traffic-port"
    protocol = "HTTP"
    matcher  = "200"
  }

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

module "alb_rules" {
  source             = "../../../modules/ec2/alb/https_rule_with_redirect"
  https_listener_arn = data.aws_lb_listener.external_https_listener.arn
  tg_arn             = aws_lb_target_group.api.arn
  host-header        = module.domains["${local.env_prefix}_sma"]["api"]
}

resource "aws_ecs_service" "main" {
  name             = "${local.name_prefix}-api"
  cluster          = data.aws_ecs_cluster.main.arn
  task_definition  = module.artistapp_stage_with_cache_task_def.arn
  launch_type      = "FARGATE"
  platform_version = "1.4.0"
  desired_count    = 1

  enable_ecs_managed_tags = true
  propagate_tags          = "TASK_DEFINITION"

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

  load_balancer {
    target_group_arn = aws_lb_target_group.api.arn
    container_name   = "api"
    container_port   = 8080
  }

  network_configuration {
    subnets          = data.aws_subnets.private_subnets.ids
    security_groups  = [data.aws_security_group.main.id]
    assign_public_ip = false
  }

  lifecycle {
    ignore_changes = [
      desired_count,
      task_definition,
    ]
  }
}

resource "aws_route53_record" "api_apollo_record" {
  zone_id = data.aws_route53_zone.sma_stream_zone.zone_id
  name    = module.domains["${local.env_prefix}_sma"]["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
  }

  provider = aws.gdb-artistapp-prod
}
*/
/* migration from sma.stream to insights.stream */
/*
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
  }

  provider = aws.gdb-artistapp-prod
}
*/
// 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 = aws_lb_target_group.api.arn
  }

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