#!/bin/bash -xe

HOST_NAME=$1
IMAGE_NAME=$2

if [ -z "$IMAGE_NAME" ]; then
    echo "PAS DE NOM DE MODULE"
    exit 1
fi

. config.sh

rm -rf "$IMAGE_NAME_RISOTTO_IMAGE_DIR" tmp
mkdir -p "$RISOTTO_IMAGE_DIR"
PKG=""
BASE_DIR=""
for script in $(ls $IMAGE_NAME/preinstall/*.sh 2> /dev/null); do
    . "$script"
done

if [ -z "$OS_NAME" ]; then
    echo "NO OS NAME DEFINED"
    exit 0
fi
if [ -z "$RELEASEVER" ]; then
    echo "NO RELEASEVER DEFINED"
    exit 0
fi
if [ -z "$INSTALL_TOOL" ]; then
    echo "NO INSTALL TOOL DEFINED"
    exit 0
fi
BASE_NAME="$OS_NAME-$RELEASEVER"
BASE_DIR="$IMAGE_BASE_RISOTTO_BASE_DIR/$BASE_NAME"
BASE_TAR="$IMAGE_BASE_RISOTTO_BASE_DIR-$BASE_NAME".tar
BASE_PKGS_FILE="$IMAGE_BASE_RISOTTO_BASE_DIR-$BASE_NAME.pkgs"
BASE_LOCK="$IMAGE_BASE_RISOTTO_BASE_DIR-$BASE_NAME.build"

function dnf_opt() {
    INSTALL_DIR=$1
    INSTALL_PKG=$2
    echo "--setopt=install_weak_deps=False --nodocs --noplugins --installroot=$INSTALL_DIR --releasever $RELEASEVER install $INSTALL_PKG"
}
function new_package_base() {
    if [ "$INSTALL_TOOL" = "dnf" ]; then
        OPT=$(dnf_opt "$BASE_DIR" "$BASE_PKG")
        dnf --assumeno $OPT | grep ^" " > "$BASE_PKGS_FILE".new
    else
        debootstrap --include="$BASE_PKG" --variant=minbase "$RELEASEVER" "$BASE_DIR"
        chroot "$BASE_DIR" dpkg-query -f '${binary:Package} ${source:Version}\n' -W > "$BASE_PKGS_FILE".new
    fi
}
function install_base() {
    if [ "$INSTALL_TOOL" = "dnf" ]; then
        OPT=$(dnf_opt "$BASE_DIR" "$BASE_PKG")
        dnf --assumeyes $OPT
    fi
}
function new_package() {
    if [ "$INSTALL_TOOL" = "dnf" ]; then
        OPT=$(dnf_opt "$IMAGE_NAME_RISOTTO_IMAGE_DIR" "$PKG")
        dnf --assumeno $OPT | grep ^" " > "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new
    else
        chroot "$IMAGE_NAME_RISOTTO_IMAGE_DIR" apt install --no-install-recommends --yes $PKG -s 2>/dev/null|grep ^"Inst " > "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new
    fi
}
function install_pkg() {
    if [ "$INSTALL_TOOL" = "dnf" ]; then
        OPT=$(dnf_opt "$IMAGE_NAME_RISOTTO_IMAGE_DIR" "$PKG")
        dnf --assumeyes $OPT
    else
        chroot "$IMAGE_NAME_RISOTTO_IMAGE_DIR" apt install --no-install-recommends --yes $PKG
    fi
}


if [ ! -f "$BASE_LOCK" ]; then
    rm -rf "$BASE_DIR"
    new_package_base
    diff -u "$BASE_PKGS_FILE" "$BASE_PKGS_FILE".new && NEW_BASE=false || NEW_BASE=true
    if [ ! -f "$BASE_TAR" ] || [ "$NEW_BASE" = true ]; then
        mkdir -p "$IMAGE_BASE_RISOTTO_BASE_DIR"
        install_base
        cd "$IMAGE_BASE_RISOTTO_BASE_DIR"
        tar cf "$BASE_TAR" "$BASE_NAME"
        cd -
        if [ -f "$BASE_PKGS_FILE" ]; then
            mv "$BASE_PKGS_FILE" "$BASE_PKGS_FILE".old
        fi
        mv "$BASE_PKGS_FILE".new "$BASE_PKGS_FILE"
        rm -rf "$IMAGE_BASE_RISOTTO_BASE_DIR"
    fi
    rm -rf "$BASE_DIR"
    touch "$BASE_LOCK"
fi

tar xf "$BASE_TAR"
mv "$BASE_NAME" "$IMAGE_NAME_RISOTTO_IMAGE_DIR"
if [ -n "$COPR" ]; then
    #FIXME signature...
    mkdir -p "$REPO_DIR"
    cd "$REPO_DIR"
    wget "$COPR"
    cd -
fi

# FIXME verifier s'il y a des modifs sur pre/post
if [ -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR".base.pkgs ] && [ -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs ]; then
    echo "Différence(s) avec les paquets de base"
    diff -u "$IMAGE_NAME_RISOTTO_IMAGE_DIR".base.pkgs "$BASE_PKGS_FILE" && NEW_BASE=false || NEW_BASE=true
else
    NEW_BASE=true
fi
new_package
if [ "$NEW_BASE" = false ]; then
    echo "Différence(s) avec les paquets de l'image"
    diff -u "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new && INSTALL=false || INSTALL=true
else
    INSTALL=true
fi
if [ "$INSTALL" = true ]; then
    if [ -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER".version ]; then
        VERSION=$(cat "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER".version)
    else
        VERSION=0
    fi
    mkdir tmp
    cd tmp
    if [ ! "$VERSION" = 0 ]; then
        tar xf "$IMAGE_NAME_RISOTTO_IMAGE_NAME"
    fi
    ../make_changelog "$IMAGE_NAME" "$VERSION" "$OS_NAME" "$RELEASEVER" > "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER"_"$VERSION"_changelog.md
    cd -
    rm -rf tmp
    install_pkg
    sleep 2
    
    for script in $(ls $IMAGE_NAME/postinstall/*.sh 2> /dev/null); do
        . "$script"
    done
    
    CONTAINER=$IMAGE_NAME ./make_volatile /etc
    if [ ! "$?" = 0 ]; then
        echo "make_volatile failed"
        exit 1
    fi
    cd "$RISOTTO_IMAGE_DIR"
    #7zr a "$IMAGE_NAME".7z "$IMAGE_NAME"
    if [ -f "$IMAGE_NAME_RISOTTO_IMAGE_NAME" ]; then
        mv -f "$IMAGE_NAME_RISOTTO_IMAGE_NAME" "$IMAGE_NAME_RISOTTO_IMAGE_NAME".old
    fi
    tar cf "$IMAGE_NAME_RISOTTO_IMAGE_NAME" "$IMAGE_NAME"
    sha256sum "$IMAGE_NAME_RISOTTO_IMAGE_NAME" > "$IMAGE_NAME_RISOTTO_IMAGE_NAME".sha
    cd -
    cp -f "$BASE_PKGS_FILE" "$IMAGE_NAME_RISOTTO_IMAGE_DIR".base.pkgs
    mv -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs
    VERSION=$((VERSION + 1)) 
    echo "$VERSION" > "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER".version
fi
rm -rf "$IMAGE_NAME_RISOTTO_IMAGE_DIR"
exit 0