//go:build windows

package platform

import (
	"context"

	"golang.design/x/clipboard"
)

// windowsClipboard is the Windows Source backed by golang.design/x/clipboard
// (pure syscall, no cgo): it watches the clipboard for local copies via
// GetClipboardSequenceNumber polling and writes plain text back.
type windowsClipboard struct {
	ready bool
}

// NewClipboardSource returns the platform clipboard Source (Windows). If the
// clipboard can't be initialised it degrades to an inert source so the rest of
// the sync wiring still runs.
func NewClipboardSource() Source {
	return &windowsClipboard{ready: clipboard.Init() == nil}
}

func (c *windowsClipboard) Watch(ctx context.Context) <-chan ClipboardEvent {
	out := make(chan ClipboardEvent)
	go func() {
		defer close(out)
		if !c.ready {
			<-ctx.Done()
			return
		}
		changes := clipboard.Watch(ctx, clipboard.FmtText)
		for {
			select {
			case <-ctx.Done():
				return
			case data, ok := <-changes:
				if !ok {
					return
				}
				if data.Format != clipboard.FmtText || len(data.Bytes) == 0 {
					continue
				}
				// golang.design/x/clipboard surfaces only the text — the Windows
				// privacy formats (ExcludeClipboardContentFromMonitorProcessing /
				// CanUploadToCloudClipboard) aren't exposed, so Sensitive stays
				// false and the server's 5-min TTL is the backstop. A raw
				// EnumClipboardFormats check is a possible follow-up.
				select {
				case out <- ClipboardEvent{Text: string(data.Bytes)}:
				case <-ctx.Done():
					return
				}
			}
		}
	}()
	return out
}

func (c *windowsClipboard) Write(text string) error {
	if !c.ready {
		return nil
	}
	clipboard.Write(clipboard.FmtText, []byte(text))
	return nil
}
