package main

import (
	"fmt"
	"time"

	"veyron/lib/testutil/modules"

	"veyron2/vlog"
)

type tag int

const (
	helpTag tag = iota
	getTag
	setTag
	printTag
	sleepTag
)

type builtin struct{ tag }

func helpF() modules.T {
	return &builtin{helpTag}
}

func sleepF() modules.T {
	return &builtin{sleepTag}
}

func getF() modules.T {
	return &builtin{getTag}
}

func setF() modules.T {
	return &builtin{setTag}
}

func printF() modules.T {
	return &builtin{printTag}
}

func (b *builtin) Help() string {
	switch b.tag {
	case helpTag:
		return "[command]"
	case sleepTag:
		return `[duration]
	sleep for a time (in go time.Duration format): defaults to 1s`
	case getTag:
		return "[<global variable name>]*"
	case setTag:
		return "[<var>=<val>]+"
	case printTag:
		return "[$<var>]*"
	default:
		return fmt.Sprintf("unrecognised tag for builtin: %d", b.tag)
	}
}

func (*builtin) Daemon() bool { return false }

func (b *builtin) Run(args []string) (modules.Variables, []string, modules.Handle, error) {
	switch b.tag {
	case helpTag:
		return helpCmd(args)
	case sleepTag:
		return sleep(args)
	case getTag:
		return get(args)
	case setTag:
		return set(args)
	case printTag:
		return print(args)
	default:
		return nil, nil, nil, fmt.Errorf("unrecognised tag for builtin: %d",
			b.tag)
	}
}

func helpCmd([]string) (modules.Variables, []string, modules.Handle, error) {
	for k, v := range commands {
		if k == "help" {
			continue
		}
		h := v().Help()
		if len(h) > 0 {
			fmt.Printf("%s %s\n\n", k, h)
		} else {
			fmt.Println(k)
		}
	}
	return nil, nil, nil, nil
}

func sleep(args []string) (modules.Variables, []string, modules.Handle, error) {
	if len(args) == 0 {
		vlog.Infof("Sleeping for %s", time.Second)
		time.Sleep(time.Second)
		return nil, nil, nil, nil
	}
	if d, err := time.ParseDuration(args[0]); err != nil {
		return nil, nil, nil, err
	} else {
		vlog.Infof("Sleeping for %s", d)
		time.Sleep(d)
	}
	return nil, nil, nil, nil
}

func get(args []string) (modules.Variables, []string, modules.Handle, error) {
	var r []string
	if len(args) == 0 {
		for k, v := range globals {
			r = append(r, fmt.Sprintf("\t%q=%q\n", k, v))
		}
	} else {
		for _, a := range args {
			if v, present := globals[a]; present {
				r = append(r, fmt.Sprintf("\t%q=%q\n", a, v))
			} else {
				return nil, nil, nil, fmt.Errorf("unknown variable %q", a)
			}
		}
	}
	return nil, r, nil, nil
}

func set(args []string) (modules.Variables, []string, modules.Handle, error) {
	for _, a := range args {
		globals.UpdateFromString(a)
	}
	return nil, nil, nil, nil
}

func print(args []string) (modules.Variables, []string, modules.Handle, error) {
	var r []string
	for _, a := range args {
		r = append(r, a)
	}
	return nil, r, nil, nil
}
