//Zaimplementowac klase Piwo pozwalajacy na przechowywanie takich danych jak:
//  marka, typ piwa, pojemnosc, cena, rok produkcji
//1.Zaimplementowac 2 konstruktory:
//  bezargumentowy, ktory przypisuje polom nazw lancuch pusty "" a wartosciom liczbowym wartosc 0
//  przyjmujacy 5 argumentow: marka, typ piwa, pojemnosc, cena, rok produkcji
//2.Zaimplementowac operator przypisania kopjacy wszystkie parametry piwa
//3.Zaimplementowac metody pozwalające na ustawianie typu piwa
//4.Zaimplementowac metody pozwalające na ustawianie roku produkcji piwa
//5.Zaimplementowac operator == porownujacy marke i typ piwa
//6.Zaimplementowac operator << wypisujacy wszystkie dane o piwie na ekran
//7.Zaimplementowac rzucanie wyjątku przy probie wypisania na strumien piwa o niepelych danych
//  (marka lub typ pusty, cena, pojemnosc, pola roku zerowe)
//
//Do reprezentacji nazw nalezy zastosowac klase string. Do reprezentacji danych liczbowych
//nalezy zastosowac wlasciwy typ danych najlepiej opisujacy dana liczbe 
//(stalo/ziennoprzenikowa, ze znakiem, bez znaku)
//
//
// Spodziewany efekt na ekranie dzialania pelnej implementacji:

//Dane piwa 4:
//Dane piwa sa niepoprawne lub niepelne               
//Piwa 1 i 2 sa te same (Warka Strong)
//Piwo 1 (Warka Strong) i 2 (Karmi Kawowe) sa inne
//Dostepne sa piwa:
//Piwo:   Warka Strong
// cena:  2.53
// poj.:  0.5
// prod.: 2010
//
//Piwo:   Warka Strong
// cena:  2.53
// poj.:  0.5
// prod.: 2010
//
//Piwo:   Karmi Kawowe
// cena:  2.2
// poj.:  0.33
// prod.: 2010
//
//Piwo:   Karmi Karmelowe
// cena:  2.2
// poj.:  0.33
// prod.: 2010
//
//Aby kontynuować, naciśnij dowolny klawisz . . .

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

class NiepoprawneDane{};

class Piwo {
      string marka;
      string typ;
      float pojemnosc;
      float cena;
      unsigned int rok;
public:
       Piwo(string _marka="", string _typ="", float _pojemnosc=0.0, float _cena=0.0, unsigned int _rok=0)
       {
                   marka=_marka;
                   typ=_typ;
                   pojemnosc=_pojemnosc;
                   cena=_cena;
                   rok=_rok;
       }
       void UstawTyp(string _typ){
                   typ=_typ;
       }
       void UstawRokProdukcji(unsigned int _rok){
                   rok=_rok;
       }
       Piwo& operator=(Piwo& p){
                   marka=p.marka;
                   typ=p.typ;
                   pojemnosc=p.pojemnosc;
                   cena=p.cena;
                   rok=p.rok;
       }
       bool operator==(Piwo& p){
            if (marka==p.marka && typ==p.typ)
               return true;
            return false;
       }
       string Nazwa(){
              return marka+" "+typ;
       }
       string GetMarka(){
              return marka;
       }
       string GetTyp(){
              return typ;
       }
       float GetCena(){
              return cena;
       }
       float GetPojemnosc(){
              return pojemnosc;
       }
       unsigned int GetRok(){
              return rok;
       }
};

ostream& operator<<(ostream& s, Piwo& p){
         if (p.GetMarka()=="" || p.GetTyp()=="" || p.GetCena()==0.0 || p.GetPojemnosc()==0.0 || p.GetRok()==0)
            throw NiepoprawneDane();
         cout<<"Piwo:   "<<p.Nazwa()<<endl;
         cout<<" cena:  "<<p.GetCena()<<endl;
         cout<<" poj.:  "<<p.GetPojemnosc()<<endl;
         cout<<" prod.: "<<p.GetRok()<<endl;
         return s;
}

int main(int argc, char *argv[])
{
    Piwo p1("Warka", "Strong", 0.5, 2.53, 2010);                        //1
    Piwo p2("Warka", "Strong", 0.5, 2.53, 2010);                        //1
    Piwo p3("Karmi", "Karmelowe", 0.33, 2.20, 2010);                    //1
    Piwo p4;                                                            //2
    
    try {                                                             //3
        cout<<"Dane piwa 4:"<<endl;                                   //3
        cout<<p4;                                                     //3
    } catch (NiepoprawneDane x){                                         //3
           cerr<<"Dane piwa sa niepoprawne lub niepelne"<<endl;          //3
    }
    
    
        p4=p3;                                                        //4  
        p3.UstawRokProdukcji(2010);                                   //5
        p3.UstawTyp("Kawowe");                                        //5
        
        if (p1==p2)                                                   //6
           cout<<"Piwa 1 i 2 sa te same ("<<p1.Nazwa()<<")"<<endl;
        else
          cout<<"Piwo 1 ("<<p1.Nazwa()<<") i 2 ("<<p2.Nazwa()<<")sa jednakowe"<<endl;
  
        if (p1==p3)                                                   //6
           cout<<"Piwa 1 i 2 sa te same ("<<p1.Nazwa()<<")"<<endl;
        else
           cout<<"Piwo 1 ("<<p1.Nazwa()<<") i 2 ("<<p3.Nazwa()<<") sa inne"<<endl;

        cout<<"Dostepne sa piwa:"<<endl;
        cout<<p1<<endl;                                                  //7
        cout<<p2<<endl;                                                  //7
        cout<<p3<<endl;                                                  //7
        cout<<p4<<endl;                                                  //7

    system("PAUSE");
    return EXIT_SUCCESS;
}

