# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@require instinc/prefixes
##@require instinc/wobase
##@require instinc/wofunctions

function get_default_configfile() {
    # $1=resdir (woadir/Contents/Resources ou fwkdir/Resources)
    local configs configfile
    array_from_lines configs "$(list_files "$1" "*.config")"
    if [ ${#configs[*]} -eq 0 ]; then
        array_from_lines configs "$(list_files "$1" "config.xml")"
    fi
    echo "${configs:-Properties}"
}


function set_config_property() {
    # Modifier la propriété $2 avec la valeur $3 du fichier de configuration par
    # défaut de l'application $1. On peut préciser le nom du fichier de
    # configuration à utiliser avec $4. Par défaut, il s'agit du premier fichier
    # ayant l'extension .config. Il doit s'agir d'un fichier de propriétés java.

    # si $2 vaut "-", $3 doit être de la forme "[configfile/]prop=value" ou
    # ">configfile[:srcfile]"

    local action=setprop
    local bundir="$1" prop="$2" value="$3" configfile="$4"
    local srvresdir="$APP_SRVRESDIR"
    if is_wofwdir "$bundir"; then
        srvresdir="$FW_SRVRESDIR"
    fi
        
    if [ "$prop" == "-" ]; then
        if beginswith "$value" ">"; then
            # choix d'un fichier de configuration par défaut
            action=setconfigfile
            configfile="${value#>}"
            prop=
            if [ "${configfile//:/}" != "$configfile" ]; then
                # on a donné un fichier source
                prop="copysrcfile"
                value="${configfile##*:}"
                configfile="${configfile%:*}"
            fi
        else
            # modification de la valeur d'une propriété
            prop="${value%%=*}"
            if [ "${prop//\//}" != "$prop" ]; then
                # on a donné le nom du fichier de propriété
                configfile="${prop%/*}"
                prop="${prop##*/}"
            fi
            value="${value#*=}"
        fi
    fi
    if [ -z "$configfile" ]; then
        if [ -n "$DEFAULT_CONFIGFILE" ]; then
            configfile="$DEFAULT_CONFIGFILE"
        else
            configfile="$(get_default_configfile "$bundir/$srvresdir")"
        fi
    fi

    if [ "$action" == "setprop" ]; then
        dest="$configfile"
        first_char_is "$dest" "/" || dest="$bundir/$srvresdir/$dest"
        mkdirof "$dest"
        file_set_properties -c "$dest" "$prop" "$value"
    elif [ "$action" == "setconfigfile" ]; then
        if [ "$prop" == "copysrcfile" ]; then
            src="$value"
            dest="$configfile"
            # chemin absolus
            first_char_is "$src" "/" || src="$bundir/$srvresdir/$src"
            first_char_is "$dest" "/" || dest="$bundir/$srvresdir/$dest"
            mkdirof "$dest"
            /bin/cp -f "$src" "$dest"
        fi
        DEFAULT_CONFIGFILE="$configfile"
    fi
}

function set_eomodel_property() {
    :
}

function woconf_display_help() {
    echo "$scriptname: vérifier et modifier la configuration d'une application
ou d'un framework

USAGE
    $scriptname <fw.framework|app.woa> \"conf_cmds\"

Les lignes de configuration peuvent être:
    #commentaire                -- un commentaire (ignoré)
    v[erify]                    -- vérifier et corriger la consistance.
                                   Cette action est faite automatiquement sauf
                                   avec l'option --noverify.
    c>configfile                -- changer le fichier de configuration par
                                   défaut
    c>configfile:srcfile        -- copier le fichier de configuration srcfile
                                   sur configfile et choisir ce fichier comme
                                   fichier de configuration par défaut
    c[configfile/]prop=value    -- modifier une propriété du fichier de
                                   configuration.
    === les options suivantes ne sont pas encore implémentées =================
    eprofile:user:password      -- configurer l'eomodel par défaut selon le
                                   profil
    ehost:port:instance:user:passwd
                                -- configurer l'eomodel par défaut avec les
                                   valeurs données
    Ename.eomodeld:profile:user:password
                                -- configurer l'eomodel donné selon le profil
    Ename.eomodeld:host:port:instance:user:password
                                -- configurer l'eomodel donné avec les valeurs
                                   données
Les lignes de configuration suivantes sont spécifiques aux application (.woa)
    aMyFramework[.framework]    -- ajouter un framework
    rMyFramework[.framework]    -- enlever un framework
    sbefore:after               -- faire un recherche/remplacement
    f[ix_case]                  -- corriger la casse du classpath selon les
                                   frameworks installés"
}

function woconf() {
    local noverify=

    local end_of_options
##@include sysinc/begingetopt
    -h|--help)
        woconf_display_help
        exit 0
        ;;
    --no-verify)
        # ne pas effectuer automatiquement la vérification du bundle
        noverify=1
        ;;
##@include sysinc/endgetopt

    local tagdir="$1" srcdir bundir

    if [ -z "$tagdir" ]; then
        die "Il faut spécifier l'application ou le framework à modifier"
    fi
    tagdir="$(abspath "$1")"

    if is_wosrcdir "$tagdir"; then
        srcdir="$tagdir"
        set_wobindir "$srcdir" bundir desc
        
    elif is_woappdir "$tagdir"; then
        bundir="$tagdir"
        
    elif is_wofwdir "$tagdir"; then
        bundir="$tagdir"
        
    else
        die "Le bundle doit être un framework ou une application"
    fi

    [ -w "$bundir" ] || die "Répertoire de bundle non accessible en écriture."

    bundir="${bundir%/}"
    if [ -z "$noverify" ]; then
        verifix_bundle "$bundir"
    fi

    array_from_lines conf_cmds "$2"
    for conf_cmd in "${conf_cmds[@]}"; do
        action="$(first_char "$conf_cmd")"
        option="$(last_chars "$conf_cmd")"
        if [ "$action" == "#" ]; then
            : # commentaire ignoré
        elif [ "$action" == "v" ]; then
            verifix_bundle "$bundir"
        elif [ "$action" == "c" ]; then
            set_config_property "$bundir" - "$option"
        elif [ "$action" == "e" ]; then
            set_eomodel_property "$bundir" - "$option"
        elif [ "$action" == "a" ]; then
            add_framework "$bundir" "$option"
        elif [ "$action" == "r" ]; then
            remove_framework "$bundir" "$option"
        elif [ "$action" == "s" ]; then
            search="${option%%:*}"
            replace="${option#*:}"
            searchreplace_classpath "$bundir" "$search" "$replace"
        elif [ "$action" == "f" ]; then
            fix_jars_case "$bundir"
        else
            eerror "Commande inconnue: $action"
        fi
    done
}
