#!/bin/bash

base_chemin_mv=/tmp/ramdisk/qemu-adm
bin_qemu="qemu-system-x86_64"

die()
{
	echo -e "\033[0;31m${1}\033[0m" 1>&2; exit ${2};
}

verifMVExiste()
{
	if [ -e "${base_chemin_mv}/${nom_mv}" ]; then
		die "Le répertoire de la machine virtuelle ${base_chemin_mv}/${nom_mv} existe déjà." 4
	fi
}

nouvMV()
{
	local l_option=${1}
	local l_parametre=${2}
	case "${l_option}" in
		"nom")
			echo "-name ${l_parametre} \\" > ${chemin_mv}
			;;
		"cpu")
			echo "-cpu ${l_parametre} \\" >> ${chemin_mv}
			;;
		"memoire")
			echo "-memoire ${l_parametre} \\" >> ${chemin_mv}
			;;
	esac
}

execCmd()
{
	#verifEnv
	for ((id_commande=0 ; "${#commandes_a_executer[*]}" - "${id_commande}"; id_commande++)); do
		${commandes_a_executer["${id_commande}"]}
	done
	echo "########## FICHIER ##########" # Debogage
	cat ${chemin_mv} # Debogage
}

confInteractive()
{
	echo "confInteractive" # Debogage
}

presenceParametre()
{
	echo "presenceParametre" # Debogage
	local l_nombre_arguments="${1}"
	local l_nom_option="${2}"
	local l_nombre_parametres=${l_nombre_arguments}-1 # On soustrait l'option du nombre d'arguments resultant le nombre de parametres
	if [[ "${l_nombre_parametres}" -eq 0 ]]; then
		die "L'option ${l_nom_option} n'a pas de paramètre." 5
	fi
}

creeMV()
{
	nom_mv="$(basename ${1})"
	if [[ "$(dirname ${1})" != "." ]];then
		base_chemin_mv="$(dirname ${1})"
	fi
	chemin_mv="${base_chemin_mv}/${nom_mv}/qemu-${nom_mv}.mv"
	echo "nom_mv=${nom_mv}" # Debogage
	echo "base_chemin_mv=${base_chemin_mv}" # Debogage
	commandes_a_executer+=("nouvMV nom ${nom_mv}")
	shift # On retire le nom de la machine virtuelle passé en argument
	echo 1 "$#" # Debogage
	while [[ $# -gt 0 ]]; do
		case "${1}" in
			"-c") # Cpu (requis)
				echo "cpu" # Debogage
				parametre="${2}"
				echo "cpu parametre=${parametre}" # Debogage
				presenceParametre "$#" "$1"
				shift
				if [[ ${temoin_c} -ne 1 ]]; then
					commandes_a_executer+=("nouvMV cpu ${1}")
					temoin_c=1
				else
					die "L'option ${1} a déjà été renseignée." 3
				fi
				;;
			"-m") # Memoire (requis)
				echo "memoire" # Debogage
				parametre="${2}"
				echo "memoire parametre=${parametre}" # Debogage
				presenceParametre "$#" "$1"
				shift
				if [[ ${temoin_m} -ne 1 ]]; then
					commandes_a_executer+=( "nouvMV memoire ${1}")
					temoin_m=1
				else
					die "L'option ${1} a déjà été renseignée." 3
				fi
				;;
			"-b") # Bios
				echo "bios" # Debogage
				parametre="${2}"
				echo "bios parametre=${parametre}" # Debogage
				presenceParametre "$#" "$1"
				shift
				if [[ ${temoin_b} -ne 1 ]]; then
					#commandes_a_executer+=( "nouvMV ${nom_mv}")
					temoin_b=1
				else
					die "L'option ${1} a déjà été renseignée." 3
				fi
				;;
			"-d") # Disque
				echo "disque" # Debogage
				parametre="${2}"
				presenceParametre "$#" "$1"
				echo "disque parametre=${parametre}" # Debogage
				shift
				;;
			"-i") # Iso
				echo "iso" # Debogage
				parametre="${2}"
				presenceParametre "$#" "$1"
				echo "iso parametre=${parametre}" # Debogage
				shift
				;;
			'-r') # Reseau
				echo "reseau" # Debogage
				parametre="${2}"
				presenceParametre "$#" "$1"
				echo "reseau parametre=${parametre}" # Debogage
				shift
				;;
			'-p') # Parametres
				echo "parametres" # Debogage
				parametre="${2}"
				presenceParametre "$#" "$1"
				echo "parametres parametre=${parametre}" # Debogage
				shift
				;;
			"-s") # Sous-volume BTRFS
				echo "sous-volume" # Debogage
				if [[ ${temoin_s} -ne 1 ]]; then
					#commandes_a_executer+=( "nouvMV ${nom_mv}")
					temoin_s=1
				else
					die "L'option ${1} a déjà été renseignée." 3
				fi
				;;
			"-f") # Force
				# Permet d'eviter la demande de confirmation de création
				echo "force" # Debogage
				if [[ ${temoin_f} -ne 1 ]]; then
					#commandes_a_executer+=( "nouvMV ${nom_mv}")
					temoin_s=f
				else
					die "L'option ${1} a déjà été renseignée." 3
				fi
				;;
			'-h') # Aide
					usage "cree"
					exit 0
				;;
			*) # Autre
				usage "cree"
				;;
		esac
		shift
	done
	if [[ ${temoin_c} -ne 1 || ${temoin_m} -ne 1 ]]; then
		die "Les parametres -c et -m sont obligatoires." 2
	fi
	#verifMVExiste ${nom_mv} && 
	mkdir -p ${base_chemin_mv}/${nom_mv}
	execCmd
}

usage()
{
	case ${1} in
		cree)
			echo "usage_cree" # Debogage
			die "" 0
			;;
		demarre)
			echo "usage_demarre" # Debogage
			die "" 0
			;;
		arret)
			echo "usage_arret" # Debogage
			die "" 0
			;;
		active)
			echo "usage_active" # Debogage
			die "" 0
			;;
		desactive)
			echo "usage_desactive" # Debogage
			die "" 0
			;;
		*)
			echo "$(tput bold)Utilisation : $(basename ${0}) {-i|-s N} [OPTION]...$(tput sgr0)" 2>&1
			echo -e "Permet de sauvegarder les sous-volumes BTRFS d'un serveur monté selon la procédure décrite par ycharbi.fr. Permet également d'effectuer un roulement des archives.\n"
			echo -e "L'option -i ou -s sont requises pour l'exécution du script. Les deux peuvent êtres utilisées simultanément.\n"
			echo -e "\n$(tput bold)Options :$(tput sgr0)"
			echo -e "L'ordre des paramètres n'a pas d'importance.\n"
			echo -e "   -i\t\tExécute un instantané des sous-volumes BTRFS répertoriés dans le fichier texte passé en paramètre (via -f ou la variable \$fichierListeSousVolumes du présent script). Les entrées de cette liste doivent êtres conformes au retour de la commande \"btrfs subvolume list /\" pour être interprétés. Toute entrée invalide est ignorée"
			echo -e "   -s N\t\tSupprime l'instantané le plus ancien de chaque entrée de la liste. Un nombre désignant le seuil maximal d'instantané à conserver doit obligatoirement être passé en paramètre. L'instantané le plus ancien au delà de cette limite sera supprimé. Par sécurité, cette option ne supprime que le plus ancien. Si vous avez beaucoup d'instantanés au dessus de votre seuil, vous devrez répeter l'opération autant de fois que nécessaire"
			echo -e "   -f\t\tPermet de spécifier le fichier listant les sous-volumes à traiter pour gérer les instantanés. Ce fichier doit contenir des entrées correspondants parfaitement avec celles retournées par la commande \"btrfs subvolume list /\" pour être traités. Cette option est facultative. Si elle n'est pas renseignée, le script utilisera le fichier spécifié dans la variable \$fichierListeSousVolumes"
			echo -e "   -h\t\tAffiche cette aide. Si passée avec d'autres options, celles-ci seront ignorées pour n'afficher que l'aide"
			echo -e "\n$(tput bold)Exemples :$(tput sgr0)"
			echo -e "Réalisation d'un instantané avec un seuil de 13 archives (l'ancienne numéro 13 sera supprimée) :\n\t${0} -i -s 13 -f /root/cpt_instents/listeSousVolumes.txt\n"
			echo -e "Peut être raccourci en :\n\t${0} -is 13 -f /root/cpt_instents/listeSousVolumes.txt"
			echo -e "\nContenu du fichier listeSousVolumes.txt :"
			echo -e "\tsystèmes/bullseye/@\n\tsystèmes/bullseye/@boot\n\ttmp/toto\n\tvar/lib/machines/web\n\tvar/lib/machines/courriel\n\tvar/lib/machines/routeur\n\tvar/lib/machines/wireguard"
			echo -e "\nLe sous-volume tmp/toto n'existant pas, cette entrée sera ignorée sans entraver l'exécution du script. Il est également possible de commenter des lignes (en les rendant invalides)."
			die ""
			;;
	esac
}

case ${1} in
	cree)
		echo "Créer" # Debogage
		shift # On retire l'argument "cree"
		if [[ "$#" -eq 0 ]]; then
			confInteractive
			creeMV #Ajouter les parametre sous forme de tableau
		else
			if [[ "${1}" == "-h" ]]; then
				usage "cree"
			fi
			creeMV $*
		fi
		;;

	demarre)
		echo "Démarre" # Debogage
		shift # On retire l'argument "demarre"
		if [[ "$#" -eq 0 ]]; then
			usage "demarre"
		else
			if [[ "${1}" == "-h" ]]; then
				usage "demarre"
			fi
			nom_mv="${1}"
			echo "nom_mv=${nom_mv}" # Debogage
			shift
			echo 1 "$#" # Debogage
			while [[ $# -gt 0 ]]; do
				case "${1}" in
					'-d') #demon
						echo "demon" # Debogage
						if [[ ${temoin_d} -ne 1 ]]; then
							#commandes_a_executer+=( "nouvMV ${nom_mv}")
							temoin_d=1
						else
							die "L'option ${1} a déjà été renseignée." 3
						fi
						;;
					'-h') #aide
							usage "demarre"
							exit 0
						;;
					*) #autre
						usage "demarre"
						;;
				esac
				shift
			done
		fi
		;;

	arret)
		echo "Arrêt" # Debogage
		shift # On retire l'argument "arret"
		if [[ "${1}" == "-h" ]]; then
			usage "arret"
		fi
		nom_mv="${1}"
		echo "nom_mv=${nom_mv}"
		;;

	active)
		echo "Active" # Debogage
		shift # On retire l'argument "active"
		if [[ "${1}" == "-h" ]]; then
			usage "active"
		fi
		nom_mv="${1}"
		echo "nom_mv=${nom_mv}"
		;;

	desactive)
		echo "Désactive" # Debogage
		shift  # On retire l'argument "desactive"
		if [[ "${1}" == "-h" ]]; then
			usage "desactive"
		fi
		nom_mv="${1}"
		echo "nom_mv=${nom_mv}"
		;;
	
	liste)
		echo "Liste" # Debogage
		shift  # On retire l'argument "liste"
		;;

	*)
		usage
		;;
esac