/*    /cmds/player/title.c
 *    from the Dead Souls LPC Library
 *    allows someone to set their titles
 *    created by Descartes of Borg 950716
 */
#include <lib.h>
#include <daemons.h>
inherit LIB_DAEMON;
static void eventOrderTitles(string *titles, int maxi);
static void GetTitle(string which, string *titles, int maxi);
static void GetDest(string which, string *titles, int i, int maxi);
mixed cmd(string args) {
    string *titles;
    int maxi;
    if( creatorp(this_player()) || avatarp(this_player()) ) {
	if( !args || args == "" ) return "Change your title to what?";
	else args = (string)this_player()->SetShort(args);
	message("system", "Title changed to: " + args, this_player());
	this_player()->save_player((string)this_player()->GetKeyName());
	update("/secure/daemon/finger");
	return 1;
    }
    if( !(maxi = sizeof(titles = (string *)this_player()->GetTitles())) ) 
	return "You are totally unaccomplished.";
    if( args == "1" || args == "2" ) {
	this_player()->SetTitleLength(to_int(args));
	this_player()->SetShort("foo");
	this_player()->eventPrint("Number of titles in your descriptions changed to " + args + ".");
	this_player()->save_player((string)this_player()->GetKeyName());
	update("/secure/daemon/finger");
	return 1;
    }
    if( maxi == 1 ) {
	message("system", "You have only one title: " + titles[0], 
	  this_player());
	return 1;
    }
    else if( maxi == 2 ) {
	function f;
	f = function(string yn, string *titles) {
	    yn = (yn || "n");
	    if( yn != "y" ) {
		message("system", "Titles remain unchanged.", this_player());
		return;
	    }
	    this_player()->SetTitles( ({ titles[1], titles[0] }) );
	    message("system", "Titles reversed.", this_player());
	    this_player()->save_player((string)this_player()->GetKeyName());
	    update("/secure/daemon/finger");
	};
	message("system", "You have the following titles:\n\t" +
	  titles[0] + "\n\t" + titles[1], this_player());
	message("prompt", "Do you wish to reverse them? [n] ", this_player());
	input_to(f, titles);
	return 1;
    }
    else eventOrderTitles(titles, maxi);
    return 1;
}
static void eventOrderTitles(string *titles, int maxi) {
    int i;
    message("system", "You have the following titles:", this_player());
    for(i=0; i<maxi; i++)
	message("system", "\t" + (i+1) + " " + titles[i], this_player());
    message("prompt", "Move which (q to quit)? [" + (maxi) + "] ", 
      this_player());
    input_to((: GetTitle :), titles, maxi);
}
static void GetTitle(string which, string *titles, int maxi) {
    int x;
    if( which == "q" ) {
	this_player()->SetTitles(titles);
	message("system", "Done.", this_player());
	return;
    }
    else if( which == "" || !which ) which = "" + maxi;
    x = to_int(which);
    if( x < 1 || x > maxi ) {
	message("system", "Illegal title number.", this_player());
	eventOrderTitles(titles, maxi);
	return;
    }
    x--;
    message("prompt", "Move \"" + titles[x] + "\" to position? [1] ",
      this_player());
    input_to( (: GetDest :), titles, x, maxi );
}
static void GetDest(string which, string *titles, int i, int maxi) {
    string *tmp;
    int j, maxj, x;
    if( which == "q" ) {
	this_player()->SetTitles(titles);
	message("system", "Done.", this_player());
	this_player()->save_player((string)this_player()->GetKeyName());
	update("/secure/daemon/finger");
	return;
    }
    else if( which == "" || !which ) which = "1";
    x = to_int(which);
    if( x < 1 || x > maxi || x == i+1 ) {
	message("system", "Illegal title number.", this_player());
	eventOrderTitles(titles, maxi);
	return;
    }
    x--;
    tmp = allocate(maxj = sizeof(titles));
    for(j=0; j<maxj; j++) {
	if( j == x ) tmp[j] = titles[i];
	else if( (j < x && j < i) || (j > x && j > i) ) tmp[j] = titles[j];
	else if( j > x && j <= i ) tmp[j] = titles[j-1];
	else tmp[j] = titles[j+1];
    }
    eventOrderTitles(tmp, maxi);
}
void help() {
    if( creatorp(this_player()) ) {
	message("help", "Syntax: <title [title]>\n\n"
	  "Allows you to change your title.  You must include the "
	  "token $N in your title, which will be replaced with your "
	  "name as appropriate.  For example:\n"
	  "\ttitle We are $N of Borg\n"
	  "would make my short appear as:\n"
	  "\tWe are Descartes of Borg.\n\n", this_player());
    }
    else {
	message("help", "Syntax: <title>\n\n"
	  "Allows you to reorder your titles.  Your first two titles "
	  "appear in your short description.  This command is "
	  "interactive, meaning it prompts you for what to do.  "
	  "hit 'q' at any point to save your changes and exit out of "
	  "this command.\nYou can also type (title 1) or (title 2) "
	  "to change how many titles appear in your description.",
	  this_player() );
    }
}