//
//  main.cpp
//  OperatorOverload
//
//  Created by Robert Metcalfe on 21/07/13.
//  Copyright (c) 2013 Robert Metcalfe. All rights reserved.
//
#include <iostream>

class Pet {
public:
    char *thename;
    Pet() { };
    void putPet(char* tn) { thename = tn; };
};

class Mammal {
public:
    char *aname, *akingdom, *aphylum, *aclass, *anorder, *afamily, *agenus, *aspecies, *abinomial;
    Mammal() { };
    void putMammal(char* an, char* ak, char* ap, char* ac, char* ao, char* af, char* ag, char* as, char *ab) {
        aname = an; akingdom = ak; aphylum = ap; aclass = ac; anorder = ao; afamily = af; agenus = ag; aspecies = as; abinomial = ab; };
};

class Cat: public Pet,
public Mammal {
public:
    void operator+(Cat& c2) { if (thename == c2.thename) { show("only "); } else { show("first "); c2.show("second "); } }
    Cat(char* tn, char* an, char* ak, char* ap, char* ac, char* ao, char* af, char* ag, char* as, char *ab) {
        putPet(tn);
        putMammal(an, ak, ap, ac, ao, af, ag, as, ab);
    };
    void show(std::string adjective) {
        std::cout << "My " << adjective << "pet cat is called " << thename << " with Common Name: " << aname << std::endl;
        std::cout << "Kingdom: " << akingdom << "  Phylum: " << aphylum << "  Class: " << aclass << "  Order: " << anorder << std::endl;
        std::cout << "Family: " << afamily << "  Genus: " << agenus << "  Species: " << aspecies << "  Binomial name: " << abinomial << std::endl;
    };
    void show() {
        std::cout << "My pet cat is called " << thename << " with Common Name: " << aname << std::endl;
        std::cout << "Kingdom: " << akingdom << "  Phylum: " << aphylum << "  Class: " << aclass << "  Order: " << anorder << std::endl;
        std::cout << "Family: " << afamily << "  Genus: " << agenus << "  Species: " << aspecies << "  Binomial name: " << abinomial << std::endl;
    };
};

int main(int argc, char** argv) {
    Cat mycat("Blinky", "Domestic Cat", "Animalia", "Chordata", "Mammalia", "Carnivora", "Felidae", "Felis", "F. catus", "Felis catus");
    //mycat.show();
    Cat mycat2("Kitty", "Domestic Cat", "Animalia", "Chordata", "Mammalia", "Carnivora", "Felidae", "Felis", "F. catus", "Felis catus");
    //mycat2.show();
    (mycat + mycat2);
    std::cout << " ... but, in another life ... " << std::endl;
    Cat mycat3("Mimi", "Domestic Cat", "Animalia", "Chordata", "Mammalia", "Carnivora", "Felidae", "Felis", "F. catus", "Felis catus");
    //mycat3.show();
    Cat mycat4("Mimi", "Moggy", "Animalia", "Chordata", "Mammalia", "Carnivora", "Felidae", "Felis", "F. catus", "Felis catus");
    //mycat4.show();
    (mycat3 + mycat4);
    return 0;
}
