package browser

// TabInfo describes an open browser tab.
type TabInfo struct {
	TargetID string `json:"targetId"`
	URL      string `json:"url"`
	Title    string `json:"title"`
}

// RoleRef maps a snapshot ref (e.g. "e5") to an accessible element.
type RoleRef struct {
	Role          string `json:"role"`
	Name          string `json:"name,omitempty"`
	Nth           int    `json:"nth,omitempty"`
	BackendNodeID int    `json:"backendNodeId,omitempty"`
}

// SnapshotResult is the output of a page snapshot.
type SnapshotResult struct {
	Snapshot  string             `json:"snapshot"`
	Refs      map[string]RoleRef `json:"refs"`
	URL       string             `json:"url"`
	Title     string             `json:"title"`
	TargetID  string             `json:"targetId"`
	Stats     SnapshotStats      `json:"stats"`
	Truncated bool               `json:"truncated,omitempty"`
}

// SnapshotStats contains metrics about a snapshot.
type SnapshotStats struct {
	Lines       int `json:"lines"`
	Chars       int `json:"chars"`
	Refs        int `json:"refs"`
	Interactive int `json:"interactive"`
}

// SnapshotOptions controls snapshot generation.
type SnapshotOptions struct {
	Interactive bool // only include interactive elements
	MaxDepth    int  // 0 = unlimited
	Compact     bool // remove unnamed structural elements
	MaxChars    int  // truncate output (default 8000)
	Limit       int  // max AX nodes to process (default 500)
}

// DefaultSnapshotOptions returns sensible defaults.
func DefaultSnapshotOptions() SnapshotOptions {
	return SnapshotOptions{
		MaxChars: 8000,
		Limit:    500,
	}
}

// ActResult is the output of a browser action.
type ActResult struct {
	OK       bool   `json:"ok"`
	TargetID string `json:"targetId"`
	URL      string `json:"url,omitempty"`
	Result   string `json:"result,omitempty"`
}

// ClickOpts controls click behavior.
type ClickOpts struct {
	DoubleClick bool
	Button      string // "left", "right", "middle"
	TimeoutMs   int
}

// TypeOpts controls type behavior.
type TypeOpts struct {
	Submit    bool
	Slowly    bool
	TimeoutMs int
}

// WaitOpts controls wait behavior.
type WaitOpts struct {
	TimeMs   int
	Text     string
	TextGone string
	URL      string
	Fn       string
}

// ConsoleMessage is a captured browser console message.
type ConsoleMessage struct {
	Level   string `json:"level"` // "log", "warn", "error", "info"
	Text    string `json:"text"`
	URL     string `json:"url,omitempty"`
	LineNo  int    `json:"lineNo,omitempty"`
	ColNo   int    `json:"colNo,omitempty"`
}

// StatusInfo describes the current browser state.
type StatusInfo struct {
	Running bool   `json:"running"`
	Tabs    int    `json:"tabs"`
	URL     string `json:"url,omitempty"` // current tab URL
}
