// $RCSfile: Reservation.cpp,v $
#include "Reservation.h"
#include "PricingStrategy.h"

long Reservation::pennies() {
  return getTotal()->pennies();
}

const char* Reservation::description() {
  return "a reservation";
}

Money * Reservation::getTotal() {
  return pricingStrategy->getTotal(this);
}

Money *Reservation::getPreDiscountTotal(){
  vector<Flight *>::iterator i;
  Money *tot = new Money();
  i = flights->begin();
  for (; i != 0; i++) {
    tot = *tot + *((*i)->getTotal());
  }
  return tot;
}

bool Reservation::contains(City *c) {
  vector<Flight *>::iterator i;
  i = flights->begin();
  for (; i != 0; i++) {
    if ((*i)->contains(c)) {
      return true;
    }
  }
  return false;
}

void Reservation::enterFlight(Flight *f) {
  flights->insert(flights->end(), f);
  publish();
}

Reservation::Reservation(
         PricingStrategy *ps)
  : pricingStrategy(ps),
    flights(new vector<Flight *>()),
    subscribers(
      new vector<ReservationObserver *>())
{
}

Reservation::
 Reservation(const Reservation &r)
   : pricingStrategy(
       r.pricingStrategy->clone()),
     flights(new vector<Flight *>(
               *(r.flights))),
     subscribers(
       new vector<ReservationObserver *>(
               *(r.subscribers)))
{ }

Reservation::~Reservation() {
  delete pricingStrategy;
  delete flights;
  // can't delete the observers...
}

void Reservation::subscribe(
	    ReservationObserver *ro) {
  subscribers->insert(
     subscribers->end(), ro);
}

void Reservation::publish() {
  vector<ReservationObserver *>::iterator i;
  i = subscribers->begin();
  for (; i != 0; i++) {
    (*i)->update(this);
  }
}

