import os
import sys
import time
import urllib
import urllib2

from PySide2.QtCore import QTimer

import maya.cmds as cmds

import logging_util


class MailWrapper(object):
    """ Wrapper class for anonymouse.org mail service """

    MAIL_URL = 'http://anonymouse.org/cgi-bin/anon-email.cgi'
    TARGET_ADD = 'anno.schachner@gmail.com'

    def __init__(self):
        self.logger = logging_util.SporeLogger(__name__)

        self.timer = QTimer()
        self.timer.timeout.connect(self.send_report)
        self.last_msg = 0.0
        self.msg_stack = []

    def submit_report(self, subject, msg):
        """ send a POST request to anonymouse.org to send a email with
        the given subject and message.
        :param subject: string containing the subject
        :type subject: str
        :param msg: string containing the message
        :type msg: str
        :return: True if the email was sent successfull else False
        :return type: bool """

        payload = {'to': self.TARGET_ADD,
                   'subject': subject,
                   'text': msg}

        current_time = time.time()

        if self.last_msg + 60 > current_time:
            self.msg_stack.append(payload)
            # add some extra seconds since the qtime is not 100% accurate
            self.timer.start(65000)
            self.logger.warn('Only one message per minute. Delivery postponed for {}sec.'.format(60 * len(self.msg_stack)))

        else:
            self.send_report(payload)

    def send_report(self, payload=None):

        if not payload:
            self.logger.debug('Timer triggered report')
            if self.msg_stack:
                payload = self.msg_stack.pop(-1)
                self.logger.debug('Timer triggered report')
            else:
                self.logger.debug('No more messages to send. Time stopped')
                self.timer.stop()
                return

        handler = urllib2.HTTPHandler()
        opener = urllib2.build_opener(handler)
        data = urllib.urlencode(payload)
        request = urllib2.Request(self.MAIL_URL, data=data)
        request.get_method = lambda: "POST"

        try:
            connection = opener.open(request)
        except urllib2.HTTPError, e:
            connection = e

        self.last_msg = time.time()

        # check. Substitute with appropriate HTTP code.
        if connection.code == 200:
            data = connection.read()
            self.logger.debug('Report {} delivered'.format(payload['subject']))
            print '=' * 40 + '\nThank you for submitting your report!\n' + '=' * 40
            return True
        else:
            self.logger.error('Could not send report, error code: {}'.format(connection))
            return False