//go:build !windows

package oscommands

import (
	"os"
	"os/exec"

	creackpty "github.com/creack/pty"
)

type unixPty struct {
	master *os.File
}

func (u *unixPty) Read(p []byte) (int, error)  { return u.master.Read(p) }
func (u *unixPty) Write(p []byte) (int, error) { return u.master.Write(p) }
func (u *unixPty) Close() error                { return u.master.Close() }

func (u *unixPty) Resize(cols, rows uint16) error {
	return creackpty.Setsize(u.master, &creackpty.Winsize{Cols: cols, Rows: rows})
}

func StartPty(cmd *exec.Cmd, cols, rows uint16) (StartedPty, error) {
	f, err := creackpty.StartWithSize(cmd, &creackpty.Winsize{Cols: cols, Rows: rows})
	if err != nil {
		return StartedPty{}, err
	}
	return StartedPty{
		Pty:     &unixPty{master: f},
		Process: cmd.Process,
		Wait:    cmd.Wait,
	}, nil
}

// TerminateLivePtys is a no-op on Unix: stopping a pty task signals the
// child (SIGTERM, plus SIGHUP to the foreground process group when the
// master closes), and the processes clean themselves up without lazygit
// having to wait for them.
func TerminateLivePtys() {}
