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

from __future__ import with_statement

import os
import re
import traceback

from module.plugins.internal.Crypter import Crypter
from module.plugins.internal.Plugin import exists
from module.utils import save_join as fs_join


class Container(Crypter):
    __name__    = "Container"
    __type__    = "container"
    __version__ = "0.06"
    __status__  = "testing"

    __pattern__ = r'^unmatchable$'
    __config__  = []  #: [("name", "type", "desc", "default")]

    __description__ = """Base container decrypter plugin"""
    __license__     = "GPLv3"
    __authors__     = [("mkaay", "mkaay@mkaay.de")]


    def process(self, pyfile):
        """
        Main method
        """
        self._load2disk()

        self.decrypt(pyfile)

        self.delete_tmp()

        if self.urls:
            self._generate_packages()

        elif not self.packages:
            self.error(_("No link grabbed"), "decrypt")

        self._create_packages()


    #: Deprecated method, use `_load2disk` instead (Remove in 0.4.10)
    def loadToDisk(self, *args, **kwargs):
        return self._load2disk(*args, **kwargs)


    def _load2disk(self):
        """
        Loads container to disk if its stored remotely and overwrite url,
        or check existent on several places at disk
        """
        if self.pyfile.url.startswith("http"):
            self.pyfile.name = re.findall("([^\/=]+)", self.pyfile.url)[-1]
            content = self.load(self.pyfile.url)
            self.pyfile.url = fs_join(self.pyload.config.get("general", "download_folder"), self.pyfile.name)
            try:
                with open(self.pyfile.url, "wb") as f:
                    f.write(content)

            except IOError, e:
                self.fail(str(e))  #@TODO: Remove `str` in 0.4.10

        else:
            self.pyfile.name = os.path.basename(self.pyfile.url)
            if not exists(self.pyfile.url):
                if exists(fs_join(pypath, self.pyfile.url)):
                    self.pyfile.url = fs_join(pypath, self.pyfile.url)
                else:
                    self.fail(_("File not exists"))


    #: Deprecated method, use `delete_tmp` instead (Remove in 0.4.10)
    def deleteTmp(self, *args, **kwargs):
        return self.delete_tmp(*args, **kwargs)


    def delete_tmp(self):
        if not self.pyfile.name.startswith("tmp_"):
            return

        try:
            os.remove(self.pyfile.url)
        except OSError, e:
            self.log_warning(_("Error removing: %s") % self.pyfile.url, e)
            if self.pyload.debug:
                traceback.print_exc()