package floor

import (
	"bufio"
	"log"
	"os"
	"strconv"

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

// Init initialise les structures de données internes de f.
func (f *Floor) Init() {
	f.content = make([][]int, configuration.Global.NumTileY)
	for y := 0; y < len(f.content); y++ {
		f.content[y] = make([]int, configuration.Global.NumTileX)
	}

	if configuration.Global.Extension1 && configuration.Global.FloorKind == 2 {
		if configuration.Global.Extension2 {
			f.aleaContent = f.Generatefloor(configuration.Global.Extension1_dimensions[0], configuration.Global.Extension1_dimensions[1])
			f.QuadtreeContent = quadtree.MakeFromArray(f.aleaContent)
			f.CreateFileFromFloor(configuration.Global.Extension2_nameFile)
		} else {
			f.QuadtreeContent = quadtree.MakeFromArray(f.Generatefloor(configuration.Global.Extension1_dimensions[0], configuration.Global.Extension1_dimensions[1]))
		}

	} else {
		switch configuration.Global.FloorKind {
		case FromFileFloor:
			f.fullContent = readFloorFromFile(configuration.Global.FloorFile)
		case QuadTreeFloor:
			f.QuadtreeContent = quadtree.MakeFromArray(readFloorFromFile(configuration.Global.FloorFile))
		}
	}

	if configuration.Global.Extension11 && configuration.Global.FloorKind == 2 {
		f.fullContent = make([][]int, f.QuadtreeContent.GetHeight())
		for y := 0; y < len(f.fullContent); y++ {
			f.fullContent[y] = make([]int, f.QuadtreeContent.GetWidth())
		}
		f.noVoidInit()
	}
}

// lecture du contenu d'un fichier représentant un terrain
// pour le stocker dans un tableau
func readFloorFromFile(fileName string) (floorContent [][]int) {

	myFile, err := os.Open(fileName)
	if err != nil {
		log.Fatal(err)
	}

	scanner := bufio.NewScanner(myFile)

	for i := 0; scanner.Scan(); i++ {
		longueur := len(scanner.Text())
		floorContent = append(floorContent, make([]int, longueur))
		for j, val := range scanner.Text() {
			floorContent[i][j], _ = strconv.Atoi(string(val))
		}
	}

	if len(floorContent) != 0 && len(floorContent[0]) != 0 {
	} else {
		log.Fatal("Pas de terrain, pas de jeu.")
	}

	return
}
