# -*- coding: utf-8 -*-
#
# Test links:
# https://www.oboom.com/B7CYZIEB/10Mio.dat

import re

from module.common.json_layer import json_loads
from module.plugins.Hoster import Hoster
from module.plugins.internal.CaptchaService import ReCaptcha


class OboomCom(Hoster):
    __name__    = "OboomCom"
    __type__    = "hoster"
    __version__ = "0.3"

    __pattern__ = r'https?://(?:www\.)?oboom\.com/(#(id=|/)?)?(?P<ID>\w{8})'

    __description__ = """oboom.com hoster plugin"""
    __license__     = "GPLv3"
    __authors__     = [("stanley", "stanley.foerster@gmail.com")]


    RECAPTCHA_KEY = "6LdqpO0SAAAAAJGHXo63HyalP7H4qlRs_vff0kJX"


    def setup(self):
        self.chunkLimit = 1
        self.multiDL = self.resumeDownload = self.premium


    def process(self, pyfile):
        self.pyfile.url.replace(".com/#id=", ".com/#")
        self.pyfile.url.replace(".com/#/", ".com/#")
        self.getFileId(self.pyfile.url)
        self.getSessionToken()
        self.getFileInfo(self.sessionToken, self.fileId)
        self.pyfile.name = self.fileName
        self.pyfile.size = self.fileSize
        if not self.premium:
            self.solveCaptcha()
        self.getDownloadTicket()
        self.download("https://%s/1.0/dlh" % self.downloadDomain, get={"ticket": self.downloadTicket, "http_errors": 0})


    def loadUrl(self, url, get=None):
        if get is None:
            get = dict()
        return json_loads(self.load(url, get, decode=True))


    def getFileId(self, url):
        self.fileId = re.match(OboomCom.__pattern__, url).group('ID')


    def getSessionToken(self):
        if self.premium:
            accountInfo = self.account.getAccountInfo(self.user, True)
            if "session" in accountInfo:
                self.sessionToken = accountInfo['session']
            else:
                self.fail(_("Could not retrieve premium session"))
        else:
            apiUrl = "https://www.oboom.com/1.0/guestsession"
            result = self.loadUrl(apiUrl)
            if result[0] == 200:
                self.sessionToken = result[1]
            else:
                self.fail(_("Could not retrieve token for guest session. Error code: %s") % result[0])


    def solveCaptcha(self):
        recaptcha = ReCaptcha(self)

        for _i in xrange(5):
            challenge, response = recaptcha.challenge(self.RECAPTCHA_KEY)
            apiUrl = "https://www.oboom.com/1.0/download/ticket"
            params = {"recaptcha_challenge_field": challenge,
                      "recaptcha_response_field": response,
                      "download_id": self.fileId,
                      "token": self.sessionToken}
            result = self.loadUrl(apiUrl, params)

            if result[0] == 200:
                self.downloadToken = result[1]
                self.downloadAuth = result[2]
                self.correctCaptcha()
                self.setWait(30)
                self.wait()
                break

            elif result[0] == 400:
                if result[1] == "incorrect-captcha-sol":
                    self.invalidCaptcha()
                elif result[1] == "captcha-timeout":
                    self.invalidCaptcha()
                elif result[1] == "forbidden":
                    self.retry(5, 15 * 60, _("Service unavailable"))

            elif result[0] == 403:
                if result[1] == -1:  # another download is running
                    self.setWait(15 * 60)
                else:
                    self.setWait(result[1], True)
                self.wait()
                self.retry(5)
        else:
            self.invalidCaptcha()
            self.fail(_("Received invalid captcha 5 times"))


    def getFileInfo(self, token, fileId):
        apiUrl = "https://api.oboom.com/1.0/info"
        params = {"token": token, "items": fileId, "http_errors": 0}

        result = self.loadUrl(apiUrl, params)
        if result[0] == 200:
            item = result[1][0]
            if item['state'] == "online":
                self.fileSize = item['size']
                self.fileName = item['name']
            else:
                self.offline()
        else:
            self.fail(_("Could not retrieve file info. Error code %s: %s") % (result[0], result[1]))


    def getDownloadTicket(self):
        apiUrl = "https://api.oboom.com/1/dl"
        params = {"item": self.fileId, "http_errors": 0}
        if self.premium:
            params['token'] = self.sessionToken
        else:
            params['token'] = self.downloadToken
            params['auth'] = self.downloadAuth

        result = self.loadUrl(apiUrl, params)
        if result[0] == 200:
            self.downloadDomain = result[1]
            self.downloadTicket = result[2]
        elif result[0] == 421:
            self.retry(wait_time=result[2] + 60, reason=_("Connection limit exceeded"))
        else:
            self.fail(_("Could not retrieve download ticket. Error code: %s") % result[0])