module Alimento

  #Esta clase permite representar un plato

  class Plato

    attr_accessor :name, :vegetales, :frutas, :granos, :proteinas, :aceites
   
    #Se guarda el nombre del plato y se recibe un bloque con los ingredientes
    def initialize(name, &block)
      @name = name
      @vegetales = []
      @frutas = []
      @granos = []
      @proteinas = []
      @aceites = []

      if block_given?
        if block.arity == 1
          yield self
        else
          instance_eval(&block)
        end
      end
    end
    
    #Guarda un alimento dentro de la clase
    def ingrediente(grupo, nombre, medida)
      alimento = $alimentos.find{|x| x.nombre == nombre}
      aux = medida.split(" ").first.split("/")
      valor = 0
      if(aux.size > 1)
        valor = aux[0].to_f/aux[1].to_f
      else
        valor = aux[0].to_f
      end
      
      cantidad = $equivalencias[medida.sub("ñ", "n").split(" ").drop(1).each{|x| x.gsub!(/s\z/, "")}.reduce(:+).to_sym].to_f
      cantidad *= valor
     

      if(grupo == "vegetal" || grupo == "vegetales")
        @vegetales << [alimento, cantidad]
      elsif(grupo == "fruta" || grupo == "frutas")
        @frutas << [alimento, cantidad]
      elsif(grupo == "grano" || grupo == "granos" || grupo == "cereal" || grupo == "cereales")
        @granos << [alimento, cantidad]
      elsif(grupo == "proteina" || grupo == "proteína" || grupo == "proteinas" || grupo == "proteínas")
        @proteinas << [alimento, cantidad]
      elsif(grupo == "aceite" || grupo == "aceites")
        @aceites << [alimento, cantidad]
      else
        "#{grupo} no es un grupo de alimento permitido"
      end
    end

    #Muestra el contenido del plato
    def to_s
      total = 0
      output = @name
      output << "\n#{'=' * @name.size}\n\n"
      output << "Composición nutricional:\n"
      output << "%20s" % "" + "%-10s" % "glúcidos" + "%-10s" %  "proteínas" + "%-10s" % "lípidos" + "%-20s" % "valor energético\n"
      @vegetales.each{ |x, y| output << "%-20s" % x.nombre + "%-10s" % x.glucidos + "%-10s" % x.proteinas + "%-10s" % x.lipidos + "%-20f\n" % (x.val_energ/100*y); total += x.val_energ/100*y}
      @frutas.each{ |x, y| output << "%-20s" % x.nombre + "%-10s" % x.glucidos + "%-10s" % x.proteinas + "%-10s" % x.lipidos + "%-20f\n" % (x.val_energ/100*y); total += x.val_energ/100*y}
      @granos.each{ |x, y| output << "%-20s" % x.nombre + "%-10s" % x.glucidos + "%-10s" % x.proteinas + "%-10s" % x.lipidos + "%-20f\n" % (x.val_energ/100*y); total += x.val_energ/100*y}
      @proteinas.each{ |x, y| output << "%-20s" % x.nombre + "%-10s" % x.glucidos + "%-10s" % x.proteinas + "%-10s" % x.lipidos + "%-20f\n" % (x.val_energ/100*y); total += x.val_energ/100*y}
      @aceites.each{ |x, y| output << "%-20s" % x.nombre + "%-10s" % x.glucidos + "%-10s" % x.proteinas + "%-10s" % x.lipidos + "%-20f\n" % (x.val_energ/100*y); total += x.val_energ/100*y}
      output << "%-41s" % "Valor energético total" + "%20f" % total
      output
    end

  end

end