package floor

import "gitlab.univ-nantes.fr/jezequel-l/quadtree/configuration"

// Update se charge de stocker dans la structure interne (un tableau)
// de f une représentation de la partie visible du terrain à partir
// des coordonnées absolues de la case sur laquelle se situe la
// caméra.
//
// On aurait pu se passer de cette fonction et tout faire dans Draw.
// Mais cela permet de découpler le calcul de l'affichage.
func (f *Floor) Update(camXPos, camYPos int) (canMove bool) {
	f.animation = (f.animation + 1) % 60
	canMove = true

	topLeftX := camXPos - configuration.Global.ScreenCenterTileX
	topLeftY := camYPos - configuration.Global.ScreenCenterTileY

	if configuration.Global.Extension12 && configuration.Global.FloorKind == 2 {
		topLeftX, topLeftY, canMove = f.zoom(topLeftX, topLeftY, camXPos, camYPos)
	}

	switch configuration.Global.FloorKind {
	case GridFloor:
		f.updateGridFloor(topLeftX, topLeftY)
	case FromFileFloor:
		if configuration.Global.Extension6 {
			f.cameraBlocking(topLeftX, topLeftY, f.GetHeight(), f.GetWidth())
		} else {
			f.updateFromFileFloor(topLeftX, topLeftY)
		}
	case QuadTreeFloor:
		if configuration.Global.Extension11 {
			f.noVoidUpdate(topLeftX, topLeftY)
		} else if configuration.Global.Extension6 {
			f.cameraBlocking(topLeftX, topLeftY, f.QuadtreeContent.GetHeight(), f.QuadtreeContent.GetWidth())
		} else {
			f.updateQuadtreeFloor(topLeftX, topLeftY)
		}
	}
	return canMove
}

// le sol est un quadrillage de tuiles d'herbe et de tuiles de désert
func (f *Floor) updateGridFloor(topLeftX, topLeftY int) {
	for y := 0; y < len(f.content); y++ {
		for x := 0; x < len(f.content[y]); x++ {
			absX := topLeftX
			if absX < 0 {
				absX = -absX
			}
			absY := topLeftY
			if absY < 0 {
				absY = -absY
			}
			f.content[y][x] = ((x + absX%2) + (y + absY%2)) % 2
		}
	}
}

// le sol est récupéré depuis un tableau, qui a été lu dans un fichier
func (f *Floor) updateFromFileFloor(topLeftX, topLeftY int) {

	for i := 0; i < len(f.content); i++ {
		for j := 0; j < len(f.content[i]); j++ {
			if topLeftY+i >= 0 && topLeftY+i < len(f.fullContent) && topLeftX+j >= 0 && topLeftX+j < len(f.fullContent[topLeftY+i]) {
				f.content[i][j] = f.fullContent[topLeftY+i][topLeftX+j]
			} else {
				f.content[i][j] = -1
			}
		}
	}
}

// le sol est récupéré depuis un quadtree, qui a été lu dans un fichier
func (f *Floor) updateQuadtreeFloor(topLeftX, topLeftY int) {
	f.QuadtreeContent.GetContent(topLeftX, topLeftY, f.content)
}
