package clip

import (
	"os"
	"os/exec"

	"golang.design/x/clipboard"
)

// Copy copies a given string to the clipboard, handling both Wayland and X11 environments.
// If WAYLAND_DISPLAY is set, it uses wl-copy to copy the string in a Wayland environment.
// Otherwise, it initializes the clipboard and writes the string using the clipboard package for X11.
// Parameters:
//
//	str: The string to be copied to the clipboard.
//
// Returns:
//
//	error: If an error occurs during copying (e.g., command execution or clipboard initialization fails).
func Copy(str string) error {

	if os.Getenv("WAYLAND_DISPLAY") != "" {
		cmd := exec.Command("wl-copy")

		p, err := cmd.StdinPipe()
		if err != nil {
			return err
		}

		if err := cmd.Start(); err == nil {
			p.Write([]byte(str))
			p.Close()
			return cmd.Wait()
		}
	}

	if err := clipboard.Init(); err != nil {
		return err
	}

	clipboard.Write(clipboard.FmtText, []byte(str))

	return nil
}
