# -*- coding: utf-8 -*-

import random
import re

from module.plugins.internal.CaptchaService import CaptchaService


class AdsCaptcha(CaptchaService):
    __name__    = "AdsCaptcha"
    __type__    = "captcha"
    __version__ = "0.13"
    __status__  = "testing"

    __description__ = """AdsCaptcha captcha service plugin"""
    __license__     = "GPLv3"
    __authors__     = [("pyLoad Team", "admin@pyload.org")]


    CAPTCHAID_PATTERN  = r'api\.adscaptcha\.com/Get\.aspx\?.*?CaptchaId=(\d+)'
    PUBLICKEY_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?PublicKey=([\w\-]+)'


    def detect_key(self, data=None):
        html = data or self.retrieve_data()

        m = re.search(self.PUBLICKEY_PATTERN, html)
        n = re.search(self.CAPTCHAID_PATTERN, html)
        if m and n:
            self.key = (m.group(1).strip(), n.group(1).strip())  #: Key is the tuple(PublicKey, CaptchaId)
            self.log_debug("Key: %s | ID: %s" % self.key)
            return self.key
        else:
            self.log_debug("Key or id pattern not found")
            return None


    def challenge(self, key=None, data=None):
        PublicKey, CaptchaId = key or self.retrieve_key(data)

        html = self.pyfile.plugin.load("http://api.adscaptcha.com/Get.aspx",
                                    get={'CaptchaId': CaptchaId,
                                         'PublicKey': PublicKey})
        try:
            challenge = re.search("challenge: '(.+?)',", html).group(1)
            server    = re.search("server: '(.+?)',", html).group(1)

        except AttributeError:
            self.fail(_("AdsCaptcha challenge pattern not found"))

        self.log_debug("Challenge: %s" % challenge)

        return self.result(server, challenge), challenge


    def result(self, server, challenge):
        result = self.decrypt("%sChallenge.aspx" % server,
                                    get={'cid': challenge, 'dummy': random.random()},
                                    cookies=True,
                                    input_type="jpg")
        return result