require "alimento/lista.rb"
require "alimento/version.rb"

class PlatoDls
    attr_accessor :nombre, :v_energetico, :vegetales, :frutas, :cereales, :proteinas, :aceites
    
    #@note Lista de alimentos para la costrucción de los platos
    @@lista = Lista.new()
    @HuevoFrito = AlimentoC.new("Huevo Frito", 14.1, 0.0, 19.5, "Huevos, lacteos y helados" )
    @LecheVaca = AlimentoC.new("Leche vaca", 3.3, 4.8, 3.2, "Huevos, lacteos y helados")
    @Yogurt = AlimentoC.new("Yogurt", 3.8, 4.9, 3.8, "Huevos, lacteos y helados")
    @Cerdo = AlimentoC.new("Cerdo", 21.5, 0.0, 6.3, "Carnes y derivados")
    @Ternera = AlimentoC.new("Ternera", 21.1, 0.0, 3.1, "Carnes y derivados")
    @Pollo = AlimentoC.new("Pollo", 20.6, 0.0, 5.6, "Carnes y derivados")
    @Bacalao = AlimentoC.new("Bacalao",  17.7, 0.0, 0.4, "Pescados y mariscos") 
    @Atun = AlimentoC.new("Atun", 21.5, 0.0, 15.5, "Pescados y mariscos") 
    @Salmon = AlimentoC.new("Salmon",  19.9, 0.0, 13.6, "Pescados y mariscos") 
    @AceiteOliva = AlimentoC.new("Aceite Oliva", 0.0, 0.2, 99.6, "Alimentos grasos") 
    @Mantequilla = AlimentoC.new("Mantequilla", 0.7, 0.0, 83.2, "Alimentos grasos") 
    @Chocolate = AlimentoC.new("Chocolate", 5.3, 47.0, 30.0, "Alimentos grasos") 
    @Azucar = AlimentoC.new("Azucar", 0.0, 99.8, 0.0, "Alimentos ricos en carbohidratos") 
    @Arroz = AlimentoC.new("Arroz",6.8, 77.7, 0.6, "Alimentos ricos en carbohidratos") 
    @Lentejas = AlimentoC.new("Lentejas",  23.5, 52.0, 1.4, "Alimentos ricos en carbohidratos") 
    @Papas = AlimentoC.new("Papas",2.0, 15.4, 0.1, "Alimentos ricos en carbohidratos") 
    @Tomate = AlimentoC.new("Tomate", 1.0, 3.5, 0.2, "Verduras y Hortalizas") 
    @Cebolla = AlimentoC.new("Cebolla", 1.3, 5.8, 0.3, "Verduras y Hortalizas") 
    @Calabaza = AlimentoC.new("Calabaza", 1.1, 4.8, 0.1, "Verduras y Hortalizas") 
    @Manzanas = AlimentoC.new("Manzanas", 0.3, 12.4, 0.4, "Frutas") 
    @Platanos = AlimentoC.new("Platanos", 1.2, 21.4, 0.2, "Frutas") 
    @Pera = AlimentoC.new("Pera",  0.5, 12.7, 0.3, "Frutas")
    
    @nodo1 = Nodo.new(@HuevoFrito)
    @nodo2 = Nodo.new(@LecheVaca)
    @nodo3 = Nodo.new(@Yogurt)
    @nodo4 = Nodo.new(@Cerdo)
    @nodo5 = Nodo.new(@Ternera)
    @nodo6 = Nodo.new(@Pollo)
    @nodo7 = Nodo.new(@Bacalao)
    @nodo8 = Nodo.new(@Atun)
    @nodo9 = Nodo.new(@Salmon)
    @nodo10 = Nodo.new(@AceiteOliva)
    @nodo11 = Nodo.new(@Mantequilla)
    @nodo12 = Nodo.new(@Chocolate)
    @nodo13 = Nodo.new(@Azucar)
    @nodo14 = Nodo.new(@Arroz)
    @nodo15 = Nodo.new(@Lentejas)
    @nodo16 = Nodo.new(@Papas)
    @nodo17 = Nodo.new(@Tomate)
    @nodo18 = Nodo.new(@Cebolla)
    @nodo19 = Nodo.new(@Calabaza)
    @nodo20 = Nodo.new(@Manzanas) 
    @nodo21 = Nodo.new(@Platanos)
    @nodo22 = Nodo.new(@Pera)
    
    @@lista.insertar_cabeza(@nodo1)
    @@lista.insertar_mul([@nodo2, @nodo3, @nodo4, @nodo5, @nodo6, @nodo7, @nodo8, @nodo9, @nodo10,
            @nodo11,@nodo12, @nodo13, @nodo14, @nodo15, @nodo16, @nodo17, @nodo18, @nodo19, @nodo20, @nodo21, @nodo22], 1)
    
    #@note La equivalencia de las diferentes palabras en gramos
    @@equGram = { "cucharadas"=>1.8,"piezas pequeñas"=>7,"taza"=>6,"cucharón"=>4,"pieza"=>10,"cucharada"=>1.8,  "piezas"=>10 }
    
    #@note Construcctor de la clase platos de DLS
    #@param Le pasamos el nombre y el bloque que irá inicializando el resto de las variables. 
    def initialize nombreIn, &bloque
        @nombre = nombreIn 
        @v_energetico = 0
        
        @vegetales = []
        @frutas = []
        @cereales = []
        @proteinas = []
        @aceites = []
        
        instance_eval(&bloque)
    end
    
    #@note Función para la cantidad de alimento que añadimos al plato 
    #@param porcion[String] 
    def get_cant porcion
        #La cantidad está en el primer caracter
        num = porcion.split[0].to_r
        cad = ""
        #Formateamos correctamente la cadena 
        porcion.split[1..cad.length-1].each do |i|
            cad += i + " "
        end 
        cant = num * @@equGram[cad.chomp ' ']
    end 
    
    #@note Función para añadir correctamente los vegetales desde dls 
    #@param nom_ali[Strign],  opciones[String]
    def vegetal nom_ali, opciones = {}
        cant = 0
        ali = @@lista.detect { |i| nom_ali == i.nombre }
        if opciones[:gramos]
            cant = options[:gramos]
        elsif opciones[:porcion]
            cant = get_cant opciones[:porcion]
        end
        @v_energetico += cant*ali.v_energetico
        @vegetales.push([ali, (cant*ali.v_energetico).round(3)])
    end
    
    #@note Función para añadir correctamente las frutas desde dls 
    #@param nom_ali[Strign],  opciones[String]
    def fruta nom_ali, opciones = {}
        cant = 0
        ali = @@lista.detect { |i| nom_ali == i.nombre }
        if opciones[:gramos]
           cant = opciones[:gramos]
        elsif opciones[:porcion]
            cant = get_cant opciones[:porcion]
        end
        @v_energetico += cant*ali.v_energetico
        @frutas.push([ali, (cant*ali.v_energetico).round(3)])
    end
    
    #@note Función para añadir correctamente los cereales desde dls 
    #@param nom_ali[Strign],  opciones[String]
    def cereal nom_ali, opciones = {}
        cant = 0
        ali = @@lista.detect { |i| nom_ali == i.nombre }
        if opciones[:gramos]
           cant = opciones[:gramos]
        elsif opciones[:porcion]
            cant = get_cant opciones[:porcion]
        end
        @v_energetico += cant*ali.v_energetico
        @cereales.push([ali, (cant*ali.v_energetico).round(3)])
    end
    
    #@note Función para añadir correctamente los proteinas desde dls 
    #@param nom_ali[Strign],  opciones[String]
    def proteina nom_ali, opciones = {}
        cant = 0
        ali = @@lista.detect { |i| nom_ali == i.nombre }
        if opciones[:gramos]
           cant = opciones[:gramos]
        elsif opciones[:porcion]
            cant = get_cant opciones[:porcion]
        end
        @v_energetico += cant*ali.v_energetico
        @proteinas.push([ali, (cant*ali.v_energetico).round(3)])
    end
    
    #@note Función para añadir correctamente el aceite desde dls 
    #@param nom_ali[Strign],  opciones[String]
    def aceite nom_ali, opciones = {}
        cant = 0
        ali = @@lista.detect { |i| nom_ali == i.nombre }
        if opciones[:gramos]
           cant = opciones[:gramos]
        elsif opciones[:porcion]
            cant = get_cant opciones[:porcion]
        end
        @v_energetico += cant*ali.v_energetico
        @aceites.push([ali, (cant*ali.v_energetico).round(3)])
    end
    
    #@note Función para mostrar el contenido de la lista. 
    #@return Lista formateada en una cadena para su visualización. 
    def to_s
        salida = @nombre + "\n"
        salida += "=============================================================\n"
        salida += "Composición nutricional: \n"
        salida += "\tglúcidos proteínas lípidos \tgrupo\t\t\t valor energético\n"
        
        for i in 0..@vegetales.length-1 do
            salida += @vegetales[i][0].to_s + "\t\t" + @vegetales[i][1].to_s + "\n"
        end 
        
        for i in 0..@frutas.length-1 do
            salida += @frutas[i][0].to_s + "\t\t" + @frutas[i][1].to_s + "\n"
        end 
        
        for i in 0..@cereales.length-1 do
            salida += @cereales[i][0].to_s + "\t\t" + @cereales[i][1].to_s + "\n"
        end 
        
        for i in 0..@proteinas.length-1 do
            salida += @proteinas[i][0].to_s + "\t\t" + @proteinas[i][1].to_s + "\n"
        end 
        
        for i in 0..@aceites.length-1 do
            salida += @aceites[i][0].to_s + "\t\t" + @aceites[i][1].to_s + "\n"
        end 
        
        salida += "Valor energetico = " + v_energetico.to_s
        salida
    end 
    
end