#include <vector>
using namespace std;

#include "arena.h"
#include "fighter.h"
#include "archer.h"
#include "cleric.h"
#include "robot.h"
#include "util.h"

arena::~arena() {
    fighter * f = NULL;
    for(vector<FighterInterface *>::iterator it = fighters.begin();
            it != fighters.end();
            it++) {
        f = dynamic_cast<fighter *>(*it);
        delete f;
    }
}

bool arena::contains(string name) {
    fighter * f = NULL;
    for(unsigned int i = 0; i < fighters.size(); i++) {
        f = dynamic_cast<fighter *>(fighters[i]);
        if(f->getName() == name) {
            return true;
        }
    }
    return false;
}

bool arena::addFighter(string info) {
    fighter * f = NULL;

    string name;
    string type;
    int max_hp;
    int strength;
    int speed;
    int magic;

    bool worked;
    worked = parse_n_load(info, name, type, max_hp, strength, speed, magic);
    if(not worked) {
        return false;
    }

    if(contains(name)) {
        return false;
    }

    if(type == "A") {
        f = new archer(name, max_hp, strength, speed, magic);
    }
    else if(type == "C") {
        f = new cleric(name, max_hp, strength, speed, magic);
    }
    else if(type == "R") {
        f = new robot(name, max_hp, strength, speed, magic);
    }

    fighters.push_back(f);

    return true;
}

bool arena::removeFighter(string name) {
    fighter * f = NULL;
    for(vector<FighterInterface *>::iterator it = fighters.begin();
            it != fighters.end();
            it++) {
        f = dynamic_cast<fighter *>(*it);
        if(f->getName() == name) {
            delete f;
            fighters.erase(it);
            return true;
        }
    }
    return false;
}

FighterInterface * arena::getFighter(string name) {
    fighter * f = NULL;
    for(vector<FighterInterface *>::iterator it = fighters.begin();
            it != fighters.end();
            it++) {
        f = dynamic_cast<fighter *>(*it);
        if(f->getName() == name) {
            return dynamic_cast<FighterInterface *>(f);
        }
    }
    return NULL;
}

int arena::getSize() {
    return fighters.size();
}

ostream & operator<<(ostream & os, arena & a) {
    os << "[";
    for(vector<FighterInterface * >::iterator it = a.fighters.begin();
            it != a.fighters.end();
            it++) {
        os << *(dynamic_cast<fighter *>( *it));
        if (it != a.fighters.end() - 1) {
            os << ", ";
        }
    }
    os << "]";
    return os;
}
