#!/usr/bin/env python

import os,tempfile

tdir = tempfile.mkdtemp()
tpath = os.path.join(tdir,'table.tex')
tfile = file(tpath,'w')


tfile.write('\\documentclass{amsart}\n')
tfile.write('\\usepackage[landscape,margin=.75in,letterpaper]{geometry}\n')

# table macros
tfile.write(r'''
\DeclareMathOperator{\ord}{ord}
\newcommand{\p}{\varphi}
\makeatletter
\font\BIG=cmbx12 scaled \magstep1
%
\def\gap#1{\omit&height #1pt &&&&&&&&&&&&&&&&&&&&&&&\cr}
\def\topline{\noalign{\hrule}\gap2}
\def\hline{\gap2\noalign{\hrule}\gap2}
\def\smallhline{\gap1\noalign{\hrule}\gap1}
\def\botline{\gap2\noalign{\hrule}}
\def\dashfill{\xleaders\hbox{\ -}\hfill}
\def\classgap{\omit&&\multispan{22}\dashfill&\cr}
%
\def\headings{
&&&&a_1&a_2&a_3&a_4&a_6&&r&&%
\text{T}&&s&\ord(\Delta)&&\ord_-(j)&&%
c_p&&Kodaira&&\hfill\text{Isogenies}\hfill&\cr
}
%
\def\tablebody{}
%
\def\fillornot{}
\def\tablepage{\vbox to \vsize{
\offinterlineskip 
\halign  to \hsize%
{\tabskip 0pt
##\strut&\vrule##\tabskip 5pt plus 2pt minus 4pt &
##\hfil&\vrule##&
\hfil$##$&\hfil$##$&\hfil$##$\tabskip 5pt plus 1fil minus 4pt  &
\hfil$##$&\hfil$##$&\vrule##\tabskip 5pt plus 2pt minus 4pt  &
\hfil$##$\hfil&\vrule##&
\hfil$##$\hfil&\vrule##&
\hfil$##$\hfil&
\hfil$##$\hfil&\vrule##&
\hfil$##$\hfil&\vrule##&
\hfil$##$\hfil&\vrule##&
\hfil##\hfil&\vrule##&
$##$\hfil&\vrule##\tabskip0pt\cr
%
\topline
\headings 
\botline
\tablebody
}                 % end of \halign
\fillornot
}                 % end of \vbox
\eject}     % end of \def\tablepage

\def\newlevel#1#2#3#4{     
              \noalign{\vss}
              \noalign{\vrule height15pt depth 4pt width0pt
                       {\BIG #1}\hfill$N=#1=#2=#3$ \quad (#4)
                       \hfill{\BIG #1}}
              \topline 
                   }
\def\morelevel#1#2#3{\newlevel{#1}{#2}{#3}{continued}}
\def\endlevel{\botline}
\makeatother
''')

tfile.write('\\begin{document}\n')

f = open('isomorphism_classes.txt')

def phiformat(s):
    if 'a' not in s:
        return s
    else:
        a,b = s.split('a')
        b = b.strip('+')
        a = a.strip('*')+'\\p'
        if b and a[0] != '-':
            a = '+'+a
        return b+a

def idformat(I):
    if ',' in I:
        t = I.split(',')
        return t[0]+','+phiformat(t[1][:-1])+')'
    return I

def kodformat(s):
    hstar = '*' in s
    s = s.replace('*','')
    n = s.replace('I','').replace('V','')
    r = s.replace(n,'')
    if hstar and n:
        return r + '$^*_{%s}$'%n
    elif n:
        return r + '$_{%s}$'%n
    elif hstar:
        return r + '$^*$'
    else:
        return r

def write_level(cur_num_curves, L):
    # need to include factorings for second argument
    level_str = '\\newlevel{%s}{%s}{%s}'%(level, n, fact)
    if len(L) > 1:
        level_str += '{%s isogeny classes}\n'%len(L)
    else:
        level_str += '{1 isogeny class}\n'
    for i,T in enumerate(L):
        s,size = T
        if i:
            size += .333333333333333333333333333333
        else:
            size += 1.666666666666666666666666666666
        if cur_num_curves + size > 40:
            if i:
                tfile.write('\\endlevel')
            tfile.write('}\n')
            tfile.write('\\tablepage\n')
            tfile.write('\\def\\tablebody{\n')
            if i:
                # need to include factorings for second argument
                tfile.write('\\morelevel{%s}{%s}{%s}\n'%(level, n, fact))
            else:
                tfile.write(level_str)
            cur_num_curves = size+(1.33333333333333333333333333 if i else 0)
        else:
            cur_num_curves += size
            if i:
                tfile.write('\\classgap\n')
            else:
                tfile.write(level_str)
        tfile.write(s)
    tfile.write('\\endlevel\n')
    return cur_num_curves

s = ''
level = '31a'
iso_size = 0
cur_num_curves = 0
L = []
tfile.write('\\def\\tablebody{\n')
for l in f:
    if l.strip().startswith('#'):
        continue
    elif l[0] == ' ':
        iso_size += 1
        l = l.strip().split(' ')
        # add label
        s += '&&'
        s += iso
        s += l[0]
        # add eqn
        s += '&&'
        eqn = l[1][1:][:-1].split(',')
        s += '&'.join([phiformat(a) for a in eqn])
        # add rank
        s += '&&'
        s += r
        # add torsion
        s += '&&'
        if l[2] == 'Trivialgroup':
            s += '1'
        elif '+' in l[2]:
            s += '2+'+l[2][6]
        else:
            s += l[2][2]
        # add discriminant
        s += '&&'
        s += l[3][0]+'\\ '+l[3][2]
        s += '&'
        s += l[4]
        # add denominator of j invariant
        s += '&&'
        s += l[5]
        # add tamagawa numbers
        s += '&&'
        s += l[6]
        # add kodaira symbols
        s += '&&'
        s += ','.join([kodformat(sym) for sym in l[7].split(',')])
        # add isogenies
        s += '&&'
        if l[8][0] != '0':
            s += ';'.join(['\\textbf{'+pr.split(':')[0]+'}:'+pr.split(':')[1] for pr in l[8].split(';')])
        # end row
        s += '&\\cr\n'
    else:
        l = l.strip().split(' ')
        if s:
            L.append((s,iso_size))
        if ''.join(l[:2]) != level:
            cur_num_curves = write_level(cur_num_curves, L)
            L = []
        s = ''
        iso_size = 0
        level = ''.join(l[:2])
        iso = l[2]
        n = idformat(l[3])
        fact = l[4].split('*')
        for i,p in enumerate(fact):
            if '^' in p:
                p = p.split('^')
                exp = '^{'+p[1]+'}'
                p = p[0]
            else:
                exp = ''
            fact[i] = idformat(p)+exp
        fact = ' '.join(fact)
        r = l[5]
if s:
    L.append((s,iso_size))
cur_num_curves = write_level(cur_num_curves, L)
tfile.write('}\n')
tfile.write('\\tablepage\n')

tfile.write('\\end{document}')

tfile.close()
os.system('pdflatex -output-directory '+tdir+' '+tpath)
os.system('mv '+os.path.join(tdir,'table.pdf')+' table.pdf')
os.system('rm -r '+tdir)
