#!/usr/bin/env python
# -*- coding: utf-8 -*-

from module.plugins.Hoster import Hoster


class ZeveraCom(Hoster):
    __name__ = "ZeveraCom"
    __version__ = "0.21"
    __type__ = "hoster"
    __pattern__ = r"http://zevera.com/.*"
    __description__ = """zevera.com hoster plugin"""
    __author_name__ = ("zoidberg")
    __author_mail__ = ("zoidberg@mujmail.cz")

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

    def process(self, pyfile):
        if not self.account:
            self.logError(_("Please enter your %s account or deactivate this plugin") % "zevera.com")
            self.fail("No zevera.com account provided")

        self.logDebug("zevera.com: Old URL: %s" % pyfile.url)

        if self.account.getAPIData(self.req, cmd="checklink", olink=pyfile.url) != "Alive":
            self.fail("Offline or not downloadable - contact Zevera support")

        header = self.account.getAPIData(self.req, just_header=True, cmd="generatedownloaddirect", olink=pyfile.url)
        if not "location" in header:
            self.fail("Unable to initialize download - contact Zevera support")

        self.download(header['location'], disposition=True)

        check = self.checkDownload({"error": 'action="ErrorDownload.aspx'})
        if check == "error":
            self.fail("Error response received - contact Zevera support")

    # BitAPI not used - defunct, probably abandoned by Zevera
    #
    # api_url = "http://zevera.com/API.ashx"
    #
    # def process(self, pyfile):
    #     if not self.account:
    #         self.logError(_("Please enter your zevera.com account or deactivate this plugin"))
    #         self.fail("No zevera.com account provided")
    #
    #     self.logDebug("zevera.com: Old URL: %s" % pyfile.url)
    #
    #     last_size = retries = 0
    #     olink = self.pyfile.url #quote(self.pyfile.url.encode('utf_8'))
    #
    #     for i in range(100):
    #         self.retData = self.account.loadAPIRequest(self.req, cmd = 'download_request', olink = olink)
    #         self.checkAPIErrors(self.retData)
    #
    #         if self.retData['FileInfo']['StatusID'] == 100:
    #             break
    #         elif self.retData['FileInfo']['StatusID'] == 99:
    #             self.fail('Failed to initialize download (99)')
    #         else:
    #             if self.retData['FileInfo']['Progress']['BytesReceived'] <= last_size:
    #                 if retries >= 6:
    #                     self.fail('Failed to initialize download (%d)' % self.retData['FileInfo']['StatusID'] )
    #                 retries += 1
    #             else:
    #                 retries = 0
    #
    #             last_size = self.retData['FileInfo']['Progress']['BytesReceived']
    #
    #             self.setWait(self.retData['Update_Wait'])
    #             self.wait()
    #
    #     pyfile.name = self.retData['FileInfo']['RealFileName']
    #     pyfile.size = self.retData['FileInfo']['FileSizeInBytes']
    #
    #     self.retData = self.account.loadAPIRequest(self.req, cmd = 'download_start',
    #                                                FileID = self.retData['FileInfo']['FileID'])
    #     self.checkAPIErrors(self.retData)
    #
    #     self.download(self.api_url, get = {
    #         'cmd': "open_stream",
    #         'login': self.account.loginname,
    #         'pass': self.account.password,
    #         'FileID': self.retData['FileInfo']['FileID'],
    #         'startBytes': 0
    #         }
    #     )
    #
    # def checkAPIErrors(self, retData):
    #     if not retData:
    #         self.fail('Unknown API response')
    #
    #     if retData['ErrorCode']:
    #         self.logError(retData['ErrorCode'], retData['ErrorMessage'])
    #         #self.fail('ERROR: ' + retData['ErrorMessage'])
    #
    #     if self.pyfile.size / 1024000 > retData['AccountInfo']['AvailableTODAYTrafficForUseInMBytes']:
    #         self.logWarning("Not enough data left to download the file")
    #
    # def crazyDecode(self, ustring):
    #     # accepts decoded ie. unicode string - API response is double-quoted, double-utf8-encoded
    #     # no idea what the proper order of calling these functions would be :-/
    #     return html_unescape(unquote(unquote(ustring.replace(
    #                          '@DELIMITER@','#'))).encode('raw_unicode_escape').decode('utf-8'))