package main

import (
	"fmt"
	"os"
	"os/exec"
	"github.com/moby/sys/mountinfo"
	"github.com/kevinburke/ssh_config"
	"flag"
)

var eFlag = flag.Bool("e", false, "open mountpoint in your editor")

func main() {
	flag.Parse()
	args := flag.Args()

	if len(args) == 0 {
		fmt.Println("No hostname specified.")
		os.Exit(80)
	} else {
		hostname := ssh_config.Get(args[0], "HostName")
		user := ssh_config.Get(args[0], "User")
		port := ssh_config.Get(args[0], "Port")
		ifile := ssh_config.Get(args[0], "IdentityFile")

		if len(hostname) == 0 || len(user) == 0 || len(ifile) == 0 {
			fmt.Println("Hostname not found in ~/.ssh_config")
			os.Exit(3)
		} else {
			mount := verify_mount_dir(hostname)

			fmt.Println("Hostname:	",hostname)
			fmt.Println("User:		", user)
			fmt.Println("Port:		", port)
			fmt.Println("Ifile:		", ifile)
			fmt.Println("Mount:		", mount)
			fmt.Println("---")
			
			chkmount, chkmount_err := mountinfo.Mounted(mount)
			if chkmount_err != nil {
				fmt.Println("mountinfo.Mounted() failed with %s\n", chkmount_err)
			}
			if chkmount == false {
				mount_sshfs(hostname, user, ifile, port, mount)
			} else {
				fmt.Println("!!! Already mounted")
			}
			run_editor(mount)
		}
	}
}

func run_editor(mount string) {
	if(*eFlag == true) {
		cmd := exec.Command("subl", mount)
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr
		err := cmd.Run()
		if err != nil {
			fmt.Println("run_editor() failed with\n",err)
		}
	}
}

func verify_mount_dir(hostname string)(mount string) {
	homedir, homedirerr := os.UserHomeDir()
	if homedirerr != nil {
		fmt.Println( homedirerr )
	}
	mount = homedir+"/Servers/"+hostname
	os.MkdirAll(mount, os.ModePerm)

	return
}

func mount_sshfs(hostname string, user string, ifile string, port string, mount string) {
	cmd := exec.Command("sshfs", "-p", port, "-o", "IdentityFile="+ifile+",idmap=user,dir_cache=no", user+"@"+hostname+":/", mount)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	err := cmd.Run()
	if err != nil {
		fmt.Println("mount_sshfs() failed with\n",err)
	}
}
