//
//  Dado.swift
//  generala
//
//  Created by Julio Hermosa on 4/9/20.
//  Copyright © 2020 Mobile Roshka. All rights reserved.
//

import Foundation


class Dado{
    //
    var resultado = [Int]()//El array se carga al llamar a la función lanzarDado, con valores aleatorios del 1 al 6 (caras del dado). Cada posición de éste vector corresponde a un dado.
    var valores: [Int: Int] = [1: 0, 2:0, 3:0, 4:0, 5:0, 6:0]//Diccionario con cada uno de los valores posibles de 'resultado', contabilizando las veces que se repiten los valores

    //Para cargar los valores del array resultado de manera manual
    //var resultado: [Int] = [1,2,3,5,4]
    
    var resultadoOrdenado = [Int]()//Se ordena el array 'resultado' de manera creciente
    
    //Los siguientes diccionarios resultan a realizar un filtro del diccionario de valores
    var par = [Int:Int]() // Cantidad de pares y sus valores, se utiliza para la combinación 'Full'
    var trio = [Int:Int]() // Valores que aparecen en 3 ocasiones
    var poker = [Int:Int]() // Valores que aparecen en 4 ocasiones
    var generala = [Int:Int]() // Valores que aparecen en 5 ocasiones
    var retorno = "Nada" // Ninguna combinación
    
    //Simulamos el lanzamiento de 5 dados, cuyos resultados se cargan en el array 'resultado' y en el diccionario de valores
    func lanzarDado(){
        //var resultado = [Int]()
        
        //Cargamos los arrays de resultado
        for index in 0...4{
            resultado.append(Int.random(in: 1...6))
            resultadoOrdenado.append(resultado[index])
        }
        
        //ordenamos el resultado
        resultadoOrdenado.sort()
        
        //Recorremos el array contabilizando repeticiones de valores
        for i in 1...4 {
            if valores[resultadoOrdenado[i]] == 0{
                valores[resultadoOrdenado[i]]! += 1
            }
            if resultadoOrdenado[i] == resultadoOrdenado[i-1]{
                valores[resultadoOrdenado[i]]! += 1
            }
           
        }

        
        //filtramos el diccionario de valores segun su cantidad cargando en su combinación correspondiente
        par = valores.filter { $0.value == 2}
        trio = valores.filter { $0.value == 3}
        poker = valores.filter { $0.value == 4}
        generala = valores.filter { $0.value == 5}
                   
        //print (resultado)
        //print (resultadoOrdenado)
       
    }
    
    //La función obtenerResultado devuelve el nombre de la combinación obtenida
    func obtenerResultado()->String{
        
        if trio.count == 1 && par.count == 1{
            retorno = "Full"
        }
        if poker.count == 1{
            retorno = "Poker"
        }
        if generala.count == 1{
            retorno = "Generala"
        }
        let escaleraMenor: [Int] = [1, 2, 3, 4, 5]
        let escalera: [Int] = [2, 3, 4, 5, 6]
        let escaleraMayor: [Int] = [3, 4, 5, 6, 1]
        if resultadoOrdenado == escaleraMenor || resultadoOrdenado == escalera || resultadoOrdenado == escaleraMayor{
            retorno = "Escalera"
        }
        return retorno
    }
    
    //Removemos todos los valores obtenidos por el usuario para volver a jugar
    func reiniciar(){
        resultado.removeAll()
        resultadoOrdenado.removeAll()
        for index in 1...6 {
            valores[index] = 0
        }
        retorno = "Nada"
        
    }
}
