#!/usr/bin/python

import sys
import os
import os.path

basedir = os.path.join(os.path.pardir, os.path.pardir, "sc2")
contentdir = os.path.join (basedir, "content")
srcdir = os.path.join (basedir, "src")

class ResEntry(object):
	def __init__(self, line_num, constant, res_id, hfile, res_type, res_file):
		self.line_num = line_num
		self.hfile = hfile
		self.constant = constant
		self.res_id = res_id
		self.res_type = res_type
		self.res_file = res_file
	def csv_line(self):
		return "%s,%s,%s,%s,%s" % (self.constant,self.res_id, self.hfile,
				self.res_type, self.res_file)

def read_csv (fname="resources.csv"):
	result = []
	linenum = 0
	for line in file(fname):
		linenum += 1
		# We allow hash comments, but it's not wise to have them in the official
		# list, since it may interfere with CSV importers.
		if '#' in line:
			line = line[:line.index('#')]
		line = line.strip()
		if len(line) > 0:
			data = [x.strip() for x in line.split (',')]
			if len(data) == 5:
				result.append(ResEntry(linenum, *data))
			else:
				print>>sys.strderr, "Warning: Incorrect number of fields in line %d" % linenum
	return result

def get_headers(l):
	result = {}
	for res in l:
		result[res.hfile]=True
	names = result.keys()
	names.sort()
	return names
		
def rmp_text(vals):
	result = []
	in_index = [x for x in vals if x.res_file != "--"]
	in_index.sort(lambda x,y: cmp(x.res_id, y.res_id))
	for entry in in_index:
		if x.res_type != "--":
			result.append("%s = %s:%s" % (entry.res_id, entry.res_type, entry.res_file))
		else:
			print>>sys.stderr, "Warning: Resource ID %s (on line %d) has no associated type" % (entry.line_num, entry.res_id)
			result.append("%s = UNKNOWNRES:%s" % (entry.res_id, entry.res_file))
	return result		

def header_text(header, vals):
	result = ["/* This file was auto-generated by the gen_resfiles utility and",
		  "   should not be edited directly.  Modify the master resource list",
		  "   instead and regenerate. */",
		  ""]
	in_index = [x for x in vals if x.hfile == header]
	in_index.sort(lambda x,y: cmp(x.constant, y.constant))
	for entry in in_index:
		result.append("#define %s \"%s\"" % (entry.constant, entry.res_id))
	return result

def dump_values(data):
	keys = data.keys()
	keys.sort()
	for f in keys:
		print "Writing ",f
		outfile = file(f,"wt")
		for l in data[f]:
			print>>outfile, l
		outfile.close()

def collate_data(data):
	result = {}
	headers = get_headers(data)
	for header in headers:
		result[os.path.join(srcdir, *(header.split('/')))] = header_text(header, data)
	result[os.path.join(contentdir, 'uqm.rmp')] = rmp_text(data)
	return result

if __name__=="__main__":
	data = collate_data(read_csv())
	dump_values(data)
