#!/usr/bin/env /usr/bin/python
import os
import string
import zipfile

basedir = '.'
outputpath = '../../addons.shtml'
MEGABYTE = 1024*1024


def ListMaps():
   files = [n[:-4] for n in os.listdir(basedir) if n.endswith('.map.png')]
   files.sort()
   return files

def PasteFile(output, path):
    output.write(file(path, 'r').read())
    
def FormatTitle(mapname):
    s = mapname[:-4].replace('_', ' ')
    s = s.title()
    return s

def FormatFileSize(size):
    abbreviations = ['B', 'K', 'M', 'G']
    divisor = 1
    for t in abbreviations:
        if size < 1024:
            return str(size) +  t
        size = size / 1024
    return 'unknown size'

def ParseSmp(smp):
    m = {}
    p = smp.split('PresentMap("')[1]
    m['description'], p = p.split('",', 1)
    p = [string.strip(i) for i in p.split(',')]
    m['players'] = p[0]
    m['size'] = p[1] + 'x' + p[2]
    return m
    
    
def ReadMap(mapname):
    m = {'title': FormatTitle(mapname), 'file': mapname}
    minimap = mapname+'.png'
    if not os.access(minimap, os.R_OK):
        minimap = 'unknown-minimap.png'
    m['minimap'] = minimap
    zipmapname = mapname + '.zip'
    tgzmapname = mapname + '.tgz'
    m['tgzsize'] = FormatFileSize(os.stat(tgzmapname).st_size)
    m['zipsize'] = FormatFileSize(os.stat(zipmapname).st_size)
    z = zipfile.ZipFile(zipmapname)
    smp = z.read(mapname + '/presentation.smp')
    m.update(ParseSmp(smp))
    return m
    

def GeneratePage(maps):
    output = file(outputpath, 'w')
    rawentry = file('addons-entry.tmpl').read()
    entry = string.Template(rawentry)
    
    PasteFile(output, 'addons-intro.tmpl')
    for map in maps:
        output.write(entry.safe_substitute(map))
    PasteFile(output, 'addons-footer.tmpl')

def main(argv):
   mapnames = ListMaps()
   for i in mapnames:
       print 'Generating ' + i
   maps = [ReadMap(i) for i in mapnames]
   GeneratePage(maps)
   

if __name__ == '__main__':
   import sys
   main(sys.argv)
   
