package flow

// TODO: There are Chaos and Ultramarine versions of MainGame. Do we really want
// to duplicate everything for both?

func (f *Flow) linkMainGame() {
	f.linkMainGameActionMenu()
	f.linkMainGameInterfaceOptionsMenu()
	// 5:  Holding menu
	f.linkMainGameViewMenu()

	// 7:  General character menu
	f.onClick(mainGame, "7.4", func() { // More button
		f.setActiveNow(mainGame, "7", false)
		f.setActiveNow(mainGame, "8", true)
	})

	// 8:  Character stats
	f.onClick(mainGame, "8.21", func() { // Stat more buttont
		f.setActiveNow(mainGame, "7", true)
		f.setActiveNow(mainGame, "8", false)
	})

	// 9:  Visible enemy menu
	// 10: Friendly squad menu
	// 11: Psyker spell dialogue
	// 12: Inventory dialogue
	f.onClick(mainGame, "12.21", f.hideDialogue(mainGame)) // Exit

	// 13: exchange menu

	// 14: Map
	// 14.1: MAP_SPRITE
	// 14.2: Multiplier button (2x)
	f.onClick(mainGame, "14.3", f.setActive(mainGame, "14", false))
	// 14.4: Area

	// FIXME: the display of left and right interface buttons is hidden by these
	// sprites, because we draw in strict numeric order. Just hide them for now.
	//
	// FIXME: The child element is already set to hidden, while the menu itself
	// is set to active, so maybe this is a hint that menus shouldn't be drawn?
	//
	// FIXME: the approach taken by the original binary in resolutions greater
	// than 640x480 is to draw the menu elements *unscaled*. They are centered,
	// and the dead space is filled by the "interface wing" sprites in the
	// background. Should we replicate this, or keep with the current scaling
	// behaviour? Which is better?
	f.exit = maybeErr(mainGame, f.setActiveNow(mainGame, "15", false)) // Interface wing left
	f.exit = maybeErr(mainGame, f.setActiveNow(mainGame, "16", false)) // Interface wing right
	// 17: Grenade dialogue

	f.onClick(mainGame, "18.12", f.setActive(mainGame, "18", false)) // Info "dialogue"

	// 19: Turn start dialogue
	// 20: Chat menu

	// Chat list menu box - active by default, hide it
	f.exit = maybeErr(mainGame, f.setActiveNow(mainGame, "21", false))

}

func (f *Flow) linkMainGameActionMenu() {
	// 3: Action menu. These are mostly predicated on selected character state
	// 3.1: Aimed shot
	// 3.2: Shooting
	// 3.3: Walk
	// 3.4: Run
	// 3.5: Crouch/Stand
	// 3.6: Hand to hand (commented out)
	// 3.7: Retrieve
	// 3.8: Door
	// 3.9: Switch
	// 3.10: Overwatch
	// 3.11: Rally/Formation
	// 3.12: Board/Disembark
	// FIXME: for now, this is "end scenario", for convenience
	f.onClick(mainGame, "3.13", func() { // End turn button.
		f.scenario = nil
		f.returnToLastDriverNow(mainGame)
	})
	// 3.14: Special action heal
	// 3.15: Special action techmarine
	// 3.16: Special action jump pack
	// 3.17: Special action spell
}

func (f *Flow) linkMainGameInterfaceOptionsMenu() {
	// 4: Interface options menu
	f.onClick(mainGame, "4.1", f.setReturningDriver(mainGame, options)) // Options button

	// FIXME: map should be shown top-right, not top-left. We need to support 2x
	// mode as well.
	f.onClick(mainGame, "4.2", f.toggleActive(mainGame, "14")) // Map button

	// FIXME: mission objectives should be shown top-left, not centered
	f.onClick(mainGame, "4.3", f.toggleActive(mainGame, "18")) // Mission objectives

	f.onClick(mainGame, "4.4", f.showDialogue(mainGame, "12")) // Inventory
	// 4.5: Next man
	// 4.6: Next enemy
	// 4.7: Total enemy text
}

func (f *Flow) linkMainGameViewMenu() {
	// FIXME: all these buttons should show current state as well as have an
	// effect
	f.onClick(mainGame, "6.1", f.withScenario(func() { // View 100%
		f.scenario.Zoom = 1.0
	}))

	f.onClick(mainGame, "6.2", f.withScenario(func() { // View 50%
		f.scenario.Zoom = 0.5
	}))

	f.onClick(mainGame, "6.3", f.withScenario(func() { // View 25%
		f.scenario.Zoom = 0.25
	}))

	f.onClick(mainGame, "6.4", f.withScenario(func() { // Z index up
		f.scenario.ChangeZIdx(+1)
	}))

	f.onClick(mainGame, "6.5", f.withScenario(func() { // Z index down
		f.scenario.ChangeZIdx(-1)
	}))

	f.onClick(mainGame, "6.6", f.withScenario(func() { // Z index 1
		f.scenario.ZIdx = 0
	}))

	f.onClick(mainGame, "6.7", f.withScenario(func() { // Z index 2
		f.scenario.ZIdx = 1
	}))

	f.onClick(mainGame, "6.8", f.withScenario(func() { // Z index 3
		f.scenario.ZIdx = 2
	}))

	f.onClick(mainGame, "6.9", f.withScenario(func() { // Z index 4
		f.scenario.ZIdx = 3
	}))

	f.onClick(mainGame, "6.10", f.withScenario(func() { // Z index 5
		f.scenario.ZIdx = 4
	}))

	f.onClick(mainGame, "6.11", f.withScenario(func() { // Z index 6
		f.scenario.ZIdx = 5
	}))

	f.onClick(mainGame, "6.12", f.withScenario(func() { // Z index 7
		f.scenario.ZIdx = 6
	}))

}
