#!/usr/bin/env python3
#from __future__ import print_function

import json
import os
import re
import sys
import traceback

import requests
from systemd.journal import JournalHandler

try:
    import pymysql
except ImportError:
    pass


import datetime
import logging
from argparse import ArgumentParser

from application.configuration import *

if __name__ == '__main__':
    parser = ArgumentParser(usage='%(prog)s [options]')
    parser.add_argument('--url', dest='url', required=True, help='Push URL')
    parser.add_argument('--platform', dest='platform', required=True, help='Platform')
    parser.add_argument('--appid', dest='appid', required=True, help='App ID')
    parser.add_argument('--token', dest='device_token', required=True, help='Device token')
    parser.add_argument('--deviceid', dest='device_id', required=True, help='Device Id')
    parser.add_argument('--callid', dest='call_id', required=True, help='Call ID')
    parser.add_argument('--event', dest='event', required=False, help='Event', default='incoming_session')
    parser.add_argument('--reason', dest='reason', required=False, help='Reason')
    parser.add_argument('--from', dest='from_uri', required=True, help='From')
    parser.add_argument('--from_name', dest='from_name', required=False, help='From name')
    parser.add_argument('--to', dest='to_uri', required=True, help='To')
    parser.add_argument('--silent', dest='silent', default="1", required=False, help='Silent')
    parser.add_argument('--mediatype', dest='media_type', default="audio", required=False, help='Audio, Video or Message')
    options = parser.parse_args()

    log = logging.getLogger('CONFIG')
    log.addHandler(JournalHandler())
    log.setLevel(logging.INFO)
    
    from_uri = re.sub(r'^"|"$', '', options.from_uri)
    from_name = options.from_name.strip('\"') if options.from_name else None
    
    try:
        (token1, token2) = options.device_token.split("-")
    except ValueError:
        token1 = options.device_token
        token2 = None
    
    token = token2 if (token2 and options.event in ('cancel', 'message')) else token1
    media_type = options.media_type

    if ("video" in options.media_type):
        media_type = 'video'
    elif ("audio" in options.media_type):
        media_type = 'audio'

    debug = False
    url = options.url if not debug else 'http://localhost:8500/push'     
    body = {
              'platform': options.platform,
              'app-id': options.appid, 
              'token': token,
              'media-type': media_type,
              'event': options.event,
              'reason': options.reason,
              'from': from_uri,
              'from-display-name': from_name or from_uri,
              'to': options.to_uri,
              'device-id': options.device_id,
              'call-id': options.call_id,
              'silent': options.silent
              }

    try:
        r = requests.post(options.url, timeout=5, json=body)
        if r.status_code == 200:
            log.info("OpenSIPS %s push for %s to %s response 200 OK: %s" % (options.event, options.call_id, options.url, r.text))
            sys.exit(0)
        elif r.status_code == 410:
            log.info("Push token %s for %s must be purged (%s)" % (options.device_token, options.to_uri, options.call_id))
            q = "delete from push_tokens where token = '%s'" % options.device_token
            con = pymysql.connect('localhost', 'opensips', 'opensips', 'opensips')
            with con: 
                cur = con.cursor()
                r = cur.execute(q)
                if int(r) == 1:
                    log.info("Push token %s for %s was purged (%s)" % (options.device_token, options.to_uri, options.call_id))
                else:
                    log.error("--- Error: push token %s for %s was not purged (%s)" % (options.device_token, options.to_uri, options.call_id))
                    log.error(q)
            sys.exit(1)
        else:
            log.info("OpenSIPS %s push for %s to %s failed: %d: %s" % (options.event, options.call_id, options.url, r.status_code, r.text))
            sys.exit(1)
    except Exception as e:
#        traceback.print_exc()
        log.info("OpenSIPS %s push for %s to %s failed: connection error %s" % (options.event, options.call_id, options.url, str(e)))
        sys.exit(1)
