#!/usr/bin/python
'''Print a shelfdex.  At the moment, misnamed, because it just prints hassledexen.'''
__version__='$Rev$'

import sys, os, optparse

import mitsfs

texbase = mitsfs.texbase
#texbase = '.'

parser = optparse.OptionParser(usage='usage: %prog [--datadex file] [shelfcode ...]',
                               version='%prog '+'$Id$')
parser.add_option('-d', '--datadex', dest='dexfile',
                  help='datadex file to load (default %default)', default=mitsfs.datadex_file)
options, args = parser.parse_args()

boxdex = mitsfs.boxDex()

dex = mitsfs.dex(options.dexfile)

if os.getcwd() == mitsfs.dexbase:
    print 'Preemptively changing directory to /tmp; look for your shelfdexen there.'
    os.chdir('/tmp')

for code in args:
    code = code.upper()
    if code in boxdex.boxcodes():
        box = boxdex.boxcode(code)
        desc = box.desc
        codeset = boxdex.box_shelfcodes(code)
    elif code in boxdex.shelfcodes():
        box = boxdex.shelfcode(code)
        desc = box.desc
        fromcode = box.fromcode
        codeset = set([code])
    elif code in mitsfs.codes:
        desc = mitsfs.codes[code].name
        box = None
        codeset = set([code])
    else:
        print 'Unknown or unknowable shelfcode:',code
        continue
    hassledex =  code.startswith('HASSLE/')
    basename = 'shelfdex-' + code.replace('/', '_')
    filename = basename + '.tex'
    print 'writing',filename
    fp = open(filename, 'w')
    if box and not hassledex:
        #fp.write(mitsfs.dexheader('exodex', desc+' (%s)' % code))
        fp.write(r'''\def\dexname{%(shortname)s}
\def\Supple{%(longname)s}
\def\Shelf{3}
\def\Reverse{3}
\def\Period{3}
\def\Box{3}
\input %(texheader)s

''' % { 'shortname': 'Boxdex',
        'texheader': os.path.join(texbase, 'dextex-current.tex'),
        'longname': mitsfs.texquote(desc + ' (%s)' % code) })
    elif hassledex:
        #fp.write(mitsfs.dexheader('exodex', desc+' (%s)' % code))
        fp.write('''\\def\\dexname{%(shortname)s}
\\def\\Supple{%(longname)s}
\\def\\Shelf{3}
\\def\\Reverse{3}
\\def\\Period{3}
\\input %(texheader)s

''' % { 'shortname': 'Hassledex',
        'texheader': os.path.join(texbase, 'dextex-exodus.tex'),
        'longname': mitsfs.texquote(desc + ' (%s)' % code) })
    else:
        fp.write('''\\def\\dexname{%(shortname)s}
\\def\\Shelf{3}
\\def\\Reverse{}
\\def\\Period{3}
\\input %(texheader)s

''' % { 'shortname': 'Shelfdex: '+code,
        'texheader': os.path.join(texbase, 'dextex-current.tex')})

    iterator = (book for book in dex if any(code for code in book.codes if code in codeset))
    for book in iterator:
        has = sum(book.codes[code] for code in book.codes if code in codeset)
        if not hassledex:
            keep = 0
        else:
            keep = book.codes[fromcode]
        if not hassledex:
            fp.write('\\Book{%s}{%s}{%s}\n' % (mitsfs.texquote(book.authortxt),
                                                   mitsfs.texquote(book.titletxt),
                                                   has))
        else:
            fp.write('\\Book{%s}{%s}{%s}{%s}\n' % (mitsfs.texquote(book.authortxt),
                                                   mitsfs.texquote(book.titletxt),
                                                   keep, has))
    fp.write(mitsfs.dexfooter())
    fp.close()
    ret = os.system('tex %s' % filename)
