#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS runs template

function display_help() {
    uecho "$scriptname: Gérer un répertoire d'hôte de runs

USAGE
    $scriptname [options]

OPTIONS
    -d, --destdir DESTDIR
        Spécifier le répertoire d'hôte dans lequel copier les fichiers.
    -l, --list
        Lister les templates disponibles.
    -m, --merge
        Copier les templates spécifiés dans le répertoire d'hôte s'il n'y
        existent pas déjà. Les templates ayant l'extension '.template' doivent
        être demandés explicitement. Sinon, ils sont ignorés.
    -z, --unmerge
        Supprimer les fichiers du répertoire d'hôte s'ils n'ont pas été modifiés
        par rapport aux templates.
    -C, --clean
        Supprimer les répertoires vides dans le répertoire de référence. Peut
        être utile après -z
    -g, --diff
        Afficher les différences entre les templates et les fichiers du
        répertoire d'hôte.
    --list-vars
        Afficher la valeur par défaut des variables prédéfinies
    --write-vars
        Forcer l'écriture des valeurs actuelles des variables dans le fichier
        .runsconfig, ce qui permet d'éviter de les spécifier à chaque fois avec
        l'option -v
    -v, --var NAME=VALUE
        Spécifier la valeur d'une variable. Il est possible de spécifier des
        valeurs qui ne sont pas dans la liste prédéfinie."
}
function __templatectl_display_help() { display_help; }

set_defaults runs
# essayer de déterminer l'hôte à partir du répertoire courant
host=
array_split __hostsdirs "$RUNSHOSTSPATH" :
setx __cwd=pwd
for __hostsdir in "${__hostsdirs[@]}"; do
    setx __hostsdir=abspath "$__hostsdir"
    if [ "${__cwd#$__hostsdir/}" != "$__cwd" ]; then
        host="${__cwd#$__hostsdir/}"
        host="${host%%/*}"
        break
    fi
done
# sinon lire l'environnement
if [ -z "$host" ]; then
    runs_initdomains
    setx host=myhost
    splithost "$host" hostname domain
    if [ -z "$domain" ]; then
        host="$(runs_find_host "$host")"
        splithost "$host" hostname domain
    fi
    [ -n "$domain" ] || host="$(runs_add_domain "$host")"
fi
hostname="${host%%.*}"
TEMPLATE_VARS=(
    host hostname
)
function update_template_var() {
    # mettre à jour la valeur d'une variable en tenant compte de certaines
    # dépendances. par exemple, si on modifie host, il faut mettre à jour
    # hostname.
    local __orig_value="${!1}"
    array_addu TEMPLATE_VARS "$1"
    setv "$1" "$2"

    case "$1" in
    host) hostname="${host%%.*}";;
    esac

    [ "$2" != "$__orig_value" ]
}

__vars=()
__list_vars=
__write_vars=
__TEMPLATECTL_SUPPLOPTS=(
    -v:,--var: __vars
    --list-vars __list_vars=1
    --write-vars __write_vars=1
)
__templatectl_parseopts "$@" && \
    set -- "${args[@]}" || die "$args"

# répertoire source
setx __templatectl_srcdir=templatesrc runsconfig
# répertoire d'hôte
[ -n "$__templatectl_destdir" ] || __templatectl_destdir=.

# charger les variables
__runsconfig_vars="$__templatectl_destdir/.runsconfig"
if [ -f "$__runsconfig_vars" ]; then
    source "$__runsconfig_vars"
    for __var in "${__runsconfig[@]}"; do
        splitvar "$__var" __name __value
        update_template_var "$__name" "$__value"
    done
fi

# mettre à jour les variables
__modified=
for __var in "${__vars[@]}"; do
    splitvar "$__var" __name __value
    update_template_var "$__name" "$__value" && __modified=1
done

# enregistrer les valeurs des variables
if [ -n "$__modified" -o "$__write_vars" ]; then
    >"$__runsconfig_vars"
    echo "__runsconfig=(" >>"$__runsconfig_vars"
    for __var in "${TEMPLATE_VARS[@]}"; do
        echo_setv "$__var=${!__var}" >>"$__runsconfig_vars"
    done
    echo ")" >>"$__runsconfig_vars"
fi

# afficher les variables
if [ -n "$__list_vars" ]; then
    for __var in "${TEMPLATE_VARS[@]}"; do
        echo_setv "$__var=${!__var}"
    done
fi

# gérer les fichiers template et locaux
if [ -z "$__templatectl_opt" -a -z "$__list_vars" -a -z "$__write_vars" ]; then
    __templatectl_auto=1
fi
[ -d "$__templatectl_destdir" ] || die "$__templatectl_destdir: répertoire introuvable"
__templatectl_do "$@"