package floor

import (
	"testing"

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

func Test_Update_Exemple(t *testing.T) {

	configuration.Global.NumTileX = 4
	configuration.Global.NumTileY = 4
	var f Floor
	f.Init()
	f.fullContent = readFloorFromFile("../floor-files/exemple")

	f.updateFromFileFloor(0, 0)
	//fmt.Println(f.content)
	var resultatAttendu [][]int = [][]int{
		{1, 1, 3, 4},
		{1, 1, 4, 3},
		{0, 0, 2, 2},
		{0, 0, 2, 2},
	}

	if !Equal(f.content, resultatAttendu) {
		t.Error(f.content)
	}
}

func Test_Update_Exemple_2(t *testing.T) {
	// Test avec caméra large pour vérifier la génération de -1 quand la caméra est + grande que le floor
	configuration.Global.NumTileX = 5
	configuration.Global.NumTileY = 5
	var f Floor
	f.Init()
	f.fullContent = readFloorFromFile("../floor-files/exemple")

	f.updateFromFileFloor(0, 0)

	var resultatAttendu [][]int = [][]int{
		{1, 1, 3, 4, -1},
		{1, 1, 4, 3, -1},
		{0, 0, 2, 2, -1},
		{0, 0, 2, 2, -1},
		{-1, -1, -1, -1, -1},
	}

	if !Equal(f.content, resultatAttendu) {
		t.Error(f.content)
	}
}

func Test_Update_Validation(t *testing.T) {
	configuration.Global.NumTileX = 4
	configuration.Global.NumTileY = 4
	var f Floor
	f.Init()
	f.fullContent = readFloorFromFile("../floor-files/validation")

	f.updateFromFileFloor(4, 1)

	var resultatAttendu [][]int = [][]int{
		{1, 2, 2, 2},
		{0, 2, 0, 2},
		{1, 2, 2, 2},
		{0, 2, 2, 1},
	}

	if !Equal(f.content, resultatAttendu) {
		t.Error(f.content)
	}
}

func Test_Update_Validation_2(t *testing.T) {
	// Test avec caméra large pour vérifier la génération de -1 quand la caméra est + grande que le floor
	configuration.Global.NumTileX = 20
	configuration.Global.NumTileY = 20
	var f Floor
	f.Init()
	f.fullContent = readFloorFromFile("../floor-files/validation")

	f.updateFromFileFloor(4, 1)

	var resultatAttendu [][]int = [][]int{
		{1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, -1, -1, -1},
		{0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, -1, -1, -1},
		{1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, -1, -1, -1},
		{0, 2, 2, 1, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, -1, -1, -1},
		{1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 2, 0, 1, 2, 2, 2, 1, -1, -1, -1},
		{0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
		{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
	}

	if !Equal(f.content, resultatAttendu) {
		t.Error(f.content)
	}
}

func Test_Update_1x1(t *testing.T) {
	configuration.Global.NumTileX = 1
	configuration.Global.NumTileY = 1
	var f Floor
	f.Init()
	f.fullContent = readFloorFromFile("../floor-files/1x1.txt")

	f.updateFromFileFloor(0, 0)

	var resultatAttendu [][]int = [][]int{{0}}

	if !Equal(f.content, resultatAttendu) {
		t.Error(f.content)
	}
}

func Test_Update_1x1_2(t *testing.T) {
	configuration.Global.NumTileX = 4
	configuration.Global.NumTileY = 4
	var f Floor
	f.Init()
	f.fullContent = readFloorFromFile("../floor-files/1x1.txt")

	f.updateFromFileFloor(-2, -2)

	var resultatAttendu [][]int = [][]int{
		{-1, -1, -1, -1},
		{-1, -1, -1, -1},
		{-1, -1, 0, -1},
		{-1, -1, -1, -1},
	}

	if !Equal(f.content, resultatAttendu) {
		t.Error(f.content)
	}
}

func Test_Update_Vide(t *testing.T) {
	configuration.Global.NumTileX = 1
	configuration.Global.NumTileY = 1
	var f Floor
	f.Init()
	f.fullContent = readFloorFromFile("../floor-files/vide.txt")

	f.updateFromFileFloor(0, 0)

	var resultatAttendu [][]int = [][]int{{-1}}

	if !Equal(f.content, resultatAttendu) {
		t.Error(f.content)
	}
}
