# -*- coding: utf-8 -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
import ulib.base.i_need_py23

__all__ = ('new_store', 'ensure_store', 'get_stores', 'get_store')

from ulib.base.base import isseq
from store import AbstractStore
from simple import SimpleStore
from multiple import MultipleStore

def new_store(source):
    """Créer une nouvelle instance de AbstractStore en fonction de la source.

    La source peut être:

    - une url de la forme "http://..." ou "https://...", auquel cas on
      retourne une instance de HttpStore.
    - un fichier .html ou .htm, auquel cas on retourne une instance de TWStore.
    - un fichier se trouvant dans une répertoire ".../wiki/..." auquel cas on
      retourne une instance de WikiStore.
    - Sinon on retourne une instance de SimpleStore

    Pour le moment, seul SimpleStore est implémenté.
    """
    return SimpleStore(source)
    #abssource = path.abspath(source)
    #if source[:7] == 'http://' or source[:8] == 'https://':
    #    return HttpStore(source)
    #elif path.splitext(source)[1] in ('.htm', '.html'):
    #    return TWStore(source)
    #elif abssource.find("/wiki/") != -1:
    #    return WikiStore(source)
    #else:
    #    return SimpleStore(source)

def ensure_store(store):
    u"""Retourner une instance de AbstractStore ou None si store==None.

    @rtype: AbstractStore
    """
    if store is None: return None
    elif isinstance(store, AbstractStore): return store
    else: return new_store(store)

def get_stores(stores):
    u"""Retourner une liste de stores.

    Si stores==None, retourner une liste vide.

    @rtype: list
    """
    if stores is None: stores = ()
    elif not isseq(stores): stores = (stores,)
    return [ensure_store(store) for store in stores]

def get_store(stores):
    u"""Retourner une instance de AbstractStore si la liste stores contient un
    seul élément, ou une instance de MultipleStore, qui aggrège tous les
    éléments de stores.

    @rtype: AbstractStore
    """
    if isinstance(stores, MultipleStore): return stores

    stores = get_stores(stores)
    if len(stores) == 1: return stores[0]
    else: return MultipleStore(stores)
