package pncdsl

// RegisterDefaultUI installs the SCUMM-style HUD widgets into g.UIManager
// in the conventional Z-order (HotspotDebug at the back, Cursor on top).
// Domains that want a different layout call this and then either tweak
// the registered widgets in place or replace them entirely.
//
// Layout assumes the default 320×200 internal resolution.
func RegisterDefaultUI(g *Game) {
	g.UIManager.Register(&HotspotDebug{Name: "hotspot_debug"})
	g.UIManager.Register(&VerbBar{
		Name:   "verbs",
		Origin: Point{X: 4, Y: 152},
		Cols:   2,
		Button: Size{W: 60, H: 14},
	})
	g.UIManager.Register(&InventoryBar{
		Name:     "inventory",
		Origin:   Point{X: 132, Y: 152},
		Slots:    8,
		Cols:     8,
		SlotSize: 22,
		Gap:      2,
	})
	g.UIManager.Register(&StatusLine{Name: "status", Y: 142, Align: AlignCenter})
	g.UIManager.Register(&SpeechBubble{Name: "speech", MaxWidth: 200, Padding: 3, OffsetY: 4, FallbackY: 14})
	g.UIManager.Register(&DialogBox{Name: "dialog", Bounds: Rect(0, 140, float64(g.Width), 60), LineHeight: 14, Padding: 6})
	g.UIManager.Register(&EndCard{Name: "endcard"})
	g.UIManager.Register(&Cursor{Name: "cursor"})
}

// RegisterRichUI installs a "story-rich" HUD that matches the layout of
// the screenshot used as the reference: top bar with title/score/time,
// floating character panels for the player and a single NPC, a chat-log
// strip at the bottom-left, a tiny inventory at the bottom-right and a
// permanent verb-wheel on the right edge.
//
// The HUD assumes the default 320×200 internal resolution and that
// PlayerName / NPCName correspond to registered characters. Pass "" for
// NPCName to skip the NPC panel.
func RegisterRichUI(g *Game, playerName, npcName string) {
	g.UIManager.Register(&TopBar{
		Name:     "topbar",
		Height:   12,
		ScoreVar: "score", ScoreMax: 100,
		TimeVar: "time",
	})
	g.UIManager.Register(&HotspotDebug{Name: "hotspot_debug"})
	if playerName != "" {
		g.UIManager.Register(&CharacterPanel{
			Name:      "panel_player",
			Bounds:    Rect(2, 14, 92, 36),
			Character: playerName,
			Title:     "PLAYER",
			Stats: []CharStat{
				{Label: "State", VarKey: playerName + ".state"},
				{Label: "Mood", VarKey: playerName + ".mood"},
			},
		})
	}
	if npcName != "" {
		g.UIManager.Register(&CharacterPanel{
			Name:      "panel_npc",
			Bounds:    Rect(180, 14, 92, 36),
			Character: npcName,
			Title:     "NPC",
			Stats: []CharStat{
				{Label: "State", VarKey: npcName + ".state"},
				{Label: "Mood", VarKey: npcName + ".mood"},
			},
		})
	}
	g.UIManager.Register(&InventoryBar{
		Name:     "inventory",
		Origin:   Point{X: 4, Y: 188},
		Slots:    8,
		Cols:     8,
		SlotSize: 10,
		Gap:      1,
	})
	g.UIManager.Register(&ChatLog{
		Name:       "chat",
		Bounds:     Rect(2, 148, 280, 38),
		LineHeight: 9,
		Padding:    3,
		ShowBorder: true,
	})
	g.UIManager.Register(&RadialVerbs{
		Name:          "verbs",
		AlwaysVisible: true,
		Center:        Point{X: 282, Y: 90},
		Radius:        36,
		Labels: map[string]string{
			"look": "Néz",
			"use":  "Tedd",
			"talk": "Szól",
			"take": "Vedd",
		},
	})
	g.UIManager.Register(&SpeechBubble{Name: "speech", MaxWidth: 200, Padding: 3, OffsetY: 4, FallbackY: 18})
	g.UIManager.Register(&DialogBox{Name: "dialog", Bounds: Rect(0, 90, float64(g.Width), 56), LineHeight: 12, Padding: 6})
	g.UIManager.Register(&EndCard{Name: "endcard"})
	g.UIManager.Register(&Cursor{Name: "cursor"})
}

// RegisterRadialVerbUI installs an alternative HUD that swaps the
// permanent verb-bar for a verb-coin (right-click radial menu). Inventory,
// dialog, speech and cursor stay the same.
func RegisterRadialVerbUI(g *Game) {
	g.UIManager.Register(&HotspotDebug{Name: "hotspot_debug"})
	g.UIManager.Register(&InventoryBar{
		Name:     "inventory",
		Origin:   Point{X: 4, Y: 178},
		Slots:    14,
		Cols:     14,
		SlotSize: 22,
		Gap:      0,
	})
	g.UIManager.Register(&StatusLine{Name: "status", Y: 168, Align: AlignCenter})
	g.UIManager.Register(&SpeechBubble{Name: "speech", MaxWidth: 200, Padding: 3, OffsetY: 4, FallbackY: 14})
	g.UIManager.Register(&DialogBox{Name: "dialog", Bounds: Rect(0, 140, float64(g.Width), 60), LineHeight: 14, Padding: 6})
	g.UIManager.Register(&RadialVerbs{Name: "verbs", Trigger: MouseButtonRight, Radius: 40})
	g.UIManager.Register(&EndCard{Name: "endcard"})
	g.UIManager.Register(&Cursor{Name: "cursor"})
}
