#!/usr/bin/env sh

# Fonctions d'affichage de messages d'erreur
error() {
    printf "\x1b[31m$1\e[0m\n"
    exit 1
}

# Fonctions d'affichage de messages d'information
info() {
    printf "$1\n"
}

# Fonctions d'affichage de messages d'avertissement
warn() {
    printf "⚠️  \x1b[33m$1\e[0m\n"
}

# Affichage d'une ligne de séparation
lineSpacer() {
    echo '-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
}

# Fonction de validation de dépendance
validate_dependency() {
    if ! command -v $1 >/dev/null; then
        error "!! => $1 est requis pour installer scut. svp installer $1 et essayer a nouveau.\n"
    fi
}

# Fonction de validation de tous les dépendances
validate_dependencies() {
    validate_dependency wget
    info "===> wget ... OK"
    validate_dependency unzip
    info "===> unzpip ... OK"
    validate_dependency sha256sum
    info "===> sha256sum ... OK"
}

# Fonction de suppression des fichiers scut-latest.zip* du répertoire courant
deleteCurrentscutLatestZip(){
    # Vérifier que le ou les fichier scut-latest.zip* n'existe pas
    if [ -f "scut-latest.zip" ]; then
        rm -f scut-latest.zip*
    fi  
}

# Fonction de suppression du fichier scut-latest.zip*
deleteOldDownload() {
    # Vérifier et supprimer le ou les fichier scut-latest.zip* du répertoire courant
    deleteCurrentscutLatestZip

    # Vérifier que le répertoire ~/.config/scut/ est vide si non effacer scut et readme
    if [ -d "~/.config/scut/" ]; then
        if [ $(ls -A ~/.config/scut/ | wc -l) -eq 0 ]; then
            rm -rf ~/.config/scut/scut
            rm -rf ~/.config/scut/README.md
        fi
    fi
}

# Fonction de téléchargement du logiciel
downloadSoftware() {    
    # Vérifier que le ou les fichier scut-latest.zip* n'existe pas et les supprimers
    deleteOldDownload

    # Télécharge le fichier scut-latest.zip
    wget  -q https://git.bcmaison.cf/Outils/scut-reminder/raw/branch/main/scut-latest.zip

    # Vérifie le code de retour de wget 
    if [ $? -eq 0 ]; then
        info "===> Téléchargement de scut-latest.zip réussi!"
    else
        error "!! => Erreur lors du téléchargement."        
    fi

    # Vérifie que le fichier a bien été téléchargé
    if [ -f "scut-latest.zip" ]; then
        info "===> Fichier scut-latest.zip téléchargé avec succès."
    else
        error "!! => Échec du téléchargement du fichier scut-latest.zip."  
    fi
}

# Fonction de vérification du checksum du logiciel
checksumSoftware() {
    # Download le fichier de checksum
    wget -q https://git.bcmaison.cf/Outils/scut-reminder/raw/branch/main/scut-latest.zip.sha256

    # Extrait le checksum du fichier
    CHECKSUM=$(cat scut-latest.zip.sha256 | awk '{ print $1 }')

    # Vérifie le checksum du fichier téléchargé
    checksum_actuel=$(sha256sum scut-latest.zip | awk '{ print $1 }')

    if [ "$CHECKSUM" == "$checksum_actuel" ]; then
        info "===> Checksum validé - Fichier intègre."
    else
        error "!! => Erreur de checksum - Fichier corrompu."        
    fi
}

# Fonction d'installation du logiciel
installSoftware() {
    # Vérifier si le répertoire existe déjà
    if [ ! -d "~/.config/scut/" ]; then
        # Le répertoire n'existe pas, on le crée
        mkdir -p ~/.config/scut
        info "===> répertoire ~/.config/scut/ créé avec succès."
    fi

    # Désarchiver le zip dans ce dossier si le répertoire ~/.config/scut/ est vide
    if [ $(ls -A ~/.config/scut/ | wc -l) -eq 0 ]; then
        info "===> Désarchivage de scut-latest.zip dans ~/.config/scut/"
        unzip -q -f scut-latest.zip -d ~/.config/scut/
    else
        warn "Le répertoire ~/.config/scut/ n'est pas vide, les configurations existantes ne seront pas écrasées."
        # Désarchiver seulement le binaire scut et le REDADME.md dans ~/.config/scut/
        unzip -q -f scut-latest.zip scut README.md -d ~/.config/scut/ 
    fi

    # Vérifier qu'au moins un fichier a été extrait
    if [ $(ls -A ~/.config/scut/ | wc -l) -eq 0 ]; then
        echo "Aucun fichier extrait !" 
        exit 1
    fi
}

# Fonction de nettoyage du répertoire courant
cleanupCurrentDir(){
    # Vérifier et supprimer le ou les fichier scut-latest.zip* du répertoire courant
    deleteCurrentscutLatestZip
}


# début du script
# ==--==--==--==--==--==--==
lineSpacer
info "=> DÉBUT de l'installation :"
lineSpacer

# Vérification des dépendances
# ==--==--==--==--==--==--==
info "\n=> Validation des DÉPENDENCES d'installation :"
lineSpacer
validate_dependencies

# download scut-latest.zip
# ==--==--==--==--==--==--==
info "\n=> TÉLÉCHARGEMENT du programme :"
lineSpacer
downloadSoftware

# Télécharge le fichier de checksum
# ==--==--==--==--==--==--==
info "\n=> VÉRIFICATION du checksum :"
lineSpacer
checksumSoftware

# unzip scut-<date>.zip in ~/.config/scut/
# ==--==--==--==--==--==--==
info "\n=> INSTALLATION du programme :"
lineSpacer
installSoftware

# cleanup current directory
# ==--==--==--==--==--==--==
info "\n=> CLEANUP de l'installation :"
lineSpacer
cleanupCurrentDir

# Fin du script
# ==--==--==--==--==--==--==
info "\n=> FIN de l'installation ! :-)"
lineSpacer
