/// <summary>
 /// Actualiza el stock de ingredientes
 /// </summary>
 /// <param name="receta">receta que contiene litros a preparar, ingredientes y sus cantidades necesarias</param>
 public void CalcularStockRestanteIngredientes(RecetaCerveza receta)
 {
     foreach (Ingrediente ingredienteARestarStock in receta.ingredientes)
     {
         ingredienteARestarStock.RestarStock(ingredienteARestarStock, this.StockIngredientes);
     }
 }
        /// <summary>
        /// Empieza a cocinar la cerveza siempre que haya stock de ingredientes necesarios
        /// Si falla se guarda el error en un archivo de log
        /// Si puede empezar a cocinar se suma la cerveza al stock actual y se restan delstock de ingredientes los utilizados
        /// </summary>
        /// <param name="idTipoCerveza"></param>
        /// <param name="tipo"></param>
        /// <param name="litros"></param>
        /// <returns>Devuelve true si puede empezar a cocinar la cerveza, false caso contrario</returns>
        public bool Cocinar(int idTipoCerveza, string tipoReceta, float litros)
        {
            bool          estaCocinando = false;
            ETipoCerveza  tipoCervezaAux;
            Cerveza       cerveza;
            RecetaCerveza receta = null;
            Fermentador   fermentadorDisponible = null;


            try
            {
                if (Enum.TryParse <ETipoCerveza>(tipoReceta, out tipoCervezaAux))
                {
                    receta = new RecetaCerveza(idTipoCerveza, tipoCervezaAux, litros);
                    receta.CalcularIngredientes();
                    fermentadorDisponible = BuscarFermentadorDisponible(receta);
                }

                if (receta != null &&
                    fermentadorDisponible != null &&
                    this.ValidarStockListaIngredientes(receta)
                    )
                {
                    if (tipoCervezaAux is ETipoCerveza.IPA)
                    {
                        cerveza = new CervezaIPA(receta);
                        FabricaBebidas.controlStockCerveza.Add(cerveza);
                    }
                    else if (tipoCervezaAux is ETipoCerveza.Kolsh)
                    {
                        cerveza = new CervezaKolsh(receta);
                        FabricaBebidas.controlStockCerveza.Add(cerveza);
                    }

                    CalcularStockRestanteIngredientes(receta);
                    fermentadorDisponible.CapacidadLitros = receta.LitrosAPreparar;

                    PuedeEmpezarACocinarEvento?.Invoke();
                    estaCocinando = true;
                    Thread.Sleep(3500);
                    FinCoccionEvento?.Invoke();
                }
            }
            catch (LitrosAPrepararExcepcion ex)
            {
                Error err = new Error(ex);
                err.LoguearError();
            }
            catch (NullReferenceException ex)
            {
                Error err = new Error(ex);
                err.LoguearError();
            }
            return(estaCocinando);
        }
        /// <summary>
        /// Valida haya suficiente stock de una lista ingredientes
        /// </summary>
        /// <param name="stockIngredientes"></param>
        /// <param name="receta"></param>
        /// <returns></returns>
        public bool ValidarStockListaIngredientes(RecetaCerveza receta)
        {
            bool hayStock = true;

            foreach (Ingrediente i in receta.ingredientes)
            {
                if (!this.ValidarStockIngrediente(i.idIngrediente, i.stock))
                {
                    hayStock = false;
                    break;
                }
            }
            return(hayStock);
        }
        /// <summary>
        /// Busca un fermentador disponible teniendo en cuenta el tipo de cerveza que se va a guardar y la capacidad de almacenamiento
        /// </summary>
        /// <param name="receta"></param>
        /// <returns>Devuelve un fermentador si cumple con las condiciones, sino null</returns>
        public Fermentador BuscarFermentadorDisponible(RecetaCerveza receta)
        {
            Fermentador fermentadorDisponible = null;

            foreach (Fermentador fermentador in listaFermentadores)
            {
                if (fermentador.tipoCerveza == receta.tipoCerveza &&
                    fermentador.CapacidadLitros >= receta.LitrosAPreparar)
                {
                    fermentadorDisponible = fermentador;

                    break;
                }
            }
            return(fermentadorDisponible);
        }
 /// <summary>
 /// Constructor con parametros
 /// </summary>
 /// <param name="receta">receta que tiene ingredientes y cantidades</param>
 public CervezaIPA(RecetaCerveza receta)
     : base(ETipoCerveza.IPA, receta)
 {
 }
 /// <summary>
 /// COnstructor con parametros
 /// </summary>
 /// <param name="receta">receta que tiene ingredientes y cantidades</param>
 public CervezaKolsh(RecetaCerveza receta)
     : base(ETipoCerveza.Kolsh, receta)
 {
     this.ibu = 6;
 }
 /// <summary>
 /// Constructor con parametros
 /// </summary>
 /// <param name="tipo">tipo de cerveza a preparar</param>
 /// <param name="receta">receta con ingredientes y cantidad necesaria de ellos</param>
 public Cerveza(ETipoCerveza tipo, RecetaCerveza receta)
 {
     this.tipo   = tipo;
     this.receta = receta;
 }