## 	Author:: 		BastienMor
## 	Developers: 	BastienMor
## 	Version:: 		0.1
## 	Copyright:: 	© 2017
## 	License:: 		Distributes under the same terms as Ruby
## 	

##
## Génération de grille de Sudoku (création de difficulté)
##
class Generateur

	@grid
	@difficulte

	attr_reader :grid, :difficulte

	##
	## Initialisation
	## 
	## @param difficulte	Difficulté à prendre en compte
	##
	def initialize(difficulte)
		@grid = Array.new()
		ligne = Array.new()

		@difficulte = difficulte

		9.times do
			val = 1+rand(9)
			while(ligne.include? val)
				val = 1+rand(9)
			end
			ligne.unshift(val)
		end

		3.times do
			3.times do
				@grid.push(ligne.clone)
				3.times do
					ligne.unshift(ligne.pop())
				end
			end
			ligne.unshift(ligne.pop())
		end

		4.times do
			a = rand(3)
			b = rand(3)
			while(a == b)
				b = rand(3)
			end

			switchrow(a, b)
			switchcol(a, b)
			switchrow(5-a, 5-b)
			switchcol(8-a, 8-b)
		end

		complexifier()
	end


	##
	## Génère une grille avec une difficulté variable
	##
	def generer()
		self.convert()
	end

	##
	## Echange la place de 2 lignes.
	##
	## @param 	a 	Première ligne
	## @param 	b 	Deuxième ligne
	##
	def switchrow(a, b)
		@grid[a], @grid[b] = @grid[b], @grid[a]
	end

	##
	## Echange la place de 2 colonnes.
	## 
	## @param 	a 	Première colonne
	## @param 	b 	Deuxième colonne
	##
	def switchcol(a, b)
		@grid.map {|e| e[a], e[b] = e[b], e[a]}
	end


	##
	## Retire des cases pour créer la difficulté.
	##
	## @return la grille
	def complexifier()

		present = Array.new
		9.times do
			val = 1+rand(9)
			while(present.include? val)
				val = 1+rand(9)
			end
			present.unshift(val)
		end

		1.upto(@difficulte) do
			victime = present.pop()
			@grid.each do |a|
				a.each_with_index do |c, index|
					if c == victime
						a[index] = nil
					end
				end
			end
		end


		nbkill = 0
		@grid.each do |a|
			nbkill += a.count(nil)
		end
		nbkill = (81-nbkill)* @difficulte *0.1

		0.upto(nbkill) do
			x = rand(9)
			y = rand(9)
			while(@grid[x][y] == nil)
				x = rand(9)
				y = rand(9)
			end
			@grid[x][y] = nil
		end

		return @grid
	end


	##
	## Convertit la grille de list
	##
	## @return la grille convertie.
	##
	def convert()

		res = Array.new()
		ligne = Array.new()

		@grid.each do |line|
			line.each do |elem|
				val = Hash.new()
				val["value"] = elem
				val["editable"] = false
				
				if(elem == nil)
					val["editable"] = true
				end

				ligne.push(val.clone())
			end
			res.push(ligne.clone())
			ligne = Array.new()
		end

		return res
	end
end

# gen = Generateur.new()
# g1 = gen.generer(1)
# g2 = gen.generer(1)