package floor

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

/// EXTENSION 6 : caméra bloquée sur les bordures ///

// CameraBlocking réalise le blocage de la caméra lorsqu'un bord du terrain est affiché.
// Le personnage peut continuer de se déplacer, seulement on n'apercevra plus le vide.
// Note : marche en FloorKind 1 et 2
func (f *Floor) cameraBlocking(topLeftX, topLeftY, height, width int) {

	up := true

	if height != 0 {
		if width != 0 {

			// 1 : Si le terrain affiche une bordure et qu'on se déplace vers elle, on change la position du joueur d'une tuile vers la bordure //
			if configuration.Global.NumTileY < height {
				if topLeftY < 0 {
					configuration.Global.ScreenCenterTileY--
					up = false
				} else if topLeftY+configuration.Global.NumTileY-1 >= height {
					configuration.Global.ScreenCenterTileY++
					up = false
				}
			}
			if configuration.Global.NumTileX < width {
				if topLeftX < 0 {
					configuration.Global.ScreenCenterTileX--
					up = false
				} else if topLeftX+configuration.Global.NumTileX-1 >= width {
					configuration.Global.ScreenCenterTileX++
					up = false
				}
			}

			// 2 : Si le joueur n'est plus au centre [du terrain affiché] et qu'on se déplace vers ce dernier, il faut revenir d'une case vers le centre //
			if configuration.Global.NumTileY < height {
				if topLeftY > 0 && configuration.Global.ScreenCenterTileY < configuration.Global.NumTileY/2 {
					configuration.Global.ScreenCenterTileY++
					up = false
				}
				if topLeftY+configuration.Global.NumTileY < height && configuration.Global.ScreenCenterTileY > configuration.Global.NumTileY/2 {
					configuration.Global.ScreenCenterTileY--
					up = false
				}
			}
			if configuration.Global.NumTileX < width {
				if topLeftX > 0 && configuration.Global.ScreenCenterTileX < configuration.Global.NumTileX/2 {
					configuration.Global.ScreenCenterTileX++
					up = false
				}
				if topLeftX+configuration.Global.NumTileX < width && configuration.Global.ScreenCenterTileX > configuration.Global.NumTileX/2 {
					configuration.Global.ScreenCenterTileX--
					up = false
				}
			}

			// 3 : Cas particulier des terrains aux dimensions inférieures à celles de la caméra
			if configuration.Global.NumTileY >= height {
				if topLeftY > 0 {
					configuration.Global.ScreenCenterTileY++
					up = false
				} else if topLeftY < 0 {
					configuration.Global.ScreenCenterTileY--
					up = false
				}
			}
			if configuration.Global.NumTileX >= width {
				if topLeftX > 0 {
					configuration.Global.ScreenCenterTileX++
					up = false
				} else if topLeftX < 0 {
					configuration.Global.ScreenCenterTileX--
					up = false
				}
			}

		}
	}

	// 4 : Si 1, 2 ou 3 a été exécuté, il ne faut pas mettre à jour le terrain (puisque c'est la position du joueur qui a alors été modifié)
	if up {
		if configuration.Global.FloorKind == 1 {
			f.updateFromFileFloor(topLeftX, topLeftY)
		} else if configuration.Global.FloorKind == 2 {
			f.updateQuadtreeFloor(topLeftX, topLeftY)
		}
	}
}
