#include <u.h>
#include <libc.h>
#include <draw.h>
#include <bio.h>
#include <thread.h>
#include <9pclient.h>

Biobuf bin, bout;

void
usage(void)
{
	fprint(2, "usage: jukefmt id\n");
	threadexitsall("usage");
}

void
threadmain(int argc, char **argv)
{
	int id, n, tab, w;
	char *f[10], *p, *q;
	CFsys *fs;
	CFid *fid;
	char buf[1024];
	Font *font;
	
	Binit(&bin, 0, OREAD);
	Binit(&bout, 1, OWRITE);
	
	tab = 0;
	n = 0;
	font = nil;
	
	if(argc != 2)
		usage();
	id = atoi(argv[1]);
	fs = nsmount("acme", nil);
	if(fs == nil){
		fprint(2, "nsmount: %r\n");
		goto okay;
	}
	snprint(buf, sizeof buf, "acme/%d/ctl", id);
	fid = fsopen(fs, buf, OREAD);
	if(fid == nil){
		fprint(2, "fsopen: %r\n");
		goto okay;
	}
	if((n=fsread(fid, buf, sizeof buf-1)) <= 0){
		fprint(2, "fsread: %r\n");
		goto okay;
	}
	buf[n] = 0;
	n = tokenize(buf, f, nelem(f));
	if(n < 8){
		fprint(2, "ctl line too short\n");
		goto okay;
	}
	tab = atoi(f[7]);
	if(tab == 0){
		fprint(2, "zero tab %s\n", f[7]);
		goto okay;
	}
	if((font = openfont(nil, f[6])) == nil){
		fprint(2, "openfont %s: %r\n", f[6]);
		goto okay;
	}
	n = stringwidth(font, "artist/123456");
	n += tab-1;
	n -= n%tab;

okay:
	while((p = Brdline(&bin, '\n')) != nil){
		p[Blinelen(&bin)-1] = 0;
		if(tab==0 || font==nil)
			goto pass;
		if(!isalpha(*p))
			goto pass;
		for(q=p; isalpha(*q); q++)
			;
		if(*q != '/')
			goto pass;
		q++;
		if(!isdigit(*q))
			goto pass;
		for(; isdigit(*q); q++)
			;
		if(!isspace(*q))
			goto pass;
		*q++ = 0;
		for(; isspace(*q); q++)
			;
		w = stringwidth(font, p);
		Bprint(&bout, "%s\t", p);
		w-=2;
		w += tab -1;
		w -= w%tab;
		w+=2;	
		while(w < n){
			Bprint(&bout, "\t");
			w += tab;
		}
		Bprint(&bout, "%s\n", q);
		continue;
	pass:
		Bprint(&bout, "%s\n", p);
	}
	Bflush(&bout);
	
	/* BUG - should be able to return here; look another day */
	threadexitsall(nil);
}


