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

import argparse
from sys import exit

from pyeole import scriptargs
from pyeole.ansiprint import print_red
from pyeole.log import init_logging
from creole.var_loader import convert_value
from creole.loader import creole_loader, config_save_values
from tiramisu.error import PropertiesOptionError
from pyeole.ihm import only_root

only_root()

parser = argparse.ArgumentParser(description=u"Set Creole variable",
                                 parents=[scriptargs.logging()])
parser.add_argument("--default", action="store_true", default=False,
              help=u"remettre à la valeur par défaut")
parser.add_argument('variable', nargs=1,
                    help=u"Nom de variable Creole")
parser.add_argument('value', nargs='?',
                    help=u"Valeur de la variable Creole")

options = parser.parse_args()

if options.verbose:
    # 'info' is outputed to stdout
    options.log_level = u'warning'
if options.debug:
    options.log_level = u'debug'

if options.default and options.value:
    print_red("En cas de remise à la valeur par défaut, il ne faut pas spécifier de valeur")
    exit(1)

if not options.default and options.value is None:
    print_red("Veuiller spécifier la valeur")
    exit(1)

def main():
    log = init_logging(level=options.log_level)
    try:
        config = creole_loader(rw=True, owner='creoleset', load_extra=True)
        var = options.variable[0]
        if '.' in var:
            if var.startswith('.'):
                var = var[1:]
            namespace = var.split('.')[0]
        else:
            namespace = 'creole'
            var = config.find_first(byname=var, type_='path',
                                    force_permissive=True)
        if options.default:
            homeconfig, name = config.cfgimpl_get_home_by_path(var)
            homeconfig.__delattr__(name)
        else:
            option = config.unwrap_from_path(var)
            value = options.value
            if option.impl_is_multi():
                values = []
                for val in value.split('\n'):
                    values.append(convert_value(option, val))
                value = values
            else:
                value = convert_value(option, value)
            setattr(config, var, value)
        config_save_values(config, namespace)
    except PropertiesOptionError, err:
        if options.debug:
            log.debug(err, exc_info=True)
        print_red(u"Erreur de propriété : {0}".format(err))
        exit(1)
    except ValueError, err:
        if options.debug:
            log.debug(err, exc_info=True)
        print_red("Valeur invalide : {0}".format(err))
        exit(1)
    except AttributeError:
        if options.debug:
            log.debug("AttributeError", exc_info=True)
        print_red("Nom de variable inconnue : {0}".format(options.variable[0]))
        exit(1)
    except Exception, err:
        if options.debug:
            log.debug(err, exc_info=True)
        print_red("Erreur inconnue : {0}".format(err))
        exit(1)

if __name__ == '__main__':
    main()