#include <vector>
#include <string>
using namespace std;
#include <cstdlib>
#include "util.h"

vector<string> tokenize(const string & str, const string & delimiters) {
    vector<string> tokens;
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    string::size_type pos  = str.find_first_of(delimiters, lastPos);
    while (string::npos != pos || string::npos != lastPos)
    {
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        lastPos = str.find_first_not_of(delimiters, pos);
        pos = str.find_first_of(delimiters, lastPos);
    }
    return tokens;
}

bool parse_n_load(const string & input, string & name, string & type,
        int & max_hp, int & strength, int & speed, int & magic) {
    vector<string> tokens = tokenize(input);
	vector<string> tokens2 = tokenize(input, ".");

    if (tokens.size() != 6 or tokens2.size() > 1) {
        return false;
    }

    name = tokens[0];

    string parsed_type = tokens[1];
    if(parsed_type.size() != 1) {
        return false;
    }
    if (not (   parsed_type == "A"
             or parsed_type == "C"
             or parsed_type == "R")) {
        return false;
    }

    type = parsed_type;
    

    int parsed_max_hp = atoi(tokens[2].c_str());
    int parsed_strength = atoi(tokens[3].c_str());
    int parsed_speed = atoi(tokens[4].c_str());
    int parsed_magic = atoi(tokens[5].c_str());

    if (parsed_max_hp == 0 or parsed_strength == 0 or parsed_speed == 0 or
            parsed_magic == 0) {
        return false;
    }

    max_hp = parsed_max_hp;
    strength = parsed_strength;
    speed = parsed_speed;
    magic = parsed_magic;

    return true;
}
