/* Do not remove the headers from this file! see /USAGE for more info. */

inherit M_DAEMON_DATA;

mapping birthdays = ([]);
mapping reverse = ([]);

nosave string today;

void refresh() {
    today = ctime(time())[4..9];
}

void repeat_refresh() {
    today = ctime(time())[4..9];
    call_out((:repeat_refresh:),86400);
}

varargs string array query_birthdays(string when) {
    mixed item;

    refresh();
    item = birthdays[when || today];
    return item ? explode(item, ",") : ({ });
}

varargs mapping query_month(string mo) {
    int i;
    mapping ret = ([]);
    
    if (!mo) mo = today[0..2];
    
    for (i = 1; i <= 10; i++) {
	string tmp = birthdays[mo + "  " + i];
	if (tmp) ret[mo + "  " + i] = tmp;
    }
    for (i = 10; i <= 31; i++) {
	string tmp = birthdays[mo + " " + i];
	if (tmp) ret[mo + " " + i] = tmp;
    }
    return ret;
}


void add_birthday(string name, string when) {
    if (strlen(when) == 5)
        when = when[0..2] + " " + when[3..4];
    if (strlen(when) != 6 || when[3] != ' ')
	error("Bad date format\n");

    switch (when[0..2]) {
    case "Jan": case "Feb": case "Mar": case "Apr": case "May": case "Jun":
    case "Jul": case "Aug": case "Sep": case "Oct": case "Nov": case "Dec":
	break;
    case "jan": case "feb": case "mar": case "apr": case "may": case "jun":
    case "jul": case "aug": case "sep": case "oct": case "nov": case "dec":
	when = capitalize(when);
	break;
    default:
	error("Bad date format\n");
    }
    if (member_array(when[4], " 0123456789") == -1
	|| member_array(when[5], "0123456789") == -1)
	error("Bad date format\n");
    if (when[4] == '0')
	when[4] = ' ';
    if (member_array(',', name) != -1)
	error("Bad name\n");

    if (reverse[name]) {
	mixed tmp = explode(birthdays[reverse[name]], ",");
	tmp -= ({ name });
	birthdays[reverse[name]] = implode(tmp, ",");
    }
    reverse[name] = when;

    if (birthdays[when])
	birthdays[when] += "," + name;
    else
	birthdays[when] = name;
    save_me();
}

void report() {
    string array bdays = query_birthdays();
    
    if (!sizeof(bdays))
	return;
    
    bdays = map(bdays, (: capitalize :));
    
    printf("*** Todays birthdays: %s\n", implode(bdays, ", "));
}

void create() {
    int start = time();
    int end = start + 86400;
    string today = ctime(start)[0..9];

    ::create();

    /* binary search for start of tomorrow */
    while (start != end) {
	int mid = (start + end)/2;
	
	if (ctime(mid)[0..9] == today)
	    start = mid + 1;
	else
	    end = mid;
    }

    refresh();
    call_out((: repeat_refresh :), start - time());
}

    
