#include <iostream.h>
#include <string>
#include "defines.h"
#include "interpret.h"

void handleActions()
{
    Character ch, ch2;

    CLOOP_START {
	switch (ch.getStatus()) {
	case STATUS_INGAME:
	    if (ch.isReadyBuf()) {
		string command = stripCarriageReturn(ch.argument(1));
		string parameters = stripCarriageReturn(ch.argumentBut(1));

		BaseInterpret *iBaseClassPtr;
		for (int count2 = 1; count2 <= i_list.listLength();
		     count2++) {
		    i_list.listRetrieve(count2, iBaseClassPtr);
		    if (command == iBaseClassPtr->getCommand() && ch.getLevel() >= iBaseClassPtr->getLevelRequired()) {
			iBaseClassPtr->action(ch, parameters);
			ch.clearReadBuf();
		    }
		}

		// If we haven't cleared the buffer, then we haven't found the command
		if (ch.getReadBuf() != "") {
		    ch.addWriteBuf("Invalid command.\n\r");
		    ch.clearReadBuf();
		}
	    }
	    break;
	case STATUS_LOGIN:
	    ch.addWriteBuf("Welcome to COWMUD, please enter your name: ");
	    ch.setStatus(STATUS_GETNAME);
	    break;
	case STATUS_GETNAME:
	    if (ch.isReadyBuf()) {
		string name;
		name = stripCarriageReturn(ch.getReadBuf());
		ch.setName(name);
		ch.clearReadBuf();
		if (!ch.isNameOk()) {
		    ch.addWriteBuf("That is not a valid user name, please try again: ");
		    ch.setStatus(STATUS_GETNAME);
		    break;
		}
		if (!ch.load()) {
		    ch.addWriteBuf(ch.getName() + ", is that correct? (y/n): ");
		    ch.setStatus(STATUS_CONFIRM_NAME);
		} else {
		    ch.addWriteBuf(ch.getName() + ", please enter your password: ");
		    ch.setStatus(STATUS_PWORD);
		}
	    }
	    break;
        case STATUS_CONFIRM_NAME:
	    if (ch.isReadyBuf()) {
		string confirmation;
		confirmation = stripCarriageReturn(ch.getReadBuf());
		ch.clearReadBuf();
		if (makeUpper(confirmation[0]) == 'Y') {
		    ch.addWriteBuf("Using " + ch.getName() + ", please enter a new password: ");
		    ch.setStatus(STATUS_NEW_PWORD);
		} else {
		    ch.addWriteBuf("Then enter the name you would like: ");
		    ch.setStatus(STATUS_GETNAME);
		}
	    }
	    break;
	case STATUS_NEW_PWORD:
	    if (ch.isReadyBuf()) {
		string newPword;
		newPword = stripCarriageReturn(ch.getReadBuf());
		ch.setPword(newPword);
		ch.clearReadBuf();
		if (!ch.isPwordOk()) {
		    ch.addWriteBuf("Invalid password, please use another: ");
		    ch.setStatus(STATUS_NEW_PWORD);
		    break;
		} else {
		    ch.addWriteBuf("Re-enter your password for confirmation: ");
		    ch.setStatus(STATUS_CONFIRM_NEW_PWORD);
		}
	    }
	    break;
	case STATUS_CONFIRM_NEW_PWORD:
	    if (ch.isReadyBuf()) {
		string newPword;
		newPword = stripCarriageReturn(ch.getReadBuf());
		ch.clearReadBuf();
		if (ch.getPword() == newPword) {
		    ch.setStatus(STATUS_WELCOME);
		} else {
		    ch.addWriteBuf("Passwords do not match, please enter a new password: ");
		    ch.setStatus(STATUS_NEW_PWORD);
		}
	    }
	    break;
	case STATUS_PWORD:
	    if (ch.isReadyBuf()) {
		string pword;
		pword = stripCarriageReturn(ch.getReadBuf());
		ch.clearReadBuf();
		if (!(pword == ch.getPword())) {
		    ch.addWriteBuf("Wrong password, please enter again: \n\r");
		    ch.setStatus(STATUS_PWORD);
		} else {
		    ch.setStatus(STATUS_WELCOME);
		}
	    }
	    break;
	case STATUS_WELCOME:
	    ch.setStatus(STATUS_INGAME);
	    writeChar(ch, "Welcome to Cowmud, " + ch.getName() + "!\n\r");
	    for (int count2 = 1; count2 <= c_list.listLength(); count2++) {
		c_list.listRetrieve(count2, ch2);
		if (ch.getSocket() != ch2.getSocket()) {
		    ch2.addWriteBuf(ch.getName() +
				    " has entered COWMUD.\n\r");
		}
		c_list.listReplace(count2, ch2);
	    }
	    ch.save();
	    break;
	default:
	    cout << "ERROR" << endl;
	    break;
	}
    CLOOP_END}
}