# Un panier consiste en une liste d'objets LineItem et un prix total
# actuel. L'ajout d'un produit au panier ajoutera soit une nouvelle
# entrée à la liste ou incrémentera le quantité d'un article existant.
# Dans les deux cas le prix total est mis à jour.
#
# La classe Cart est un modèle mais il ne stocke aucune information 
# dans la base de données. C'est pour cette raison qu'elle n'hérite
# pas de la classe ActiveRecord::Base.

class Cart

  # Un tableau d'objets LineItem
  attr_reader :items

  # La prix total de tout ce qui figure dans le panier
  attr_reader :total_price
  
  # Crée un nouveau panier. Le travail est en fait déléguer 
  # à #empty!
  def initialize
    empty!
  end

  # Ajoute un produit à la liste des articles du panier. Si l'article
  # est déjà présent, la quantité est augmentée de un au lieu de
  # créer une nouvelle entrée.
  def add_product(product)
    item = @items.find {|i| i.product_id == product.id}
    if item
      item.quantity += 1
    else
      item = LineItem.for_product(product)
      @items << item
    end
    @total_price += product.price
  end

  # Vide le panier en réinitialisant le tableau des articles
  # et en remettant à zéro le montant total du panier
  def empty!
    @items = []
    @total_price = 0.0
  end
end 
