//: C10:BuildBicycles.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
//{L} Bicycle
// Návrhový vzor Stavitel.
#include <cstddef>
#include <iostream>
#include <map>
#include <vector>
#include "Bicycle.h"
#include "../purge.h"
using namespace std;

// Sestaví kolo pomocí konkrétního stavitele
Kolo* postavMiKolo(
  MechanikKola& c, StavitelKola* stavitel) {
  c.nastavitStavitele(stavitel);
  c.sestavit();
  Kolo* b = stavitel->getProdukt();
  cout << "Postaveno " << stavitel->getNazevKola() << endl;
  return b;
}

int main() {
  // Vytvořit objednávku na nějaká kola.
  map <string, size_t> objednavka;
  objednavka["horske"] = 2;
  objednavka["cestovni"] = 1;
  objednavka["zavodni"] = 3;

  // Sestavení kola
  vector<Kolo*> kola;
  StavitelKola* h = new StavitelHorskehoKola;
  StavitelKola* c = new StavitelCestovnihoKola;
  StavitelKola* z = new StavitelZavodnihoKola;
  MechanikKola mech;
  map<string, size_t>::iterator it = objednavka.begin();
  while(it != objednavka.end()) {
    StavitelKola* stavitel;
    if(it->first == "horske")
      stavitel = h;
    else if(it->first == "cestovni")
      stavitel = c;
    else if(it->first == "zavodni")
      stavitel = z;
    for(size_t i = 0; i < it->second; ++i)
      kola.push_back(postavMiKolo(mech, stavitel));
    ++it;
  }
  delete h;
  delete c;
  delete z;

  // Zobrazit seznam
  for(size_t i = 0; i < kola.size(); ++i)
    cout << "Kolo: " << *kola[i] << endl;
  purge(kola);
}

/* výstup:
Postaveno CestovniKolo
Postaveno HorskeKolo
Postaveno HorskeKolo
Postaveno ZavodniKolo
Postaveno ZavodniKolo
Postaveno ZavodniKolo
Kolo: { 
  Rám Kolo Sedlo Přehazovačka Řídítka Rozeta Brašna }
Kolo: { 
  Rám Kolo Sedlo Přehazovačka Řídítka Rozeta Tlumič }
Kolo: { 
  Rám Kolo Sedlo Přehazovačka Řídítka Rozeta Tlumič }
Kolo: { 
  Rám Kolo Sedlo Řídítka Rozeta }
Kolo: { 
  Rám Kolo Sedlo Řídítka Rozeta }
Kolo: { 
  Rám Kolo Sedlo Řídítka Rozeta }
*/ ///:~
