package main

import (
	"cosmos/diego/groovy"
	splashmenu "cosmos/diego/groovy/examples/splashmenu/scenes"

	"fmt"
	"log"

	"github.com/hajimehoshi/ebiten/v2"
)

func main() {

	//setup manager
	manager := groovy.NewManager()
	manager.SetDimensions(groovy.Area{Width: 1280, Height: 720})
	ebiten.SetWindowSize(manager.Info.Dimensions.Width, manager.Info.Dimensions.Height)
	ebiten.SetWindowTitle(manager.Info.Name)

	loadScenes(&manager)

	//identification
	fmt.Println(manager.Info.Name + ": v" + manager.Info.Version)

	if err := ebiten.RunGame(&manager); err != nil {
		log.Fatal(err)
	}

}

// Example loading of two scenes
func loadScenes(m *groovy.Manager) {
	//call the loaders for each scene
	//loadSplash(m)
	//loadBsoft(m)
	//loadMenu(m)
	//loadNoise(m)
	//loadSplashpad(m)
	loadParallax(m)

	//reset the manager to start scene 1
	m.ResetScenes()
}

// creates splash screen, sets completion handler
func loadSplash(m *groovy.Manager) {
	//create splash screen and append as first scene in manager
	sceneSplash := splashmenu.NewSplash()
	m.AddScene(&sceneSplash)
}

// creates menu screen, populates the options, sets key event handler
func loadMenu(m *groovy.Manager) {
	//create menu with defined options, append to manager
	sceneMenu := splashmenu.NewMenu()
	sceneMenu.SetOptions(map[int]splashmenu.MenuOption{
		1: {Description: "splash", SelectionEvent: groovy.RESET, Mapping: ebiten.Key1},
		2: {Description: "bsoft", SelectionEvent: groovy.COMPLETED, Mapping: ebiten.Key2},
		3: {Description: "menu"},
		4: {Description: "noise", SelectionEvent: groovy.COMPLETED, Mapping: ebiten.Key4},
		5: {Description: "guy", SelectionEvent: groovy.COMPLETED, Mapping: ebiten.Key5},
		6: {Description: "parallax", SelectionEvent: groovy.COMPLETED, Mapping: ebiten.Key6},
		7: {Description: "exit", SelectionEvent: groovy.ENDGAME, Mapping: ebiten.Key7},
	})

	m.AddScene(&sceneMenu)

	//set up a custom event handler for the menu completion >:]
	scene := m.GetScene(m.SceneCount() - 1)
	scene.SetEventHandler(groovy.COMPLETED, func() {
		//direct manager to update current scene by retrieving menu selection
		sceneSelected := sceneMenu.GetMenuSelection() - 1
		m.SetCurrentScene(sceneSelected)
	})
}

func loadBsoft(m *groovy.Manager) {
	sceneBsoft := splashmenu.NewBsoft()
	m.AddScene(&sceneBsoft)
}

func loadNoise(m *groovy.Manager) {
	sceneNoisy := splashmenu.NewNoisy()
	m.AddScene(&sceneNoisy)
}

func loadSplashpad(m *groovy.Manager) {
	sceneSplashpad := splashmenu.NewSplashPad()
	m.AddScene(&sceneSplashpad)
}

func loadParallax(m *groovy.Manager) {
	sceneParallax := splashmenu.NewParallax()
	m.AddScene(&sceneParallax)
	sceneParallax.InitializeParallax()
}
