# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8

__all__ = ('DirConf',)

import os
from os import path

from ulib.base.base import make_prop
from ulib.base.args import split_args
from ulib.base.config import ShConfigFile

# si un fichier de configuration existe, il faut que uinc soit explicitement
# spécifié
DEFAULT_UINC_IFCONF = 'False'
# s'il n'y a pas de fichier de configuration, on considère que uinc==True
DEFAULT_UINC_IFNOCONF = 'True'

DEFAULT_UINC_ARGS = ()
DEFAULT_UINC_OPTIONS = ()

class UdirStrategy(object):
    CONFIGNAME = '.udir'

    def __init__(self, dir):
        super(UdirStrategy, self).__init__()
        self._config = ShConfigFile(path.join(dir, self.CONFIGNAME))

    _config, config = make_prop('_config')[:2]

    def get_udir_types(self):
        return self._config.get_array('udir_types', ())
    def is_uinst(self):
        return 'uinst' in self.get_udir_types()

    def get_uinc(self):
        return self._config.get_string('uinc', DEFAULT_UINC_IFCONF)
    def get_uinc_args(self):
        return self._config.get_array('uinc_args', DEFAULT_UINC_ARGS)
    def get_uinc_options(self):
        return self._config.get_array('uinc_options', DEFAULT_UINC_OPTIONS)

def is_udir(dir):
    """Tester si dir est un répertoire d'installation avec un fichier .udir
    """
    return path.isdir(dir) and path.isfile(path.join(dir, '.udir'))

class UinstStrategy(object):
    CONFIGNAME = '.uinst.conf'

    def __init__(self, dir):
        super(UinstStrategy, self).__init__()
        self._config = ShConfigFile(path.join(dir, self.CONFIGNAME))

    _config, config = make_prop('_config')[:2]

    def is_uinst(self): return True

    def get_uinc(self):
        return self._config.get_string('update_inc', DEFAULT_UINC_IFCONF)
    def get_uinc_args(self):
        uinc_args = self._config.get_string('update_inc_args', DEFAULT_UINC_ARGS)
        return split_args(uinc_args)
    def get_uinc_options(self):
        uinc_options = self._config.get_string('update_inc_options', DEFAULT_UINC_OPTIONS)
        return split_args(uinc_options)

def is_uinstconf(dir):
    """Tester si dir est un répertoire d'installation avec udir
    """
    return path.isdir(dir) and path.isfile(path.join(dir, '.uinst.conf'))

class DirConf(object):
    def __init__(self, dir):
        super(DirConf, self).__init__()
        valid = True
        ust = None
        if is_udir(dir):
            ust = UdirStrategy(dir)
            if 'uinst:legacy' in ust.get_udir_types():
                # cas particulier: avec le type uinst:legacy, on utilise le
                # fichier .uinst.conf
                if is_uinstconf(dir):
                    ust = UinstStrategy(dir)
                else:
                    ust = None
                    valid = False
        elif is_uinstconf(dir):
            ust = UinstStrategy(dir)
        else:
            valid = False
        self._dir = dir
        self._valid = valid
        self._ust = ust

    _dir = None
    def get_dir(self): return self._dir

    _valid = False
    def is_valid(self): return self._valid

    def get_configname(self):
        if self._valid: return self._ust.CONFIGNAME
        else: return None

    def is_uinst():
        """Tester s'il s'agit d'un répertoire installable avec uinst
        """
        return self._ust is not None and self._ust.is_uinst()

    def get_uinc(self):
        if self._valid: return self._ust.get_uinc()
        else: return DEFAULT_UINC_IFNOCONF
    def get_uinc_args(self):
        if self._valid: return self._ust.get_uinc_args()
        else: return DEFAULT_UINC_ARGS
    def get_uinc_options(self):
        if self._valid: return self._ust.get_uinc_options()
        else: return DEFAULT_UINC_OPTIONS

    dir = property(get_dir)
    valid = property(is_valid)
    configname = property(get_configname)
    uinc = property(get_uinc)
    uinc_args = property(get_uinc_args)
    uinc_options = property(get_uinc_options)
