"""
Provider Setup Validation Page,
used if First Run Wizard
"""

from PyQt4 import QtGui

from leap.gui.progress import ValidationPage

from leap.gui.constants import APP_LOGO


class ProviderSetupValidationPage(ValidationPage):
    def __init__(self, parent=None):
        super(ProviderSetupValidationPage, self).__init__(parent)
        self.setTitle("Setting up provider")
        #self.setSubTitle(
            #"auto configuring provider...")

        self.setPixmap(
            QtGui.QWizard.LogoPixmap,
            QtGui.QPixmap(APP_LOGO))

    def _do_checks(self, update_signal=None):
        """
        executes actual checks in a separate thread
        """
        import time
        domain = self.field('provider_domain')
        wizard = self.wizard()
        pconfig = wizard.providerconfig

        pCertChecker = wizard.providercertchecker
        certchecker = pCertChecker(domain=domain)

        update_signal.emit('Fetching CA certificate', 30)

        if pconfig:
            ca_cert_uri = pconfig.get('ca_cert_uri').geturl()
        else:
            ca_cert_uri = None

        # XXX check scheme == "https"
        # XXX passing verify == False because
        # we have trusted right before.
        # We should check it's the same domain!!!
        # (Check with the trusted fingerprints dict
        # or something smart)

        #certchecker.download_ca_cert(
            #uri=ca_cert_uri,
            #verify=False)

        time.sleep(2)

        update_signal.emit('Checking CA fingerprint', 66)
        #ca_cert_fingerprint = pconfig.get('ca_cert_fingerprint', None)

        # XXX get fingerprint dict (types)
        #sha256_fpr = ca_cert_fingerprint.split('=')[1]

        #validate_fpr = certchecker.check_ca_cert_fingerprint(
            #fingerprint=sha256_fpr)
        time.sleep(0.5)
        #if not validate_fpr:
            # XXX update validationMsg
            # should catch exception
            #return False

        update_signal.emit('Validating api certificate', 90)

        #api_uri = pconfig.get('api_uri', None)
        #try:
            #api_cert_verified = certchecker.verify_api_https(api_uri)
        #except requests.exceptions.SSLError as exc:
            #logger.error('BUG #638. %s' % exc.message)
            # XXX RAISE! See #638
            # bypassing until the hostname is fixed.
            # We probably should raise yet-another-warning
            # here saying user that the hostname "XX.XX.XX.XX' does not
            # match 'foo.bar.baz'
            #api_cert_verified = True

        #if not api_cert_verified:
            # XXX update validationMsg
            # should catch exception
            #return False
        time.sleep(0.5)
        #ca_cert_path = checker.ca_cert_path

        update_signal.emit('end_sentinel', 100)
        time.sleep(1)

    def _do_validation(self):
        """
        called after _do_checks has finished
        (connected to checker thread finished signal)
        """
        wizard = self.wizard()
        if self.errors:
            print 'going back with errors'
            wizard.set_validation_error(
                'providerselection',
                'error on provider setup')
            self.go_back()
        else:
            print 'going next'
            self.go_next()

    def nextId(self):
        wizard = self.wizard()
        if not wizard:
            return
        is_signup = self.field('is_signup')
        if is_signup is True:
            next_ = 'signup'
        if is_signup is False:
            next_ = 'connecting'
        return wizard.get_page_index(next_)