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

function display_help() {
    uecho "$scriptname: classer des fichiers selon certains règles

Les règles sont dans le fichier ~/etc/default/ufile
Consulter ce fichier pour les détails

USAGE
    $scriptname [options] <files...>

OPTIONS
    -n, --fake
        Afficher les opérations qui seraient faites"
}

args=(%
    --help '$exit_with display_help'
    -n,--fake fake=1
)
parse_args "$@"; set -- "${args[@]}"

if [ -n "$fake" ]; then
    function docmd() { qvals "$@"; }
else
    function docmd() { "$@"; }
fi

[ $# -gt 0 ] || die "Vous devez spécifier des fichiers à classer"
[ ${#RULES[*]} -gt 0 ] || die "Vous devez spécifier des règles pour le classement des fichiers dans ~/default/ufile"

for file in "$@"; do
    [ -f "$file" -o -n "$fake" ] || {
        eerror "$file: fichier introuvable. il sera ignoré"
        continue
    }
    setx pf=abspath "$file"
    setx dir=dirname "$pf"
    setx filename=basename "$pf"
    found=
    for rule in "${RULES[@]}"; do
        splitpair "$rule" pattern r2
        splitpair "$r2" destdir r3
        splitpair "$r3" renamef r4
        if [ "${destdir#"~/"}" != "$destdir" ]; then
            destdir="$HOME/${destdir#"~/"}"
        elif [ "${destdir#/}" == "$destdir" ]; then
            die "règle '$rule' invalide: destdir doit être absolu"
        fi
        if eval "[[ \"\$filename\" == $(qwc "$pattern") ]]"; then
            if [ -n "$renamef" ]; then
                setx newname="$renamef" "$filename" "$pf" "$destdir"
                if [[ "$newname" == */* ]]; then
                    splitpath "$newname" destdir destname
                else
                    destname="$newname"
                fi
            else
                newname="$filename"
            fi
            estep "$filename --> $destdir/$destname"
            ask_yesno -i "Voulez-vous continuer?" O || { found=x; break; }
            docmd mkdir -p "$destdir" || die "$destdir: impossible de créer le répertoire"
            docmd mv -i "$file" "$destdir/$destname" || die "problème lors du déplacement du fichier"
            found=1
            break
        fi
    done
    if [ -z "$found" ]; then
        ewarn "$file: aucune correspondance n'a été trouvée"
    fi
done