#!/usr/bin/python

import sys
import time

import mitsfs


def main():
    d = mitsfs.DexDB()
    c = d.getcursor()
    for member in sys.argv[1:]:
        (member_id,) = c.execute(
            'select member_id from member_name where member_name=%s',
            (member,))
        books = sorted([
            mitsfs.DexLine(mitsfs.Title(d, title_id), codes={shelfcode: 1})
            for (title_id, shelfcode) in
            c.execute(
                'select title_id, shelfcode'
                ' from'
                '  checkout'
                '  natural join checkout_member'
                '  natural join book'
                '  natural join shelfcode'
                ' where member_id=%s and checkin_stamp is null',
                (member_id,))])
        writedex(
            'checkouts.%s' % (member,),
            'Checkout out books to %s as of %s' % (
                member, time.strftime('%Y%m%d')),
            books)


def writedex(dexname, longname, books):
    fname = dexname + '.tex'
    print 'Writing', fname
    with open(fname, 'w') as fp:
        print >>fp, r'\def\dexname{%s}' % (dexname,)
        print >>fp, r'\def\Reverse{1}'
        print >>fp, r'\def\Shelf{1}'
        print >>fp, r'\def\Supple{%s}' % (longname,)
        print >>fp, r'\def\Period{3}'
        print >>fp, r'\input %s/dextex-current.tex' % (
            mitsfs.TEXBASE,)
        for line in books:
            code = r' {\bf %s}' % (line.codes.keys()[0],)
            count = line.codes.values()[0]
            print >>fp, r'\Book{%s}{%s}{%s}' % (
                mitsfs.texquote(line.authortxt),
                mitsfs.texquote(nicetitle(line)) + code,
                count)
        print >>fp, r'\vfill \eject \bye'


# should really be factored into DexLine
def nicetitle(line):
    series = [i.replace(',', r'\,') for i in line.series if i]
    # strip the sortbys
    titles = [('=' in i and i[:i.find('=')] or i) for i in line.titles]
    if series:
        if len(series) == len(titles):
            titles = ['%s [%s]' % i for i in zip(titles, series)]
        elif len(titles) == 1:
            titles = ['%s [%s]' % (titles[0], '|'.join(series))]
        elif len(series) == 1:
            titles = ['%s [%s]' % (i, series[0]) for i in titles]
        else:  # this is apparently Officially Weird
            print 'Wacky title/series match: ', str(line)
            ntitles = ['%s [%s]' % i for i in zip(titles, series)]
            if len(line.series) < len(titles):
                ntitles += titles[len(series):]
            titles = ntitles
    return '|'.join(titles)


if __name__ == '__main__':
    main()
