#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source /etc/nulib.sh || exit 1
#source "$(dirname -- "$0")/vendor/nulib/php/load.sh" || exit 1

function copy_nurse() {
    :
}

function copy_mature() {
    local libname libdir path filename class
    local srcdir srcpath srcpackage
    local destdir destpath destpackage

    local src="$1"; shift
    [ -n "$src" ] || die "vous devez spécifier le fichier ou le package arrivant à maturation"

    if [ -f "$src" ]; then
        # fichier
        setx src=abspath "$src"
        [ "${src#$MYDIR/src/}" != "$src" ] || die "la source doit être dans nur-sery/src/"
        src="${src#$MYDIR/src/}"
        if [[ "$src" == */* ]]; then
            path="${src%/*}"
            filename="${src##*/}"
        else
            path=
            filename="$src"
        fi
        class="${filename%.php}"
        srcdir="$MYDIR/src"
        src="$srcdir/$src"
    elif [ -d "$src" ]; then
        # répertoire de package
        setx src=abspath "$src"
        [ "$src" == "$MYDIR/src" -o "${src#$MYDIR/src/}" != "$src" ] || die "la source doit être dans nur-sery/src/"
        srcdir="$src"
        path="${src#$MYDIR/src}"; path="${path#/}"
    else
        # package
        src="${src//\\\\/\/}"
        src="${src%/}"
        [ -d "$MYDIR/src/$src" ] || die "la source doit être un package de nur-sery"
        srcdir="$MYDIR/src/$src"
        path="$src"
    fi
    tsrcdir=
    nurserypackage='nur\sery'; nulibpackage='nulib'
    if [ -n "$path" ]; then
        srcpackage="nur/sery/$path"; srcpackage="${srcpackage//\//\\}"
        destpackage="nulib/$path"; destpackage="${destpackage//\//\\}"
        [ -d "$MYDIR/tests/$path" ] && tsrcdir="$MYDIR/tests/$path"
    else
        srcpackage='nur\sery'
        destpackage='nulib'
    fi

    [ -n "$Dest" ] || Dest=.
    setx Dest=abspath "$Dest"
    if [[ "$Dest" == */nulib ]]; then
        libname=nulib
        libdir="$Dest"
    elif [[ "$Dest" == */nulib/* ]]; then
        libname=nulib
        libdir="${Dest%%/nulib/*}/nulib"
    else
        die "seul la maturation vers nulib est supporté"
    fi

    case "$libname" in
    nulib)
        if [[ "$path" == */* ]]; then
            destdir="$libdir/php/src_${path%%/*}/${path#*/}"
            [ -n "$tsrcdir" ] && tdestdir="$libdir/php/tests/$path"
        elif [ -n "$path" ]; then
            destdir="$libdir/php/src_$path"
            [ -n "$tsrcdir" ] && tdestdir="$libdir/php/tests/$path"
        else
            destdir="$libdir/php/src_base"
            [ -n "$tsrcdir" ] && tdestdir="$libdir/php/tests"
        fi

        if [ -n "$class" ]; then
            # Maturation d'un seul fichier
            etitle "Maturation de $srcpackage vers $destpackage"
            srcname="${src#$srcdir/}"
            dest="$destdir/$srcname"
            estep "$srcname"
            mkdirof "$dest"
            sed "s|${nurserypackage//\\/\\\\}|${nulibpackage//\\/\\\\}|g" <"$src" >"$dest"
        else
            # Maturation de toute un package
            etitle "Maturation de $srcpackage vers $destpackage"
            einfo "$srcdir --> $destdir"
            setx -a srcs=find "$srcdir" -type f
            for src in "${srcs[@]}"; do
                srcname="${src#$srcdir/}"
                dest="$destdir/$srcname"
                estep "$srcname"
                mkdirof "$dest"
                sed "s|${nurserypackage//\\/\\\\}|${nulibpackage//\\/\\\\}|g" <"$src" >"$dest"
            done
            if [ -n "$tsrcdir" ]; then
                einfo "$tsrcdir --> $tdestdir"
                setx -a srcs=find "$tsrcdir" -type f
                for src in "${srcs[@]}"; do
                    srcname="${src#$tsrcdir/}"
                    dest="$tdestdir/$srcname"
                    estep "${src#$tsrcdir/}"
                    mkdirof "$dest"
                    sed "s|${nurserypackage//\\/\\\\}|${nulibpackage//\\/\\\\}|g" <"$src" >"$dest"
                done
            fi
            eend
        fi
        ;;
    esac
}

function nulib_sync_mature() {
    [ -n "$Dest" ] || Dest="$MYDIR/../nulib"
    setx Dest=abspath "$Dest"
    if ! [[ "$Dest" == */nulib ]]; then
        die "seul la maturation vers nulib est autorisée"
    fi
    local srcdir="$MYDIR"
    local destdir="$Dest/php"
    local -a srcs src srcname dest

    estep "Synchronisation des fichiers"
    rsync -a "$srcdir/src/" "$destdir/src/" --exclude /wip/ --delete
    rsync -a "$srcdir/tests/" "$destdir/tests/" --exclude /wip/ --delete

    estep "Mise à jour des packages"
    setx -a dests=find "$destdir/src/" -type f
    for dest in "${dests[@]}"; do
        sed -i 's|nur\\sery|nulib|g' "$dest"
    done
    setx -a dests=find "$destdir/tests/" -type f
    for dest in "${dests[@]}"; do
        sed -i 's|nur\\sery|nulib|g' "$dest"
    done
}

function update_nurse() {
    :
}

function update_mature() {
    srcpackage='nur\sery'
    destpackage='nulib'

    if [ -n "$Dest" ]; then
        setx Dest=abspath "$Dest"
        destdirs=("$Dest")
    else
        Dest="$(pwd)"
        destdirs=()
        [ -d src ] && destdirs+=("$Dest/src")
        [ -d src_app ] && destdirs+=("$Dest/src_app")
        [ -d src_web ] && destdirs+=("$Dest/src_web")
        [ -d tests ] && destdirs+=("$Dest/tests")
    fi

    etitle "Maturation de $srcpackage vers $destpackage"
    for destdir in "${destdirs[@]}"; do
        if [ -d "$destdir" ]; then
            setx rdestdir=relpath "$destdir" "$Dest"
            einfo "$rdestdir"
            setx -a dests=find "$destdir" -type f
            for dest in "${dests[@]}"; do
                destname="${dest#$destdir/}"
                action "$destname" \
                       sed -i "s|${srcpackage//\\/\\\\}|${destpackage//\\/\\\\}|g" "$dest"
            done
        else
            ewarn "$rdestdir: répertoire non trouvé. il sera ignoré"
        fi
    done
}

action=copy
evolution=mature
Dest=
args=(
    "Gérer la maturation d'une classe ou d'un package"
    "
-cm SRC [-d DEST]
-cn SRC
-u[n|m] package|Class [-d DEST]

Il y a deux types d'évolutions possibles:
* mettre en nurserie (-n)
* arriver à maturation (-m)

Pour chaque type d'évolution, il y a deux actions possibles:
* copier (-c)
  * mettre en nurserie (-cn) consiste à copier (importer) un fichier PHP ou un
    package depuis un projet nulib-*
    * SRC est le fichier ou le package du projet nulib-*
  * arriver à maturation (-cm) consiste à copier (exporter) le fichier PHP ou
    le package vers un projet nulib-*
    * SRC est le fichier ou le package
    * DEST est le répertoire du projet nulib-* ou le répertoire courant sinon
* mettre à jour (-u)
  * mettre en nurserie (-un) met à jour les sources d'un projet pour utiliser la
    version de nur/sery
  * arriver à maturation (-um) met à jour les sources d'un projet pour utiliser
    la version mature à maturation
  L'argument est un 'package' ou un 'sous\\package' (dont le nom commence par
  une minuscule) ou une 'Classe' (dont le nom commence par une majuscule)"
    -d:,--dest Dest= "Spécifier la destination"
    -c,--copy action=copy "Copier de/vers un projet nulib-*"
    -u,--update action=update "Mettre à jour un projet. C'est l'option par défaut"
    -i,-n,--nurse evolution=nurse "Mettre en nurserie"
    -x,-m,--mature evolution=mature "Arriver à maturation. C'est l'option par défaut"
    --sm '$action=nulib_sync; evolution=mature' "Maturation complète vers nulib. Equivalent à '-cm nur/sery -d ../nulib' mais omet le package nur\\sery\\wip"
)
parse_args "$@"; set -- "${args[@]}"

"${action}_${evolution}" "$@"
