# TriggerDeck webhook media type for Zabbix 6.0
zabbix_export:
  version: '6.0'
  media_types:
    - name: TriggerDeck
      type: WEBHOOK
      parameters:
        - name: eventId
          value: '{EVENT.ID}'
        - name: hostId
          value: '{HOST.ID}'
        - name: hostName
          value: '{HOST.NAME}'
        - name: HTTPProxy
        - name: problemId
          value: '{EVENT.ID}'
        - name: problemName
          value: '{EVENT.NAME}'
        - name: severity
          value: '{EVENT.NSEVERITY}'
        - name: status
          value: '{EVENT.STATUS}'
        - name: tagsJson
          value: '{EVENT.TAGSJSON}'
        - name: triggeredAt
          value: '{EVENT.TIMESTAMP}'
        - name: uniqueUid
          value: '{ALERT.SENDTO}'
        - name: url
          value: 'https://app.triggerdeck.io/v1/webhooks/zabbix'
      max_sessions: '0'
      script: |
        try {
            var params = JSON.parse(value),
                req = new HttpRequest(),
                normalizedStatus = String(params.status || '').toUpperCase(),
                payload = {
                    uniqueUid: params.uniqueUid,
                    eventId: String(params.eventId),
                    problemId: params.problemId ? String(params.problemId) : undefined,
                    hostId: params.hostId ? String(params.hostId) : undefined,
                    hostName: params.hostName || undefined,
                    problemName: params.problemName,
                    severity: Number(params.severity),
                    status: normalizedStatus === 'RESOLVED' ? 'resolved' : 'problem',
                    triggeredAt: new Date(Number(params.triggeredAt) * 1000).toISOString(),
                    tags: []
                },
                tagsRaw,
                body,
                response;

            if (params.HTTPProxy) {
                req.setProxy(params.HTTPProxy);
            }

            if (params.tagsJson) {
                tagsRaw = String(params.tagsJson).trim();
            }

            if (tagsRaw && tagsRaw !== '{EVENT.TAGSJSON}') {
                try {
                    var parsedTags = JSON.parse(tagsRaw);
                    payload.tags = Array.isArray(parsedTags) ? parsedTags : [];
                }
                catch (error) {
                    Zabbix.log(3, '[ TriggerDeck webhook ] Failed to parse tagsJson: ' + error);
                }
            }

            body = JSON.stringify(payload);

            req.addHeader('Content-Type: application/json');
            response = req.post(params.url, body);

            if (req.getStatus() < 200 || req.getStatus() >= 300) {
                throw 'Unexpected status code ' + req.getStatus() + ': ' + response;
            }

            return 'OK';
        }
        catch (error) {
            Zabbix.log(3, '[ TriggerDeck webhook ] Delivery failed: ' + error);
            throw 'TriggerDeck webhook failed: ' + error;
        }
      description: |
        TriggerDesk iOS app media type.
        See more on https://triggerdeck.io
      message_templates:
        - event_source: TRIGGERS
          operation_mode: PROBLEM
          subject: 'Problem: {EVENT.NAME}'
          message: |
            Problem started at {EVENT.TIME} on {EVENT.DATE}
            Problem name: {EVENT.NAME}
            Host: {HOST.NAME}
            Severity: {EVENT.SEVERITY}
            Operational data: {EVENT.OPDATA}
            Original problem ID: {EVENT.ID}
            {TRIGGER.URL}
        - event_source: TRIGGERS
          operation_mode: RECOVERY
          subject: 'Resolved in {EVENT.DURATION}: {EVENT.NAME}'
          message: |
            Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
            Problem name: {EVENT.NAME}
            Problem duration: {EVENT.DURATION}
            Host: {HOST.NAME}
            Severity: {EVENT.SEVERITY}
            Original problem ID: {EVENT.ID}
            {TRIGGER.URL}
