#include <iostream>
#include <vector>
#include <string>
using namespace std;

/* 
 CONSTAT : c'est déjà mieux, mais :
   3) Généricité : on ne peut faire que de la fondue ; pourquoi pas autre chose ? facile ?

mineurs/plus tard:
   4) rendre la saisie plus robuste : do-while
   5) simplifier/améliorer l'affichage
*/

// ==== Type de données =============================

typedef double Quantite;

struct Ingredient
{
  string nom;
  string unite;
  Quantite qtt;
};

struct Recette {
  unsigned int nb_personnes;
  string nom;
  vector<Ingredient> ingredients; // liste et quantités
};

// ==== Fonctions ===================================

unsigned int demander_nb_convives()
{
  /* On supposera pour cet exercice que l'utilisateur ne saisit que
   * des valeurs strictement positives mais nous pourrions faire mieux.
   */
  cout << "Entrez le nombre de personnes invitées : ";
  unsigned int nb_convives(0);
  cin >> nb_convives;
  return nb_convives;
}

// --------------------------------------------------

// version 1 : modifie la recette ; voir 2b.cc pour la version 2
void adapter(Recette& r, unsigned int nb_convives) 
{
  // Mise à jour des quantités en fonction du nombre de convives :

  double ratio(nb_convives); // Notez le 'double' ici...
  ratio /= r.nb_personnes;   // ... pour éviter une division entière.

  for (auto& ingredient : r.ingredients) { // ATTENTION ! n'oubliez pas le & ici !
    ingredient.qtt *= ratio;
  }

  r.nb_personnes = nb_convives; // ne pas oublier ça (nouveau) !!
}

// --------------------------------------------------

// Pensez à MODULARISER : faire aussi un affiche() pour Ingredient !!

void afficher(Ingredient const & ing)
{
    cout << ing.qtt
         << " " << ing.unite
         << " de " << ing.nom ;
}

void afficher(Recette const & rec)
{
  cout << "Pour faire une " << rec.nom << " pour " << rec.nb_personnes << " personne(s), " << endl;
  cout << "il vous faut : " << endl;
  for (auto const& ingredient : rec.ingredients) {
    cout << " - ";
    afficher(ingredient);
    cout << endl;
  }
}

// ==== Main ========================================

int main()
{
  Recette fondue(
     { .nb_personnes = 4,     // nombre de personnes pour la recette de base
       .nom = "fondue fribourgeoise",
                   
       // Pour faire une fondue fribourgeoise pour 4 personnes il faut : 
       .ingredients = {
         { "Vacherin fribourgeois", "gr", 800.0 },  // 800gr de  Vacherin fribourgeois
         { "eau",                   "dl",   2.0 },  // 2dl d'eau
         { "ail",            "gousse(s)",   2.0 },  // 2 gousses d'ail
         { "pain",                  "gr", 400.0 }   // 400 gr de pain
       }
   });

  adapter(fondue, demander_nb_convives());
  afficher(fondue);
 
  return 0;
}

