package main

import (
	"fmt"
	"log"
	"math/rand"

	"github.com/gdamore/tcell/v2"
)

func gameinit() {
	game, err := initialize()
	if err != nil {
		log.Fatalln("Initilization error: ", err)
	}
	go game.gameDirector()
	game.keyboardProcessor()

	// Quit the screen
	quit(&game)

	fmt.Println("\nDebug time: Trash")
	for i, t := range game.trash {
		fmt.Println("Trash: ", i, t)
	}

	// Give closure
	if game.gameover == 1 {
		fmt.Println("\nYou got rekt by a robot")
	} else if game.gameover == 2 {
		fmt.Println("\nYou took the easy way out")
	}

	fmt.Println("Score:", game.player.score)
	fmt.Println("Moves:", game.player.moves)
	fmt.Println("Teleports:", game.player.teleports)

}

func initialize() (Game, error) {

	var err error

	screen, err := tcell.NewScreen()
	if err != nil {
		log.Println("Error creating screen: ", err)
	}
	err = screen.Init()
	if err != nil {
		log.Fatalln("Error initializing screen: ", err)
	}

	style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)

	game := Game{
		screen:     screen,
		style:      style,
		keypresses: make(chan int),
		player: Player{
			position: Position{
				x: 40,
				y: 12,
			},
			score:     0,
			moves:     0,
			teleports: 0,
		},
		level: 1,
		// robots:   []Robot, // I need this maybe
		// trash: []Position, // I will need this
		gameover: 0,
	}

	return game, err
}

func (game *Game) gameDirector() {
	defer quit(game)

	for game.gameover == 0 {

		// Clean the screen
		game.screen.Clear()

		// Draw starter conditions
		game.drawBox()
		game.drawScore()
		game.drawPlayer()
		//game.drawCoords()
		game.drawDebug()

		// Draw robots??
		if len(game.robots) == 0 {
			game.level++
			game.cleanTrash()
			game.initRobots()
		}
		game.drawRobots()

		// Draw my ex-wife
		game.drawTrash()

		// Draw the screen
		game.screen.Show()

		// Process input
		game.movePlayer(game, <-game.keypresses)

		// Move robots
		game.moveRobots()

	}

}

func (game *Game) keyboardProcessor() {
	defer close(game.keypresses)

	for game.gameover == 0 {

		// Poll for an event
		ev := game.screen.PollEvent()

		// Fetch the type, and check if any other actions are required.
		switch ev := ev.(type) {
		case *tcell.EventKey:
			// Keys to bug out
			if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
				game.gameover = 2
				return

				// Screen management
			} else if ev.Key() == tcell.KeyCtrlL {
				game.screen.Sync()

				// Player Movement
			} else if ev.Rune() == 'q' {
				game.keypresses <- upleft
			} else if ev.Rune() == 'e' {
				game.keypresses <- upright
			} else if ev.Rune() == 'z' {
				game.keypresses <- downleft
			} else if ev.Rune() == 'c' {
				game.keypresses <- downright
			} else if ev.Key() == tcell.KeyUp || ev.Rune() == 'w' {
				game.keypresses <- Up
			} else if ev.Key() == tcell.KeyRight || ev.Rune() == 'd' {
				game.keypresses <- Right
			} else if ev.Key() == tcell.KeyDown || ev.Rune() == 's' || ev.Rune() == 'x' {
				game.keypresses <- Down
			} else if ev.Key() == tcell.KeyLeft || ev.Rune() == 'a' {
				game.keypresses <- Left

				// Teleport the player
			} else if ev.Rune() == 't' {
				game.keypresses <- teleport
			}
		}
	}
}

func quit(game *Game) {
	game.screen.Clear()
	maybePanic := recover()
	game.screen.Fini()
	if maybePanic != nil {
		panic(maybePanic)
	}
}

func (game *Game) randPos() Position {
	var pos Position

	x := 1 + rand.Intn(77)
	y := 1 + rand.Intn(22)

	pos.x = x
	pos.y = y

	return pos
}