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

# This is a schedule and escalation policy for the accounting area on-call rotation,
# which includes multiple teams
data "datadog_team" "teams" {
  for_each       = toset(var.teams)
  filter_keyword = each.value
}

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

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

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

resource "datadog_on_call_schedule" "schedule" {
  name      = "Accounting Area On-Call Schedule"
  time_zone = "Europe/London"
  teams     = [for team in data.datadog_team.teams : team.id]

  layer {
    name           = "UK"
    time_zone      = "Europe/London"
    effective_date = "2025-11-17T09:20:43Z"
    rotation_start = "2025-11-17T06:00:00Z"

    interval {
      days    = 7
      seconds = 0
    }

    dynamic "restriction" {
      for_each = var.restriction_days
      content {
        start_day  = restriction.value
        start_time = "06:00:00"
        end_day    = restriction.value
        end_time   = "18:00:00"
      }
    }

    users = [for user in data.datadog_user.uk_on_call_team_users : user.id]
  }

  layer {
    name           = "NYC"
    time_zone      = "America/New_York"
    effective_date = "2025-11-17T09:20:43Z"
    rotation_start = "2025-11-10T18:00:00Z"

    interval {
      days    = 7
      seconds = 0
    }

    dynamic "restriction" {
      for_each = [
        { start_day = "sunday", start_time = "18:00:00", end_day = "monday", end_time = "06:00:00" },
        { start_day = "monday", start_time = "18:00:00", end_day = "tuesday", end_time = "06:00:00" },
        { start_day = "tuesday", start_time = "18:00:00", end_day = "wednesday", end_time = "06:00:00" },
        { start_day = "wednesday", start_time = "18:00:00", end_day = "thursday", end_time = "06:00:00" },
        { start_day = "thursday", start_time = "18:00:00", end_day = "friday", end_time = "06:00:00" },
        { start_day = "friday", start_time = "18:00:00", end_day = "saturday", end_time = "06:00:00" },
        { start_day = "saturday", start_time = "18:00:00", end_day = "sunday", end_time = "06:00:00" },
      ]
      content {
        start_day  = restriction.value.start_day
        start_time = restriction.value.start_time
        end_day    = restriction.value.end_day
        end_time   = restriction.value.end_time
      }
    }

    users = [for user in data.datadog_user.ny_on_call_team_users : user.id]
  }
}

resource "datadog_on_call_escalation_policy" "escalation_policy" {
  name                       = "Accounting Area Escalation Policy"
  teams                      = [for team in data.datadog_team.teams : team.id]
  resolve_page_on_policy_end = false
  retries                    = 0

  step {
    assignment             = "default"
    escalate_after_seconds = 1800

    target {
      schedule = datadog_on_call_schedule.schedule.id
    }
  }

  step {
    assignment             = "default"
    escalate_after_seconds = 1800

    target {
      user = data.datadog_user.escalation_users["george.theka@sonymusic-pde.com"].id
    }

    target {
      user = data.datadog_user.escalation_users["jviletto@sonymusic-pde.com"].id
    }
  }

  step {
    assignment             = "default"
    escalate_after_seconds = 1800

    target {
      user = data.datadog_user.escalation_users["tdenkinger@sonymusic-pde.com"].id
    }
  }

  step {
    assignment             = "default"
    escalate_after_seconds = 1800

    target {
      user = data.datadog_user.escalation_users["mthomas@sonymusic-pde.com"].id
    }
  }
}

resource "datadog_on_call_team_routing_rules" "routing_rules" {
  # Do not create routing rules for the Abacus team
  for_each = {
    for team, value in data.datadog_team.teams :
    team => value
    if team != "abacus"
  }

  id = each.value.id

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