package main

import (
	"bytes"
	"fmt"
	"log"
	"os"
	"time"

	"canguidev.fr/pvnet/function"
	simplyssh "canguidev.fr/pvnet/simply-ssh"
	"github.com/TwiN/go-choice"
	"github.com/joho/godotenv"
	"github.com/pkg/sftp"
)

func main(){
	//var path string="/Users/cangui/.ssh/julien_pvnet"
	///Users/cangui/Documents/Dev peso/Golang dev/test.xlsx
	err := godotenv.Load()
	if err != nil {
	  log.Fatal("Error loading .env file")
	}

    var pathSsh string = os.Getenv("PATH_SSH")
	var pathConfigSsh = os.Getenv("PATH_SSH_CONF")
	var pathExcel string= os.Getenv("PATH_FOLDER")
	var mysqlUser string
	var mysqlPswd string
	var pathSaveSql string

	// Chargement de la liste des hosts du fichier config ssh
	d:=simplyssh.GetHost(pathConfigSsh)
	var s []string
		for _, host := range d {
			fmt.Println(host)
			s=append(s,string(host.Id)+" "+host.Host)
		}
	// selectionne du host
	choice, index, err := gochoice.Pick(
		"What do you want to do?\nPick:",
		s,
	)
	selectHost:=choice
	if err != nil {
		fmt.Println("You didn't select anything!",err)
	} else {
		for _, host := range d {
			// for sur les hosts et break sur le host selectionner
			if(host.Id == uint(index)){
				fmt.Println("debut de connection")
				// connection en ssh avec la clée et les informations du fichier config
				client:=simplyssh.Connect(pathSsh,host.HostName,host.Port,host.User)	
				command := "mkdir backup"
				defer client.Close()

				// Ouverture d une session pour excecuté la commande
				session, err := client.NewSession()
				if err != nil {
					log.Fatal("Failed to create session: ", err)
				}
				defer session.Close()
				// initialisation du buffer pour recupere les infos reçu de l' hôte
				var b bytes.Buffer
				session.Stdout = &b
				//exceution de la commande
				if err := session.Run(command); err != nil {
					fmt.Println("Dossier existe dejà")
						// Fermez donc cette session
						session.Close()
					
						// Créez une nouvelle session pour exécuter le backup
						sessionBackup, err := client.NewSession()
						if err != nil {
							log.Fatal("Failed to create session for backup: ", err)
						}
						defer sessionBackup.Close()
					
						choice, index, err := gochoice.Pick(
							"What do you want to do?\nPick:",
							[]string{
								"Backup sql and download",
								"Backup site",
								"Check serveur apache",
							},
						)
						if err != nil {
							fmt.Println("You didn't select anything!")
							return
						}
					
						fmt.Println("Enter path download key: ") 
						fmt.Printf("You have selected: '%s', which is the index %d\n", choice, index)
					
						if (index == 0) {
						
							//var pathSaveSite string
							orderedKeys := []string{"host","mysql_login", "mysql_pasw", "path_save_sql", "path_save_site"}

							excel:=function.ReadExcel(pathExcel)
								key:="host"
								// Parcourir les résultats d'Excel
								for _, value := range excel {
									// Lire les clés dans l'ordre spécifié
									for _, k := range orderedKeys {
										if v, exists := value[k]; exists && k == key {
											fmt.Println("Key:", k, "Value:", v)
										if(k==selectHost){
											switch k {
											case "path_save_sql":
												pathSaveSql = v
											case "path_save_site":
												// pathSaveSite = v
											case "mysql_login":
												mysqlUser = v
											case "mysql_pasw":
												mysqlPswd = v
											}
										}
											// Switch pour affecter les variables
											
										}
									}
								}
							
							fmt.Println("MySQL User:", mysqlUser)
							fmt.Println("MySQL Password:", mysqlPswd)
							fmt.Println("Path Save SQL:", pathSaveSql)
							log.Fatal("stop julien")

							currentTime := time.Now()
							formattedTime := currentTime.Format("20060102_150405")
					
							filename := "backup/test_" + formattedTime + ".sql"
							commandBackup := "mysqldump -u "+mysqlUser+" -p'"+mysqlPswd+"' test > " + filename
					
							// Maintenant on utilise la sessionBackup pour exécuter la commande du backup
							if err := sessionBackup.Run(commandBackup); err != nil {
								log.Fatal("Failed to run commandBackup: " + err.Error())
							}
							fmt.Println("backup ok")
					
							sftpClient, err := sftp.NewClient(client)
							if err != nil {
								log.Fatal("Erreur connection: ", err)
							}
							defer sftpClient.Close()
					
							var pathDownload string 
							fmt.Scanln(&pathDownload) 
							fmt.Println(filename)
							currentTime2 := time.Now()
							formattedTime2:= currentTime2.Format("20060102_150405")
					
							filename2 := "test_" + formattedTime2 + ".sql"
							err = simplyssh.DownloadFile(sftpClient, filename, pathSaveSql+filename2)
							if err != nil {
								log.Fatal("Erreur lors du téléchargement: ", err)
							}
							fmt.Println("Téléchargement terminé")
						}
					
					//log.Fatal("Failed to run: " + err.Error())
				}
				fmt.Println(b.String())

			}
		}
		fmt.Printf("You have selected: '%s', which is the index %d\n", choice, index)
	}
}
