#!/usr/bin/env python
# encoding: utf-8
import logging
import pickle
import signal
from optparse import OptionParser
import smtplib

parser = OptionParser()
parser.add_option("-H", "--host", dest="host", help="Broker host", metavar="ADDRESS", default='localhost')
parser.add_option("-p", "--port", dest="port", help="Broker port", metavar="PORT", default=5450, type=int)
parser.add_option("--debug", action='store_true', help='A lot of logging messages', default=False)
parser.add_option("-t", "--timeout", dest="timeout", help="Getting task timeout", metavar="SECONDS", default=5, type=int)
parser.add_option("--smtp-host", default='localhost', help='SMTP server', metavar='ADDRESS', dest='smtp_host')

log = logging.getLogger('postboy.worker')


ALIVE = True
def signal_handler(signum, frame):
    global ALIVE
    ALIVE = False
    log.info('Getting signal: {0}. Program finishing.'.format(signum))

signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)


from postboy import BrokerHandler
from postboy import Email


def setup_logger(options):
    logformat = u'%(asctime)s [%(filename)s:%(lineno)d] %(levelname)-8s %(message)s'
    logging.basicConfig(level=logging.DEBUG if options.debug else logging.INFO, format=logformat)


def main(options, args):
    global ALIVE
    setup_logger(options)

    def handler(task):
        email = pickle.loads(task)
        if isinstance(email, Email):
            connect = smtplib.SMTP(options.smtp_host)
            connect.sendmail(email.msg['From'], email.msg['To'], email.msg.as_string())
            return True
        else:
            raise ValueError('Task is wrong.')

    BrokerHandler.WAIT_TIMEOUT = options.timeout
    broker = BrokerHandler(handler=handler)

    while ALIVE:
        broker.get_task()


if __name__ == '__main__':
    main(*parser.parse_args())