#include <u.h>
#include <libc.h>

#define TIMEOUTMS 10000

void
notehandler(void *, char *note)
{
	if (strcmp(note, "alarm") != 0) {
		noted(NDFLT);
	}
	exits(0);
}

char
next1(void)
{
	char c;
	long n;
	n = readn(0, &c, 1);
	if (n != 1) {
		exits(0);
	}
	alarm(TIMEOUTMS);
	return c;
}

char *
readuser(void)
{
	static char user[256];
	char c, *p = user;
	long len = 0;

	/* TODO: Skip the /W switch. */
	/* TODO: Handle Q2. */
	while ((c = next1()) != '\r' || (c = next1()) != '\n') {
		if (len == sizeof(user)-1) {
			print("Username too long.\n");
			exits(0);
		}
		*p++ = c;
		len++;
	}
	*p = '\0';
	return user;
}

char *
readname(char *user, char *buf, long n)
{
	char path[256];
	int fd;
	
	sprint(path, "/usr/%s/lib/name", user);
	fd = open(path, OREAD);
	if(fd < 0) {
		*buf = '\0';
		return buf;
	}
	n = readn(fd, buf, n-1);
	buf[n] = '\0';
	return buf;
}

int
readlastlogin(char *user, Tm *tm)
{
	Dir *d;
	Tzone *tz;
	char path[256];
	
	sprint(path, "/usr/%s/lib/logintime", user);
	d = dirstat(path);
	if(d == nil)
		return -1;
	if((tz = tzload("local")) == nil)
		sysfatal("load zone: %r");
	tmtime(tm, d->mtime, tz);
	free(d);
	return 0;
}

int
openplan(char *user)
{
	char path[256];
	
	sprint(path, "/usr/%s/.plan", user);
	return open(path, OREAD);
}

int
verify(char *user)
{
	int fd, i, n;
	Dir *d;
	
	fd = open("/usr", OREAD);
	while((n = dirread(fd, &d)) > 0) {
		for(i = 0; i < n; ++i)
			if(strcmp(d->name, user) == 0) {
				free(d);
				close(fd);
				return 0;
			}
		free(d);
	}
	if(fd != -1)
		close(fd);
	return -1;
}

void
usage(void)
{
	fprint(2, "usage: %s\n", argv0);
	exits("usage");
}

long
min(long a, long b)
{
	return a < b ? a : b;
}

void
main(int argc, char *argv[])
{
	char *user, name[64], buf[8192];
	Dir *d;
	Tm tm;
	int planfd, usrfd, i, n;
	
	ARGBEGIN{
	default:
		usage();
	}ARGEND;
	if(argc > 0)
		usage();
	tmfmtinstall();
	notify(notehandler);
	alarm(TIMEOUTMS);
	user = readuser();
	alarm(0);
	
	if(*user == '\0') {
		print("%-20s %-20s %s\n", "Login", "Name", "Last login");
		usrfd = open("/usr", OREAD);
		/* TODO: Sort by last login. */
		while((n = dirread(usrfd, &d)) > 0) {
			for(i = 0; i < n; ++i) {
				print("%-20s ", d->name);
				print("%-20s ", readname(d->name, name, min(sizeof(name), 21)));
				if(readlastlogin(d->name, &tm) < 0)
					print("Never\n");
				else
					print("%τ\n", tmfmt(&tm, nil));
			}
			free(d);
		}
		if(usrfd != -1)
			close(usrfd);
		exits(0);
	}
	
	if(verify(user) < 0) {
		print("No such user.\n");
		exits(0);
	}
	
	print("Login: %-32s Name: %s\n", user, readname(user, name, sizeof(name)));
	print("Directory: /usr/%-23s Shell: /bin/rc\n", user);
	if(readlastlogin(user, &tm) < 0)
		print("Never logged in.\n");
	else
		print("Last login: %τ\n", tmfmt(&tm, nil));
	planfd = openplan(user);
	if(planfd < 0) {
		print("No Plan.\n");
		return;
	} else {
		print("Plan:\n");
		while((n = read(planfd, buf, (long)sizeof(buf))) > 0) {
			write(1, buf, n);
		}
		close(planfd);
	}
}
