terraform {
  backend "s3" {
    bucket  = "orcd-terraform-state"
    key     = "prod/datadog/on-call/devops/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }
}

data "datadog_team" "team" {
  filter_keyword = "Devops Squad"
}

data "datadog_user" "on_call_team_users" {
  for_each                 = toset(var.on_call_users)
  filter                   = each.value
  exclude_service_accounts = true
}

data "datadog_user" "support_users" {
  for_each                 = toset(var.support_users)
  filter                   = each.value
  exclude_service_accounts = true
}

resource "datadog_on_call_schedule" "schedule" {
  name      = "DevOps On-call Schedule"
  time_zone = "America/New_York"
  teams     = [data.datadog_team.team.id]
  layer {
    name           = "Layer 1"
    effective_date = "2025-02-10T14:45:11Z"
    rotation_start = "2025-02-04T22:00:00Z"
    interval {
      days    = 7
      seconds = 0
    }
    users = [for user in data.datadog_user.on_call_team_users : user.id]
  }
}

resource "datadog_on_call_escalation_policy" "escalation_policy" {
  name = "Devops Escalation Policy"
  teams = [
    data.datadog_team.team.id,
  ]
  resolve_page_on_policy_end = false
  retries                    = 5
  step {
    assignment             = "default"
    escalate_after_seconds = 900
    target {
      schedule = datadog_on_call_schedule.schedule.id
    }
  }
  step {
    assignment             = "default"
    escalate_after_seconds = 1800
    target {
      user = data.datadog_user.on_call_team_users["artur@sonymusic-pde.com"].id
    }
    target {
      user = data.datadog_user.on_call_team_users["rdemoose@sonymusic-pde.com"].id
    }
  }
}

resource "datadog_on_call_team_routing_rules" "routing_rules" {
  id = data.datadog_team.team.id

  rule {
    escalation_policy = datadog_on_call_escalation_policy.escalation_policy.id
    urgency           = "dynamic"
  }
}

# Support Rotations
# Each schedule is a flat rotation of all 11 people with the same order but offsets of 3, 6 and 9 weeks.
# Pattern for individuals is 1 week on, 2 weeks off, 1 week on, 2 weeks off, 1 week on, 2 weeks off, 1 week on, 1 week off.
# Order is optimized for balanced distribution of time zones. Weeks 2 and 5 have 3 people from EU and 1 from US, every other week is 2 from EU and 2 from US.
resource "datadog_on_call_schedule" "support_schedule" {
  count = 4

  name      = "Devops (Working Hours) Support Rotation ${count.index + 1}"
  teams     = [data.datadog_team.team.id]
  time_zone = "UTC"

  layer {
    name = "Layer 1"
    users = [
      # The modulo operator ensures the rotation wraps around the list of users, creating a continuous cycle.
      for i in range(length(var.support_users)) : data.datadog_user.support_users[var.support_users[(i + (count.index * 3)) % length(var.support_users)]].id
    ]
    effective_date = "2026-05-26T08:00:00Z"
    rotation_start = "2026-05-26T08:00:00Z"
    interval {
      days    = 7
      seconds = 0
    }
  }
}
