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

import re

from urllib import unquote

from module.plugins.Crypter import Crypter
from module.plugins.internal.SimpleHoster import directLink, set_cookies


class SimpleDereferer(Crypter):
    __name__    = "SimpleDereferer"
    __type__    = "crypter"
    __version__ = "0.03"

    __pattern__ = r'^unmatchable$'
    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True),
                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]

    __description__ = """Simple dereferer plugin"""
    __license__     = "GPLv3"
    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")]


    """
    Following patterns should be defined by each crypter:

      LINK_PATTERN: Regex to catch the redirect url in group(1)
        example: LINK_PATTERN = r'<div class="link"><a href="(.+?)"'

      OFFLINE_PATTERN: (optional) Checks if the page is unreachable
        example: OFFLINE_PATTERN = r'File (deleted|not found)'

      TEMP_OFFLINE_PATTERN: (optional) Checks if the page is temporarily unreachable
        example: TEMP_OFFLINE_PATTERN = r'Server maintainance'


    You can override the getLinks method if you need a more sophisticated way to extract the redirect url.
    """

    LINK_PATTERN = None

    TEXT_ENCODING = False
    COOKIES       = True


    def decrypt(self, pyfile):
        link = directLink(self, pyfile.url)

        if not link:
            try:
                link = unquote(re.match(self.__pattern__, pyfile.url).group('LINK'))

            except Exception:
                self.prepare()
                self.preload()

                if self.html is None:
                    self.fail(_("No html retrieved"))

                self.checkStatus()

                link = self.getLink()

        if link.strip():
            self.urls = [link.strip()]  #@TODO: Remove `.strip()` in 0.4.10

        elif not self.urls and not self.packages:  #@TODO: Remove in 0.4.10
            self.fail("No link grabbed")


    def prepare(self):
        self.req.setOption("timeout", 120)

        if isinstance(self.COOKIES, list):
            set_cookies(self.req.cj, self.COOKIES)


    def preload(self):
        self.html = self.load(self.pyfile.url, cookies=bool(self.COOKIES), decode=not self.TEXT_ENCODING)

        if isinstance(self.TEXT_ENCODING, basestring):
            self.html = unicode(self.html, self.TEXT_ENCODING)


    def checkStatus(self):
        if hasattr(self, "OFFLINE_PATTERN") and re.search(self.OFFLINE_PATTERN, self.html):
            self.offline()

        elif hasattr(self, "TEMP_OFFLINE_PATTERN") and re.search(self.TEMP_OFFLINE_PATTERN, self.html):
            self.tempOffline()


    def getLink(self):
        try:
            return re.search(self.LINK_PATTERN, self.html).group(1)

        except Exception:
            pass