# Author: Nic Wolfe <nic@wolfeden.ca>
# URL: http://code.google.com/p/sickbeard/
#
# This file is part of Sick Beard.
#
# Sick Beard is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Sick Beard is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Sick Beard.  If not, see <http://www.gnu.org/licenses/>.
import imp

__all__ = ['ezrss',
           'tvtorrents',
           'nzbmatrix',
           'nzbs_org',
           'nzbsrus',
           'womble',
           'newzbin',
           ]

import sickbeard

from os import sys

def sortedProviderList():

    initialList = sickbeard.providerList + sickbeard.newznabProviderList + sickbeard.providerPluginList
    providerDict = dict(zip([x.getID() for x in initialList], initialList))

    newList = []

    # add all modules in the priority list, in order
    for curModule in sickbeard.PROVIDER_ORDER:
        if curModule in providerDict:
            newList.append(providerDict[curModule])

    # add any modules that are missing from that list
    for curModule in providerDict:
        if providerDict[curModule] not in newList:
            newList.append(providerDict[curModule])

    return newList

def makeProviderList():

    return [x.provider for x in [getProviderModule(y) for y in __all__] if x]

def makePluginProviderList():
    import pkgutil    
    from sickbeard import providers
    
    "Load plugins from a specified package."
    ppath = sickbeard.providers.__path__    
    #'sickbeard.providers.'
    liste = list(pkgutil.iter_modules(ppath))
    
    names = []
    for l in liste:
        if not l[1] in __all__ and getDynamicProviderModule(l[1]) == None:
            __import__('sickbeard.providers.'+l[1])
            names.append( l[1] )
        
    #return [x.provider for x in [ sys.modules[l[1]] for l in liste ]]    
    return [x.provider for x in [ sys.modules['sickbeard.providers.'+l] for l in names ] if x]
    
def getNewznabProviderList(data):

    defaultList = [makeNewznabProvider(x) for x in getDefaultNewznabProviders().split('!!!')]
    providerList = filter(lambda x: x, [makeNewznabProvider(x) for x in data.split('!!!')])

    providerDict = dict(zip([x.name for x in providerList], providerList))

    for curDefault in defaultList:
        if not curDefault:
            continue

        # a 0 in the key spot indicates that no key is needed, so set this on the object
        if curDefault.key == '0':
            curDefault.key = ''
            curDefault.needs_auth = False

        if curDefault.name not in providerDict:
            curDefault.default = True
            providerList.append(curDefault)
        else:
            providerDict[curDefault.name].default = True
            providerDict[curDefault.name].name = curDefault.name
            providerDict[curDefault.name].url = curDefault.url
            providerDict[curDefault.name].needs_auth = curDefault.needs_auth
        
    return filter(lambda x: x, providerList)


def makeNewznabProvider(configString):

    if not configString:
        return None

    name, url, key, enabled = configString.split('|')

    newznab = sys.modules['sickbeard.providers.newznab']

    newProvider = newznab.NewznabProvider(name, url)
    newProvider.key = key
    newProvider.enabled = enabled == '1'

    return newProvider

def getDefaultNewznabProviders():
    return 'Sick Beard Index|http://momo.sickbeard.com/|0|0'


def getProviderModule(name):
    name = name.lower()
    prefix = "sickbeard.providers."
    if name in __all__ and prefix+name in sys.modules:
        return sys.modules[prefix+name]
    else:
        return None

def getDynamicProviderModule(name):
    name = name.lower()
    prefix = "sickbeard.providers."
    if prefix+name in sys.modules:
        return sys.modules[prefix+name]
    else:
        return None

def getProviderClass(id):

    providerMatch = [x for x in sickbeard.providerList+sickbeard.newznabProviderList if x.getID() == id]

    if len(providerMatch) != 1:
        return None
    else:
        return providerMatch[0]
