#!/usr/bin/env python

import os
import mitsfs

root = os.getcwd()
mitsfsp = os.environ.get('MITSFS', '/afs/athena.mit.edu/activity/m/mitsfs')
dexcode = os.path.join(mitsfsp, 'dexcode/dexcode')
style_file = os.path.join(dexcode, 'dextex-exodus.tex')
datadex_path = root+'/visdex'
hassledex = os.path.join(root, 'hassledex')
hassledex_template = root+'/hassledex-%s.tex'
tex_header = """\\def\\dexname{Exodex}
\\def\\Supple{Mass Exodus}
\\def\\Shelf{3}
\\def\\Reverse{3}
\\def\\Period{3}
\\input %s

""" % style_file
tex_footer = '\n\\bye\n'
## circulating_codes = ["H", "HA", "C/P", "C/PA",
##                      "C/REF-H", "C/REF-P"]
#circulating_codes = ['H', 'C/P']
circulating_codes = ['C/PA', 'HA']
code_files = {}
#enough = 2
enough = 1
dexfp = None

def hassle(codes):
    '''Given a mitsfs.shelfcodes object, pull out the circulating shelfcodes
    and return (codes to keep, codes to reject)'''
    # pare out the circulating codes
    codes = mitsfs.shelfcodes((code, count) for (code, count) in codes.items() if code in circulating_codes)
    if sum(codes.values) <= enough:
        return codes, mitsfs.shelfcodes()
    keep = mitsfs.shelfcodes()
    count = 0
    codelist = codes.keys()
    while count < enough:
        code = codelist[0]
        codelist = codelist[1:] + codelist[:1]
        if codes[code] > 0:
            codes[code] -= 1
            keep[code] += 1
        count += 1
    return keep, codes
    

def escape(s):
    """TeX-escape s.   FIXME"""
    s = s.replace('&', '\&')
    s = s.replace('#', '\#')
    return s

def write_book(line, code, keep, reject):
    """Write out a book to a file hassledex-$code.tex."""
    author = escape(line.authortxt)
    title = escape(line.titletxt)
    series = escape(line.seriestxt)
    s = "\\Book{%s}{%s}{%s}{%s}\n" % (author, title, keep, reject)
    f = code_files[code]
    f.write(s)

def open_code_files():
    """Fill in the code_files global as a map from shelf codes to fresh hassledexes for that code."""
    global code_files
    for code in circulating_codes:
        fcode = code.replace('/','_')
        f = open(hassledex_template % fcode, 'w')
        f.write(tex_header)
        code_files[code] = f

def close_code_files():
    """Clean up the hassledex-$code.tex files, appending \\bye to each and closing them."""
    for f in code_files.values():
        f.write(tex_footer)
        f.close()

if __name__=='__main__':
    datadex = mitsfs.dex(datadex_path)
    open_code_files()
    dexfp = open(hassledex, 'w')
    total_reject = 0
    total_keep = 0
    for line in datadex:
        keep, reject = hassle(line.codes)
        if sum(reject.values()):
            print >>dexfp, dexline(line, codes = reject)
        for code in reject:
            write_book(line, code, keep[code], reject[code])
        total_reject += sum(reject)
        total_keep += sum(keep)
    close_code_files()
    dexfp.close()
    print "Hassled %i books, keeping %i." % (total_reject, total_keep)
