#!/bin/bash
# Ki : did pour créer le fichier createusers.txt
# kan : le 20 janvier 2026
#KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
KAZ_ROOT=/kaz
. $KAZ_ROOT/bin/.commonFunctions.sh
setKazVars

. $DOCKERS_ENV
. $KAZ_KEY_DIR/env-paheko
. $KAZ_KEY_DIR/env-kaz

URL_PAHEKO="$httpProto://${API_USER}:${API_PASSWORD}@kaz-paheko.$(echo $domain)"

PRG=$(basename $0)
RACINE=$(echo $PRG | awk '{print $1}')

TFILE_INT_PAHEKO_ACTION=$(mktemp /tmp/XXXXXXXX_INT_PAHEKO_ACTION.json)
TFILE_INT_PAHEKO_IDFILE=$(mktemp /tmp/XXXXXXXX_TFILE_INT_PAHEKO_IDFILE.json)
FILE_CREATEUSER="$KAZ_ROOT/tmp/createUser.txt"
FILE_NOTIFICATION="${KAZ_TEMP_DIR}/${PRG}.txt"
sep=' '
ERRMSG=""
regexMail="^(([A-Za-z0-9]+((\.|\-|\_|\+)?[A-Za-z0-9]?)*[A-Za-z0-9]+)|[A-Za-z0-9]+)@(([A-Za-z0-9]+)+((\.|\-|\_)?([A-Za-z0-9]+)+)*)+\.([A-Za-z]{2,})+$"
############################################ Fonctions #######################################################

TEXTE="
#   -- fichier de création des comptes KAZ
#   --
#   -- 1 ligne par compte
#   -- champs séparés par ;. les espaces en début et en fin sont enlevés
#   -- laisser vide si pas de donnée
#   -- pas d'espace dans les variables
#   --
#   -- ORGA: nom de l'organisation (max 15 car), vide sinon
#   -- ADMIN_ORGA: O/N indique si le user est admin de l'orga (va le créer comme admin du NC de l'orga et admin de l'équipe agora)
#   -- NC_ORGA: O/N indique si l'orga a demandé un NC
#   -- PAHEKO_ORGA: O/N indique si l'orga a demandé un paheko
#   -- WP_ORGA: O/N indique si l'orga a demandé un wp
#   -- AGORA_ORGA: O/N indique si l'orga a demandé un mattermost
#   -- WIKI_ORGA: O/N indique si l'orga a demandé un wiki
#   -- NC_BASE: O/N indique si le user doit être inscrit dans le NC de base
#   -- GROUPE_NC_BASE: soit null soit le groupe dans le NC de base
#   -- EQUIPE_AGORA: soit null soit equipe agora  (max 15 car)
#   -- QUOTA=(1/10/20/...) en GB
#   --
#   NOM ; PRENOM ; EMAIL_SOUHAITE ; EMAIL_SECOURS ; ORGA ; ADMIN_ORGA ; NC_ORGA ; PAHEKO_ORGA ; WP_ORGA ; AGORA_ORGA ; WIKI_ORGA ; NC_BASE ; GROUPE_NC_BASE ; EQUIPE_AGORA ; QUOTA
#
#  exemple pour un compte découverte:
#  dupont ; jean-louis; jean-louis.dupont@kaz.bzh ; gregomondo@kaz.bzh; ; N; N; N; N; N; N; O; ; ;1
#
#  exemple pour un compte asso de l'orga gogol avec le service dédié NC uniquement + une équipe dans l'agora
#  dupont ; jean-louis; jean-louis.dupont@kaz.bzh  ; gregomondo@kaz.bzh; gogol ; O; O; N; N; N; N;N;;gogol_team; 10
"
PostMattermost() {
	PostM=$1
	CHANNEL="kaz:Creation-Comptes"
	. $KAZ_KEY_DIR/env-mattermostAdmin
	docker exec -t ${mattermostServName} bin/mmctl --suppress-warnings auth login $httpProto://$URL_AGORA --name local-server --username $mattermost_user --password $mattermost_pass >/dev/null 2>&1
	docker exec -t mattermostServ bin/mmctl post create ${CHANNEL} --message ${PostM} >/dev/null 2>&1
}

ExpMail() {
        MAIL_DEST=$1
        MAIL_SUJET=$2
        MAIL_TEXTE=$3
        echo "$MAIL_TEXTE" | mail -s ${MAIL_SUJET} ${MAIL_DEST}
}

Int_paheko_Action() {
		# $1 est une action;
		ACTION=$1
		OPTION=$2
		# on envoie la requête sur le serveur paheko avec la clause à créer
		curl -s ${URL_PAHEKO}/api/sql -d "SELECT * from users where action_auto='${ACTION}';" >>${TFILE_INT_PAHEKO_ACTION}
		[ ! -z ${TFILE_INT_PAHEKO_ACTION} ] || { echo "probleme de fichier ${TFILE_INT_PAHEKO_ACTION}" ; exit 1;}
		REP_ID=$(jq -c '.results[].id ' ${TFILE_INT_PAHEKO_ACTION} 2>/dev/null)
		if [ ! -z "${REP_ID}" ]
		then
			[ "$OPTION" = "silence" ] || echo -e "${RED}Nombre de compte ${ACTION} ${NC}= ${GREEN} $(echo ${REP_ID} | wc -w) ${NC}"
		  	if [ -f "$FILE_CREATEUSER" ]
			then
				mv $FILE_CREATEUSER $FILE_CREATEUSER.$(date +%d-%m-%Y-%H:%M:%S)
			fi
			echo "# -------- Fichier généré le $(date +%d-%m-%Y-%H:%M:%S) ----------">${FILE_CREATEUSER}
			echo "${TEXTE}" >>${FILE_CREATEUSER}
			for VAL_ID in ${REP_ID}
			do
				jq -c --argjson val "${VAL_ID}" '.results[] | select (.id == $val)' ${TFILE_INT_PAHEKO_ACTION} > ${TFILE_INT_PAHEKO_IDFILE}
				for VAL_GAR in id_category action_auto nom email email_secours quota_disque admin_orga nom_orga responsable_organisation responsable_email agora cloud wordpress garradin docuwiki id_service
				do
					eval $VAL_GAR=$(jq .$VAL_GAR ${TFILE_INT_PAHEKO_IDFILE})
				done
				################################
				# test du mail valide en $domain : si oui on remplie la variable ERRMSG et on créé le fichier de notification"
				echo ${email} | grep -i "${domain}" >/dev/null || { ERRMSG="- Le mail ${email} n'est pas en ${domain}";touch ${FILE_NOTIFICATION} 2>/dev/null;}
				# test de la validité du mail
				[[ ${email} =~ ${regexMail} ]] || ERRMSG="${ERRMSG} - Le mail ${email} n'est pas valide"
				################################
				#on compte le nom de champs dans la zone nom pour gérer les noms et prénoms composés
				# si il y a 3 champs, on associe les 2 premieres valeurs avec un - et on laisse le 3ème identique
				# si il y a 4 champs on associe les 1 et le 2 avec un tiret et le 3 et 4 avec un tiret
				# on met les champs nom_ok et prenom_ok à blanc
				nom_ok=""
				prenom_ok=""
				# on regarde si le nom de l' orga est renseigné ou si le nom de l' orga est null et l' activité de membre est 7 (membre rattaché)
				# si c' est le cas alors le nom est le nom de l' orga et le prénom est forcé à la valeur Organisation
				if [[ "$nom_orga" = null ]] || [[ "$nom_orga" != null && "$id_service" = "7" ]]
				then
					[ "$OPTION" = "silence" ] || echo -e "${NC}Abonné ${GREEN}${nom}${NC}"
					COMPTE_NOM=$(echo ${nom} | awk -F' ' '{for (i=1; i != NF; i++); print i;}')
					case "${COMPTE_NOM}" in
					0|1)
					ERRMSG="${ERRMSG} - ${nom} Il faut corriger le champ nom (il manque un nom ou prénom)"
					;;
					2)
					nom_ok=$(echo $nom | awk -F' ' '{print $1}')
					prenom_ok=$(echo $nom | awk -F' ' '{print $2}')
					;;
					*)
					nom_ok=
					prenom_ok=
					for i in ${nom}; do grep -q '^[A-Z]*$' <<<"${i}" && nom_ok="${nom_ok}${sep}${i}" || prenom_ok="${prenom_ok}${sep}${i}"; done
					nom_ok="${nom_ok#${sep}}"
					prenom_ok="${prenom_ok#${sep}}"
					if [ -z "${nom_ok}" ] || [ -z "${prenom_ok}" ]
					then
						ERRMSG="${ERRMSG} - ${nom} Il faut corriger le champ nom qui contient plus de 2 infos"
					fi
					esac
					# comme l' orga est à null nom orga est a vide, pas d' admin orga, on met dans l' agora générale
					# pas d' équipe agora et de groupe nextcloud spécifique
					nom_orga=" "
					admin_orga="N"
					nc_base="O"
					equipe_agora=" "
					groupe_nc_base=" "
				else
					# L' orga est renseignée dans paheko donc les nom et prenoms sont forcé a nom_orga et Organisation
					# un équipe agora portera le nom de l' orga, le compte ne sera pas créé dans le nextcloud général
					# et le compte est admin de son orga
					nom_orga=$(echo ${nom_orga} | tr [:upper:] [:lower:])
					[ "$OPTION" = "silence" ] || echo -e "${NC}Orga : ${GREEN}${nom_orga}${NC}"
					nom_ok=$nom_orga
					# test des caractères autorisés dans le nom d' orga: lettres, chiffres et/ou le tiret
					if ! [[ "${nom_ok}" =~ ^[[:alnum:]-]+$ ]]
						then
						ERRMSG="${ERRMSG} - ${nom_orga} L' orga doit être avec des lettres et/ou des chiffres. Le séparateur doit être le tiret"
					fi
					prenom_ok=organisation
					equipe_agora=${nom_orga}
					groupe_nc_base=" "
					nc_base="N"
					admin_orga="O"
				fi
				#On met le mail et le mail de secours en minuscules
				email=$(echo $email | tr [:upper:] [:lower:])
				email_secours=$(echo $email_secours | tr [:upper:] [:lower:])
				# Pour le reste on renomme les null en N ( non ) et les valeurs 1 en O ( Oui)
				cloud=$(echo $cloud | sed -e 's/0/N/g' | sed -e 's/1/O/g')
				paheko=$(echo $garradin | sed -e 's/0/N/g' | sed -e 's/1/O/g')
				wordpress=$(echo $wordpress | sed -e 's/0/N/g' | sed -e 's/1/O/g')
				agora=$(echo $agora | sed -e 's/0/N/g' | sed -e 's/1/O/g')
				docuwiki=$(echo $docuwiki | sed -e 's/0/N/g' | sed -e 's/1/O/g')
				# et enfin on écrit dans le fichier si pas d'erreurs
				if ! [[ -z ${ERRMSG} ]]
				then
					OLDIFS=${IFS}
					IFS=''
					# si l'envoi de mail est ok et qu'on a pas déjà écrit alors on envoi un mail
					if [[ "${IP_MAIL}" = "true" && "$(cat ${FILE_NOTIFICATION})" -ne "1" ]]
					then
						ExpMail ${IP_MAILDEST} "Erreur dans la fiche paheko" "${ERRMSG}"
						PostMattermost "Erreur dans la fiche paheko ${email}"
						# on ecrit 1 dans le fichier pour ne pas envoyer pleins de mails et notif agora
						echo 1 >${FILE_NOTIFICATION}
					fi
					IFS=${OLDIFS}
					[ "$OPTION" = "silence" ] || echo ${ERRMSG}
					exit
				else
					# on créé le fichier et on met 0 le fichier de notification
					echo "$nom_ok;$prenom_ok;$email;$email_secours;$nom_orga;$admin_orga;$cloud;$paheko;$wordpress;$agora;$docuwiki;$nc_base;$groupe_nc_base;$equipe_agora;$quota_disque">>${FILE_CREATEUSER}
					#on met 0 dans le fichier de notifiction
					echo 0 >${FILE_NOTIFICATION}
				fi
			done
		else
			[ "$OPTION" = "silence" ] || echo "Rien à créer"
			exit 2
		fi
}
# Main
# on créé le fichier de notif au cas ou il serait éffacé
touch ${FILE_NOTIFICATION} >/dev/null 2>&1
Int_paheko_Action "A créer" "silence"
exit 0
