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

data "datadog_team" "team" {
  filter_keyword = "Content Delivery"
}

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

data "datadog_user" "layer_2_on_call_users" {
  for_each                 = toset(var.layer_2_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      = "Content Delivery On-Call Schedule"
  time_zone = "America/New_York"
  teams     = [data.datadog_team.team.id]

  layer {
    name           = "Layer 1"
    effective_date = "2025-07-18T14:38:22Z"
    rotation_start = "2025-07-14T05:00:00Z"

    interval {
      days    = 7
      seconds = 0
    }

    dynamic "restriction" {
      for_each = toset(["monday", "tuesday", "wednesday", "thursday", "friday"])
      content {
        start_day  = restriction.value
        start_time = "01:00:00"
        end_day    = restriction.value
        end_time   = "09:00:00"
      }
    }

    dynamic "restriction" {
      for_each = toset(["saturday", "sunday"])
      content {
        start_day  = restriction.value
        start_time = "00:00:00"
        end_day    = restriction.value
        end_time   = "11:00:00"
      }
    }

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

  layer {
    name           = "Layer 2"
    effective_date = "2025-07-18T14:38:22Z"
    rotation_start = "2025-07-14T13:00:00Z"

    interval {
      days    = 7
      seconds = 0
    }

    dynamic "restriction" {
      for_each = [
        { start_day = "monday", start_time = "09:00:00", end_day = "tuesday", end_time = "01:00:00" },
        { start_day = "tuesday", start_time = "09:00:00", end_day = "wednesday", end_time = "01:00:00" },
        { start_day = "wednesday", start_time = "09:00:00", end_day = "thursday", end_time = "01:00:00" },
        { start_day = "thursday", start_time = "09:00:00", end_day = "friday", end_time = "01:00:00" },
        { start_day = "friday", start_time = "09:00:00", end_day = "saturday", end_time = "00:00:00" },
        { start_day = "saturday", start_time = "11:00:00", end_day = "sunday", end_time = "00:00:00" },
        { start_day = "sunday", start_time = "11:00:00", end_day = "monday", end_time = "01: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.layer_2_on_call_users : user.id]
  }
}

resource "datadog_on_call_escalation_policy" "escalation_policy" {
  name = "Content Delivery Escalation Policy"
  teams = [
    data.datadog_team.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["jfidlow@sonymusic-pde.com"].id
    }
  }

  step {
    assignment             = "default"
    escalate_after_seconds = 1800

    target {
      user = data.datadog_user.escalation_users["artur@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" {
  id = data.datadog_team.team.id

  rule {
    escalation_policy = datadog_on_call_escalation_policy.escalation_policy.id
    urgency           = "dynamic"
    action {
      send_slack_message {
        workspace = "T02DR2HG3" # Sony Music PDE
        channel   = "C05MU31FUDN" # #content-delivery-and-asset-mgmt-support
      }
    }
  }
}

resource "datadog_workflow_automation" "jira_critical_on_call_page" {
  name        = "CDAM Jira On-Call Page"
  description = "Creates an OnCall page for the CDAM team when a Jira issue of type 'Production Bug' with Critical/High priority is created or updated"
  tags        = ["source:jira","team:${data.datadog_team.team.handle}","workflow:oncall"]
  published   = true

  spec_json = jsonencode(
    {
      "triggers": [
        {
          "startStepNames": [
            "Check_Conditions"
          ],
          "apiTrigger": {}
        }
      ],
      "connectionEnvs": [
        {
          "env": "default",
          "connections": [
            {
              "connectionId": "5d925fff-dbdf-4f5f-b3b6-1f60d94e8193", # This is the "CDAM Jira Critical On-Call Page Workflow Automation" connection for Datadog Automation Actions
              "label": "INTEGRATION_DATADOG"
            }
          ]
        }
      ],
      "inputSchema": {
        "parameters": [
          {
            "name": "issue",
            "label": "Issue",
            "description": "The Jira issue object from the webhook payload",
            "type": "OBJECT"
          },
          {
            "name": "user",
            "label": "User",
            "description": "User info from the Jira webhook payload",
            "type": "OBJECT"
          },
          {
            "name": "timestamp",
            "label": "Timestamp",
            "description": "The timestamp of the Jira issue from the webhook payload",
            "type": "STRING"
          }
        ]
      },
      "steps": [
        {
          "name": "Check_Conditions",
          "actionId": "com.datadoghq.core.if",
          "parameters": [
            {
              "name": "conditions",
              "value": [
                {
                  "rightValue" : "{{ Trigger.issue.fields.priority.name }}",
                  "comparisonOperator" : "contains",
                  "leftValue" : [
                    "Critical",
                    "High"
                  ]
                },
                {
                  "comparisonOperator" : "eq",
                  "leftValue" : "{{ Trigger.issue.fields.project.name }}",
                  "rightValue" : "Content Delivery and Asset Management"
                },
                {
                  "comparisonOperator" : "eq",
                  "leftValue" : "{{ Trigger.issue.fields.issueType.name }}",
                  "rightValue" : "Production Bug"
                }
              ]
            },
            {
              "name": "joinOperator",
              "value": "and"
            }
          ],
          "outboundEdges": [
            {
              "nextStepName": "Create_OnCall_Page",
              "branchName": "true"
            }
          ],
          "display": {
            "bounds": {
              "x": -240,
              "y": 276
            }
          }
        },
        {
          "name": "Create_OnCall_Page",
          "actionId": "com.datadoghq.dd.oncall.createOnCallPage",
          "connectionLabel": "INTEGRATION_DATADOG",
          "parameters": [
            {
              "name": "description",
              "value": "Description: {{ Trigger.issue.fields.description }}\nURL: {{ Trigger.issue.fields.url }}\nReporter: {{ Trigger.user.displayName }} ({{ Trigger.user.emailAddress }})\nTimestamp: {{ Trigger.timestamp }}"
            },
            {
              "name": "tags",
              "value": [
                "source:jira",
                "issue_number:{{ Trigger.issue.key }}",
                "team:${data.datadog_team.team.handle}"
              ]
            },
            {
              "name": "target",
              "value": {
                "identifier": "${data.datadog_team.team.handle}",
                "type": "team_handle"
              }
            },
            {
              "name": "title",
              "value": "{{ Trigger.issue.fields.summary }}"
            },
            {
              "name": "urgency",
              "value": "high"
            }
          ],
          "display": {
            "bounds": {
              "x": -384,
              "y": 624
            }
          }
        }
      ]
    }
  )
}
