import logging
import daemon
import argparse
import requests
import json

from data.queue import webhook_queue
from workers.worker import Worker


root_logger = logging.getLogger('')
root_logger.setLevel(logging.DEBUG)

FORMAT = '%(asctime)-15s - %(levelname)s - %(pathname)s - %(funcName)s - %(message)s'
formatter = logging.Formatter(FORMAT)

logger = logging.getLogger(__name__)


class WebhookWorker(Worker):
  def process_queue_item(self, job_details):
    url = job_details['url']
    payload = job_details['payload']
    headers = {'Content-type': 'application/json'}

    try:
      resp = requests.post(url, data=json.dumps(payload), headers=headers)
      if resp.status_code/100 != 2:
        logger.error('%s response for webhook to url: %s' % (resp.status_code,
                                                             url))
        return False
    except requests.exceptions.RequestException as ex:
      logger.exception('Webhook was unable to be sent: %s' % ex.message)
      return False

    return True


parser = argparse.ArgumentParser(description='Worker daemon to send webhooks')
parser.add_argument('-D', action='store_true', default=False,
                    help='Run the worker in daemon mode.')
parser.add_argument('--log', default='webhooks.log',
                    help='Specify the log file for the worker as a daemon.')
args = parser.parse_args()


worker = WebhookWorker(webhook_queue, poll_period_seconds=15,
                       reservation_seconds=3600)

if args.D:
  handler = logging.FileHandler(args.log)
  handler.setFormatter(formatter)
  root_logger.addHandler(handler)
  with daemon.DaemonContext(files_preserve=[handler.stream]):
    worker.start()

else:
  handler = logging.StreamHandler()
  handler.setFormatter(formatter)
  root_logger.addHandler(handler)
  worker.start()