#!/bin/bash

email=exemple@exemple.fr
userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"

# Chemin vers la base de données SQLite
database="/root/domains.db"

delay_expiration=10

# Commande SQL pour récupérer le champ "domain" de la table "domain"
current_timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "Il est $current_timestamp"
query="SELECT id, url FROM url_check WHERE next_check<='$current_timestamp' OR next_check IS NULL;"

# Exécution de la commande SQLite et récupération du résultat dans la variable "result"
results=$(sqlite3 "$database" "$query")





update_next_check() {
	local id="$1"

	# Récupérer la valeur d'intervalle à partir de la base de données SQLite
	interval=$(sqlite3 "$database" "SELECT interval FROM url_check WHERE id = $id;")

	# Obtenir le timestamp (nombre de secondes depuis l'époque UNIX) pour la date actuelle
	current_timestamp=$(date +"%s")

	# Calculer le nouveau timestamp en ajoutant l'intervalle (en secondes) à la date actuelle
	new_timestamp=$((current_timestamp + interval))

	# Convertir le nouveau timestamp en format de date "YYYY-MM-DD HH:MM:SS"
	next_check=$(date -d "@$new_timestamp" +"%Y-%m-%d %H:%M:%S")

	# Mettre à jour la table url_check avec la nouvelle valeur de next_check pour l'ID spécifique
	echo " ✨ Mise à jour du next check à $next_check"
	sqlite3 "$database" "UPDATE url_check SET next_check = '$next_check' WHERE id = $id;"

}




check_status_200() {
	local id="$1"
	query="SELECT url FROM url_check WHERE id=$id;"

	# Exécution de la commande SQLite et récupération du résultat dans la variable "result"
	results=$(sqlite3 "$database" "$query")

	# Vérifier si le résultat n'est pas vide
	if [ -n "$results" ]; then
		# Parcourir les résultats ligne par ligne et afficher chaque enregistrement
		while IFS='|' read -r url; do

			# Effectuer la requête HTTP GET avec curl et stocker le résultat dans une variable
			response=$(timeout 1 curl -A "$userAgent" -s -o /dev/null -w "%{http_code}" "$url")
			echo " 🎯 Reponse http : $response"

			# Vérifier si le code de statut existe déjà dans la table log_check_url
			query="SELECT COUNT(*) FROM log_check_url WHERE id_url = $id AND value = $response AND label='http_code'"
			query+=" AND datetime = (SELECT MAX(datetime) FROM log_check_url WHERE id_url = $id AND label='http_code');"
			exists=$(sqlite3 "$database" "$query")
			if [ -n "$exists" ] && [ "$exists" -eq 0 ]; then
				echo " ✨ C'est un nouveau status, je l'inscris dans les logs"
				echo " Status $response pour l'url $url" | mail -s " ✨ Nouveau status pour le site $url" "$email"
				# Insérer le nouveau statut avec le timestamp actuel dans la table log_check_url
				current_timestamp=$(date +"%Y-%m-%d %H:%M:%S")
				sqlite3 "$database" "INSERT INTO log_check_url (id_url, label, value, datetime) VALUES ($id, 'http_code', $response, '$current_timestamp');"
			fi

		done <<< "$results"
	else
		echo " 🚫 Aucun résultat trouvé."
	fi
}



check_content(){
	local id="$1"
	query="SELECT url FROM url_check WHERE id=$id;"

	# Exécution de la commande SQLite et récupération du résultat dans la variable "results"
	results=$(sqlite3 "$database" "$query")

	# Vérifier si le résultat n'est pas vide
	if [ -n "$results" ]; then
		# Parcourir les résultats ligne par ligne et afficher chaque enregistrement
		while IFS='|' read -r url; do
			# Traitement avec 'string_check'
			query="SELECT string_check FROM url_check WHERE id=$id;"
			# Exécution de la commande SQLite et récupération du résultat dans la variable "string_check_result"
			string_check_result=$(sqlite3 "$database" "$query")

			# Vérifier si string_check_result n'est pas vide
			if [ -n "$string_check_result" ]; then
			# Récupérer le contenu HTML
			response=$(curl -A "$userAgent" -s -L "$url" | bash -c "$string_check_result")

			# Si la variable n'est pas vide, attribuer la valeur à la variable "response"
			response_sha1=$(echo -n ${response} | sha1sum | awk '{print $1}')

			# Vérifier si le code de statut existe déjà dans la table log_check_url
			echo "Vérification du contenu..."
			query="SELECT COUNT(*) FROM log_check_url WHERE id_url = $id AND value = '$response_sha1' AND label='html_content_sha1'"
			query+=" AND datetime = (SELECT MAX(datetime) FROM log_check_url WHERE id_url = $id AND label='html_content_sha1');"
			exists=$(sqlite3 "$database" "$query")
				if [ "$exists" -eq 0 ]; then
					echo " ✨ C'est du nouveau contenu, je l'inscris dans les logs"
					echo -e " Nouveau contenu pour l'url $url\n\n\n ${response:0:1024}" | mail -s " ✨ Nouveau contenu pour le site ${url:0:64}" "$email"
					# Insérer le nouveau statut avec le timestamp actuel dans la table log_check_url
					current_timestamp=$(date +"%Y-%m-%d %H:%M:%S")
					response64=$(echo -n ${response} | base64)
					sqlite3 "$database" "INSERT INTO log_check_url (id_url, label, value, datetime) VALUES ($id, 'html_content_sha1', '$response_sha1', '$current_timestamp');"
					sqlite3 "$database" "INSERT INTO log_check_url (id_url, label, value, datetime) VALUES ($id, 'html_content', '${response64}', '$current_timestamp');"
					echo "  ...le nouveau contenu est dans la base."
				else
					echo "  ...rien n'a changé."
				fi
			fi
		done <<< "$results"
	else
		echo " 🚫 Aucun résultat trouvé."
	fi


}


# Fonction pour tester le domaine avec le port spécifié
check_domain_url() {
	local id="$1"

	# Vérifier que 'next_check' soit inférieur ou égal à l'heure actuel sinon arrêter
	# ou si next_check est null alors bifurquer sur initCheck

	# Vérifier le statut 200.
	check_status_200 "$id"

}


# Vérifier si le résultat n'est pas vide
if [ -n "$results" ]; then
	# Parcourir les résultats ligne par ligne et afficher chaque enregistrement
	while IFS='|' read -r id url; do
		echo -e "\n\n -- $id - URL testée : $url"
		check_domain_url "$id"
		update_next_check "$id"
		check_content "$id"
	done <<< "$results"
else
	echo "Aucun résultat trouvé."
fi

