#include "character.h"
#include "defines.h"

//Load types
#define LOAD_TYPE_INT    1
#define LOAD_TYPE_STRING 2

Character::Character()
{
    pword = "";
}

Character::~Character()
{
}

Character::Character(int socket)
{
    setSocket(socket);
}

void Character::save()
{
    ofstream oFile;
    string filename = PLAYER_DIR + getName();
    const char *str = filename.c_str();
    oFile.open(str);

    outputCharacter(oFile);

    oFile.close();
}

void Character::outputCharacter(ofstream & oFile)
{
    oFile << LOAD_TYPE_STRING << " Name: " << getName() << endl;
    oFile << LOAD_TYPE_STRING << " Pword: " << getPword() << endl;
    oFile << LOAD_TYPE_INT    << " Level: " << getLevel() << endl;
}

bool Character::load()
{
    ifstream iFile;
    string filename = PLAYER_DIR + getName();
    string identifier, svalue;
    int type, ivalue;
    const char *str = filename.c_str();

    iFile.open(str);

    if (iFile.fail())
	return false;

    while (!iFile.eof()) {
	iFile >> type >> identifier;
	if (!iFile.eof()) {
	    switch (type) {
	    case LOAD_TYPE_STRING:
		iFile >> svalue;
		// This set of if statements determines which character 'set' funciton to call
		if (identifier == "Name:") {
		    setName(svalue);
		    break;
		} else if (identifier == "Pword:") {
		    setPword(svalue);
		    break;
		} else {
		    cout << "Error in reading file: " << filename <<
			".  No such identifier: " << identifier <<
			" for string type" << endl;
		    exit(1);
		    break;
		}
	    case LOAD_TYPE_INT:
		iFile >> ivalue;
		if (identifier == "Level:") {
		    setLevel(ivalue);
		    break;
		} else {
		    cout << "Error in reading file: " << filename <<
			".  No such identifier: " << identifier <<
			" for integer type" << endl;
		    exit(1);
		    break;
		}
	    }
	}
    }
    return true;
}

void Character::setPword(string str)
{
    pword = str;
}

string Character::getPword()
{
    return pword;
}

bool Character::isPwordOk()
{
    string newPword = pword;
    if (newPword.length() < 5 || newPword.length() > 15) {
	return false;
    }
    //character checking
    for (uint count = 0; count < newPword.length(); count++) {
	uint asciicode = (uint) newPword[count];
	if (asciicode < 48 || (asciicode > 57 && asciicode < 65) 
		|| (asciicode > 133 && asciicode < 141)
	    || asciicode > 172) {
	    return false;
	}
    }
    return true;
}