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

import re
from random import choice

from pyload.plugins.MultiHoster import MultiHoster as MultiHosterAccount, normalize
from pyload.plugins.Addon import Addon, AddEventListener
from pyload.PluginManager import PluginMatcher


class MultiHoster(Addon, PluginMatcher):
    __version__ = "0.1"
    __internal__ = True
    __description__ = "Gives ability to use MultiHoster services."
    __config__ = []
    __author__ = ("pyLoad Team",)
    __author_mail__ = ("support@pyload.org",)

    #TODO: multiple accounts - multihoster / config options

    def init(self):
        # overwritten plugins mapped to list of multihoster
        self.plugins = {}

        # multihoster mapped to new regexp
        self.regexp = {}

    def matchURL(self, url):
        """ Overwritten to include new plugin regexp """
        for hoster, regexp in self.regexp.iteritems():
            if regexp.search(url):
                return "hoster", hoster

    def matchPlugin(self, plugin, name):
        """ Overwritten to overwrite already supported plugins """

        # TODO: check if account is usable
        # TODO: multiuser

        # Chooses a random multi hoster plugin
        if name in self.plugins:
            return plugin, choice(self.plugins[name])

    def addHoster(self, account):

        self.logInfo(_("Activated %s") % account.__name__)

        pluginMap = {}
        for name in self.core.pluginManager.getPlugins("hoster").keys():
            pluginMap[name.lower()] = name

        supported = []
        new_supported = []

        for hoster in account.getHosterList():
            name = normalize(hoster)

            if name in pluginMap:
                supported.append(pluginMap[name])
            else:
                new_supported.append(hoster)

        if not supported and not new_supported:
            account.logError(_("No Hoster loaded"))
            return

        klass = self.core.pluginManager.getPluginClass("hoster", account.__name__, overwrite=False)

        if not klass:
            return

        # inject plugin plugin
        account.logDebug("Overwritten Hosters: %s" % ", ".join(sorted(supported)))
        for hoster in supported:
            if hoster in self.plugins:
                self.plugins[hoster].append(klass.__name__)
            else:
                self.plugins[hoster] = [klass.__name__]

        account.logDebug("New Hosters: %s" % ", ".join(sorted(new_supported)))

        # create new regexp
        patterns = [x.replace(".", "\\.") for x in new_supported]

        if klass.__pattern__:
            patterns.append(klass.__pattern__)

        self.regexp[klass.__name__] = re.compile(r".*(%s).*" % "|".join(patterns))


    @AddEventListener(["account:deleted", "account:updated"])
    def refreshAccounts(self, plugin=None, loginname=None, user=None):
        self.logDebug("Re-checking accounts")

        self.plugins = {}
        for plugin, account in self.core.accountManager.iterAccounts():
            if isinstance(account, MultiHosterAccount) and account.isUsable():
                self.addHoster(account)

    @AddEventListener("account:loaded")
    def refreshAccount(self, acc):

        account = self.core.accountManager.getAccount(acc.plugin, acc.loginname)
        if isinstance(account, MultiHosterAccount) and account.isUsable():
            self.addHoster(account)

    def activate(self):
        self.refreshAccounts()
        self.core.pluginManager.addMatcher(self)

    def deactivate(self):
        self.core.pluginManager.removeMatcher(self)