package main

import (
	"flag"
	"fmt"
	"os"
	"strings"

	"github.com/chrislusf/seaweedfs/weed/command"
	"github.com/chrislusf/seaweedfs/weed/glog"
	"github.com/jacobsa/daemonize"
	"github.com/kardianos/osext"
)

var (
	fuseCommand  = flag.NewFlagSet("weedfuse", flag.ContinueOnError)
	options      = fuseCommand.String("o", "", "comma separated options rw,uid=xxx,gid=xxx")
	isForeground = fuseCommand.Bool("foreground", false, "starts as a daemon")
)

func main() {

	err := fuseCommand.Parse(os.Args[1:])
	if err != nil {
		glog.Fatal(err)
	}
	fmt.Printf("options: %v\n", *options)

	// seems this value is always empty, need to parse it differently
	optionsString := *options
	prev := ""
	for i, arg := range os.Args {
		fmt.Printf("args[%d]: %v\n", i, arg)
		if prev == "-o" {
			optionsString = arg
		}
		prev = arg
	}

	device := fuseCommand.Arg(0)
	mountPoint := fuseCommand.Arg(1)

	fmt.Printf("source: %v\n", device)
	fmt.Printf("target: %v\n", mountPoint)

	nouser := true
	for _, option := range strings.Split(optionsString, ",") {
		fmt.Printf("option: %v\n", option)
		switch option {
		case "user":
			nouser = false
		}
	}

	maybeSetupPath()

	if !*isForeground {
		startAsDaemon()
		return
	}

	parts := strings.SplitN(device, "/", 2)
	filer, filerPath := parts[0], parts[1]

	command.RunMount(
		filer, "/"+filerPath, mountPoint, "", "000", "",
		4, !nouser, 0, 1000000)

}

func maybeSetupPath() {
	// sudo mount -av may not include PATH in some linux, e.g., Ubuntu
	hasPathEnv := false
	for _, e := range os.Environ() {
		if strings.HasPrefix(e, "PATH=") {
			hasPathEnv = true
		}
		fmt.Println(e)
	}
	if !hasPathEnv {
		os.Setenv("PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")
	}
}

func startAsDaemon() {

	// adapted from gcsfuse

	// Find the executable.
	var path string
	path, err := osext.Executable()
	if err != nil {
		glog.Fatalf("osext.Executable: %v", err)
	}

	// Set up arguments. Be sure to use foreground mode.
	args := append([]string{"-foreground"}, os.Args[1:]...)

	// Pass along PATH so that the daemon can find fusermount on Linux.
	env := []string{
		fmt.Sprintf("PATH=%s", os.Getenv("PATH")),
	}

	err = daemonize.Run(path, args, env, os.Stdout)
	if err != nil {
		glog.Fatalf("daemonize.Run: %v", err)
	}

}
