package stty

import (
	"os"
    "golang.org/x/sys/unix"
	"golang.org/x/term"
	"os/exec"
)

type stty interface{
    SetBaudRate(portPath string, baudrate int) error
    CheckBaudRate(portPath string) (baudrate int, err error)
    TestBaudRate(portPath string, baudrate int) error
}

var cmd stty

func CMD() stty {
    return cmd
}

func init() {
	checkSttyCMD := exec.Command("stty", "--version")
	sttyOutput, err := checkSttyCMD.Output()
	if err != nil || len(sttyOutput) == 0 {
        cmd = &dummy{errStack(ERR_STTY_MISSING(),err)}
	}
	cmd = &real{}
}

func ValidateTtyFile(filepath string) error {
    file, err := os.Open(filepath)
	if err != nil {
        return errStack(ERR_CANNOT_OPEN_FILE(), err)
	}
	defer file.Close()

	err = unix.Access(filepath, unix.W_OK)
	if err != nil {
		return errStack(ERR_NO_WRITE_ACCESS(), err)
	}

	if term.IsTerminal(int(file.Fd())) {
		return nil
	}
	return ERR_NOT_TTY()
}