#!/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: manipuler des noms de fichier pour les dater

USAGE
    $scriptname (FILE|DIR)s...
    $scriptname -k SRCs... [DESTDIR]
    $scriptname -m SRCs... [DESTDIR]
    $scriptname -c COMMAND [ARGs...]

OPTIONS
    --create-or-rename
        Créer un nouveau fichier (option -f) ou créer un nouveau répertoire
        (option -d), ou renommer un fichier existant sans le changer de
        répertoire. C'est l'option par défaut.
    -f, --create-file
        Créer un nouveau fichier. Cette option est ignorée si le fichier ou le
        répertoire spécifié existe. C'est la valeur par défaut
    -d, --create-dir
        Créer un nouveau répertoire. Cette option est ignorée si le fichier ou
        le répertoire spécifié existe.
    -k, --copy
        Copier le fichier SRC vers la destination DESTDIR qui vaut par défaut le
        répertoire courant si un seul fichier source est spécifié. Si plusieurs
        fichiers sources sont spécifiés, il faut absolument spécifier un
        répertoire destination. Dans la destination, les fichiers sont nommés
        avec la date en préfixe.
    -m, --move
        Déplacer le fichier SRC vers la destination DESTDIR qui vaut par défaut
        le répertoire courant si un seul fichier source est spécifié. Si
        plusieurs fichiers sources sont spécifiés, il faut absolument spécifier
        un répertoire destination. Dans la destination, les fichiers sont nommés
        avec la date en préfixe.
    -c, --cmd
        Les arguments sont une commande à lancer. Dans les argument, PLACEHOLDER
        est remplacé par la date. Si le PLACEHOLDER n'est trouvé dans aucun des
        arguments, alors ajouter la date à la fin de la commande. Par exemple,
        voici comment émuler l'option -k
            $scriptname -c cp src dest/~~
    -P, --placeholder PLACEHOLDER
        Dans le nom spécifié, remplacer PLACEHOLDER par la date. Par défaut,
        PLACEHOLDER vaut ~~. Si le nom spécifié ne contient pas le PLACEHOLDER,
        il est placé au début.
    -F, --format FORMAT
        Spécifier le format de la date à insérer dans le nom du fichier. Par
        défaut, FORMAT vaut 'YYMMDD-'
        Les formats valides sont:
            YYYY année sur 4 chiffres
            YY   année sur 2 chiffres
            MM   mois sur 2 chiffres
            DD   jour sur 2 chiffres
        Tous les autres caractères sont pris tels-quels"
}

function create() {
    case "$create" in
    file) touch "$1";;
    dir) mkdir -p "$1";;
    esac
}
function have_ph() {
    [[ "$1" == *"$placeholder"* ]]
}
function replace_ph() {
    awkrun ph="$placeholder" format="$format" autof:int="$autof" '
BEGIN {
  gsub(/%/, "%%", format)
  gsub(/YYYY/, "%Y", format)
  gsub(/YY/, "%y", format)
  gsub(/MM/, "%m", format)
  gsub(/DD/, "%d", format)
  date = strftime(format)
}
{
  if (index($0, "/") != 0) {
    match($0, /\/[^/]*$/)
    dir = substr($0, 1, RSTART)
    name = substr($0, RSTART + 1)
  } else {
    dir = ""
    name = $0
  }

  if (autof) {
    pos = index(name, ph)
    if (pos == 0) {
      print dir date "-" name
    } else if (pos == 1) {
      print dir date "-" substr(name, length(ph) + 1)
    } else if (pos == length(name) - length(ph) + 1) {
      print dir substr(name, 1, length(name) - length(ph)) "-" date
    } else {
      print dir substr(name, 1, pos - 1) date substr(name, pos + length(ph))
    }
  } else {
    pos = index(name, ph)
    if (pos == 0) {
      print dir date name
    } else {
      print dir substr(name, 1, pos - 1) date substr(name, pos + length(ph))
    }
  }
}' <<<"$1"
}

action=create
create=
placeholder=
format=
parse_opts "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    --create-or-rename action=create \
    -d,--create-dir create=dir \
    -f,--create-file create=file \
    -k,--copy action=copy \
    -m,--move action=move \
    -c,--cmd action=cmd \
    -P:,--placeholder: placeholder= \
    -F:,--format: format= \
    --autof autof=1 \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

[ -n "$create" ] || create=file
[ -n "$placeholder" ] || placeholder="~~"
if [ -n "$format" ]; then
    autof=
else
    format=YYMMDD
    autof=1
fi

if [ "$action" == cmd ]; then
    # Il faut lancer une commande spécifiée
    [ $# -gt 0 ] || set -- echo
    args=()
    found=
    for arg in "$@"; do
        if have_ph "$arg"; then
            check_interaction -c && evalx qvals "${args[@]}" "$arg" // estepi "Commande:"
            setx arg=replace_ph "$arg"
            read_value "Veuillez confirmer le nom" arg "$arg"
            found=1
        fi
        args=("${args[@]}" "$arg")
    done
    if [ -z "$found" ]; then
        setx arg=replace_ph
        read_value "Veuillez entrer le nom du fichier" arg "$arg"
        args=("${args[@]}" "$arg")
    fi

    if show_debug; then
        evalx qvals "${args[@]}" // edebug "Commande:"
        ask_yesno "Voulez-vous continuer?" X || die
    fi
    "${args[@]}"

elif [ "$action" == copy -o "$action" == move ]; then
    if [ $# -eq 0 ]; then
        die "Vous devez spécifier les fichiers"
    elif [ $# -eq 1 ]; then
        src="$1"
        destdir=.
        srcs=("$src")
    else
        args=("$@")
        setx destdir=last_value args
        array_copy_firsts srcs args
    fi
    if [ ! -d "$destdir" ]; then
        ewarn "$destdir: répertoire introuvable"
        ask_yesno "Voulez-vous le créer?" X || die
        mkdir -p "$destdir" || die
    fi
    if [ "$action" == copy ]; then
        cmdinfo="Copie"
        cmd=(cp -i)
    elif [ "$action" == move ]; then
        cmdinfo="Déplacement"
        cmd=(mv -i)
    fi
    for src in "${srcs[@]}"; do
        setx srcname=basename -- "$src"
        if [ -e "$src" ]; then
            einfo "$cmdinfo de $(ppath "$src")"
            setx destname=replace_ph "$srcname"
            read_value "Veuillez confirmer le nom" destname "$destname"
            "${cmd[@]}" "$src" "$destdir/$destname"
        else
            ewarn "$src: fichier introuvable"
        fi
    done

elif [ "$action" == create ]; then
    if [ $# -gt 0 ]; then
        for src in "$@"; do
            setx dir=dirname -- "$src"
            setx srcname=basename -- "$src"
            if [ -e "$src" ]; then
                einfo "Renommage de $(ppath "$src")"
                setx destname=replace_ph "$srcname"
                read_value "Veuillez confirmer le nom" destname "$destname"
                mv -i "$src" "$dir/$destname"
            else
                einfo "Création de $(ppath "$src")"
                setx destname=replace_ph "$srcname"
                read_value "Veuillez confirmer le nom" destname "$destname"
                create "$dir/$destname"
            fi
        done
    else
        case "$create" in
        file) einfo "Création d'un nouveau fichier";;
        dir) einfo "Création d'un nouveau répertoire";;
        esac
        setx destname=replace_ph
        read_value "Veuillez entrer le nom" destname "$destname"
        create "$destname"
    fi

else
    die "$action: action non implémentée"
fi