#!/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

function display_help() {
    uecho "$scriptname: Créer un nouveau fichier à partir d'un modèle

USAGE
    $scriptname [options] file [template options]

OPTIONS
Avant le nom du nouveau fichier, les options suivantes peuvent être utilisées:
    -t TEMPLATE
        Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
        à utiliser est déduit de l'extension ou du nom du fichier.
    -e, --edit
        Editer le fichier après l'avoir créé
    -g, --no-edit
        Ne pas éditer le fichier après l'avoir créé

Après le nom du fichier, toutes les options sont spécifiques au modèle
utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
avoir une description des options disponibles."
}

template=
edit=auto
overwrite=
encoding=auto
executable=auto
opts=() # options non reconnues passées au template
parse_opts + "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    -t:,--template: template= \
    -e,--edit edit=1 \
    -g,--no-edit edit= \
    -f,--overwrite overwrite=1 \
    -E:,--encoding: encoding= \
    -x,--executable executable=1 \
    -n,--no-executable executable= \
    -a,-b,-c,-d,-h,-i,-j,-k,-l,-m,-o,-p,-q,-r,-s,-u,-v,-w,-y,-z,-A,-B,-C,-D,-F,-G,-H,-I,-J,-K,-L,-M,-N,-O,-P,-Q,-R,-S,-T,-U,-V,-W,-X,-Y,-Z '$array_add opts "$option_"' \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

[ -n "$template" ] || template=auto

TEMPLATES=()
TEMPLS=()
templdir="$scriptdir/lib/templates"
if [ -f "$templdir/templates.conf" ]; then
    source "$templdir/templates.conf"
    for at in "${TEMPLATES[@]}"; do
        splitpair "$at" a t
        if [ "$template" == "$a" ]; then
            template="$t"
            break
        fi
    done
fi
array_lsfiles templs "$templdir"

file="$1"; shift
found=1
templ="$templdir/$template"
if [ ! -f "$templ" ]; then
    found=
    for at in "${TEMPLS[@]}"; do
        splitpair "$at" a t
        if [ "$template" == "$a" ]; then
            templ="$templdir/$t"
            found=1
            break
        fi
        [ -n "$found" ] || templ=
    done
    if [ -z "$found" ]; then
        for templ in "${templs[@]}"; do
            if [ -x "$templ" ] && "$templ" --matches-template "$template"; then
                found=1
                break
            fi
        done
        [ -n "$found" ] || templ=
    fi
fi
[ -n "$found" -a -x "$templ" ] || die "$file: Impossible de trouver le template $template${templ:+ ($(basename "$templ"))}"

args=()
[ "$template" != "auto" ] && args=("${args[@]}" --template "$template")
if [ "$edit" != "auto" ]; then
    if [ -n "$edit" ]; then
        args=("${args[@]}" --edit)
    else
        args=("${args[@]}" --no-edit)
    fi
fi
args=("${args[@]}" ${overwrite:+--overwrite})
[ "$encoding" != "auto" ] && args=("${args[@]}" --encoding "$encoding")
if [ "$executable" != "auto" ]; then
    if [ -n "$executable" ]; then
        args=("${args[@]}" --executable)
    else
        args=("${args[@]}" --no-executable)
    fi
fi
exec "$templ" "$file" "${args[@]}" "${opts[@]}" "$@"