#!/usr/bin/env python3
try:
    from inmon_utils import *
except:
    import sys
    sys.exit(3)
import requests
import argparse
import json
from datetime import datetime, timedelta, timezone
# Create argument parser itself
parser = argparse.ArgumentParser(description="Monitors New and CNA Tickets for Autotask")
                                 
parser.add_argument('-u', dest='username', help='API User Username', required=True)
parser.add_argument('-s', dest='secret', help='API User Secret', required=True)
parser.add_argument('-a', dest='reasoncode', help='Autotask API Integration Code', required=True)
parser.add_argument('-t', dest='time', help='Number of minutes to alert after', default=10)

# Parse arguments
args = parser.parse_args()

headers = {
    "UserName": f"{args.username}",
    "Secret": f"{args.secret}",
    "ApiIntegrationCode": f"{args.reasoncode}",
    "pageSize": "5000",
    "Content-Type": "application/json"
}

minutes = int(args.time)
date = datetime.now(tz=timezone.utc) - timedelta(hours=0, minutes=minutes)

query_new = {"filter": [{"op": "and", "items": [{"op": "eq", "field": "status", "value": "1"}, {"op": "eq", "field": "queueID", "value": "5"},{"op": "lt", "field": "lastActivityDate", "value": f"{date.strftime('%Y-%m-%dT%H:%M:%S.000Z')}"}]}]}
query_cna = {"filter": [{"op": "and", "items": [{"op": "eq", "field": "status", "value": "19"}, {"op": "eq", "field": "queueID", "value": "5"},{"op": "lt", "field": "lastActivityDate", "value": f"{date.strftime('%Y-%m-%dT%H:%M:%S.000Z')}"}]}]}
query_open = {"filter": [{"op": "and", "items": [{"op": "noteq", "field": "status", "value": "5"}, {"op": "eq", "field": "queueID", "value": "5"},{"op": "lt", "field": "lastActivityDate", "value": f"{date.strftime('%Y-%m-%dT%H:%M:%S.000Z')}"}]}]}


url = "https://webservices5.autotask.net/ATServicesRest/V1.0/Tickets/query/count"

result_new = requests.post(url, headers=headers, json=query_new)
result_cna = requests.post(url, headers=headers, json=query_cna)
result_open = requests.post(url, headers=headers, json=query_open)

if result_new.status_code != 200:
    print(f"Unable to retrieve tickets in New status: {result_new.status_code}: {result_new.text}")
    sys.exit(3)
if result_cna.status_code != 200:
    print(f"Unable to retrieve tickets in CNA status: {result_cna.status_code}: {result_cna.text}")
    sys.exit(3)
if result_open.status_code != 200:
    print(f"Unable to retrieve all open tickets: {result_cna.status_code}: {result_cna.text}")

count_new = json.loads(result_new.text)['queryCount']
count_cna = json.loads(result_cna.text)['queryCount']
count_open = json.loads(result_open.text)['queryCount']

if (count_new + count_cna) > 0:
    print(f"Tickets in New or CNA status longer than {minutes} minutes. | new={count_new} cna={count_cna} open={count_open}")
    sys.exit(2)
else:
    print(f"No tickets in New or CNA status longer than {minutes} minutes. | new={count_new} cna={count_cna} open={count_open}")
    sys.exit(0)
