package poker.domain

import poker.domain._
import scala.collection.mutable._

class Rodada(val numero:Int, jogadores:List[Jogador]) {
	val baralho = new Baralho()
	baralho.embaralha
	val mesa = new Mesa()
	val jogadoresMaos = new HashMap[Jogador, Mao]()
	jogadores.foreach { jogador:Jogador => 
	  jogadoresMaos += (jogador -> new Mao())
	}

	override def toString(): String = {
		var str = numero + ") " + mesa + " / "
		jogadoresMaos.keys.foreach { jogador:Jogador =>
		  str += (jogador + " " + jogadoresMaos(jogador) + " / ")
		}
		str
	}

	def combinacoes(): HashMap[Combinacao, Jogador] = {
	  val map = new HashMap[Combinacao, Jogador]()
		jogadoresMaos.keys.foreach { jogador:Jogador =>
		  jogadoresMaos(jogador).combinacoes(mesa).foreach { combinacao:Combinacao =>
		    map += (combinacao -> jogador)
		  }
		}
    map
	}
 
 def combinacoesOrdenadas(): LinkedHashMap[Combinacao, Jogador] = {
   val map = new LinkedHashMap[Combinacao, Jogador]()
   val hashmap = combinacoes()
   
   var combinacoesOrdenadas = CombinacaoFactory.ordena(hashmap.keySet.toList)
   combinacoesOrdenadas.foreach { combinacao:Combinacao =>
     map += (combinacao -> hashmap(combinacao))
   }
   map
 }
   
	def distribuiCartas() {
		(1 to 2).foreach { i =>
			jogadoresMaos.keys.foreach { jogador:Jogador =>
			  jogadoresMaos(jogador).push(baralho.pop())
			}
		}
		(1 to 5).foreach { i => mesa.push(baralho.pop()) }
	}

	def vencedores(): List[Jogador] = {
	  var vencedores = List[Jogador]()
		var map = combinacoesOrdenadas()
    var combinacaoVencedora = map.keySet.toList.last
    map.keySet.toList.reverse.foreach { combinacao:Combinacao =>
      if(combinacao == combinacaoVencedora)
        vencedores = map(combinacao) :: vencedores
      else return vencedores
    }
    vencedores
	}
}
