# Export various CSV formats
# -*- coding: utf-8 -*-

from os.path import join
import hashlib
import codecs
import numbers
import time

from config import config

bracketmap = { 0: '',
               1: 'Low',
               2: 'Med',
               3: 'High', }

(COMMODITY_DEFAULT, COMMODITY_BPC, COMMODITY_CSV) = range(3)

def export(data, kind=COMMODITY_DEFAULT, filename=None):

    querytime = config.getint('querytime') or int(time.time())

    if not filename:
        filename = join(config.get('outdir'), '%s.%s.%s.%s' % (data['lastSystem']['name'].strip(), data['lastStarport']['name'].strip(), time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime(querytime)), kind==COMMODITY_BPC and 'bpc' or 'csv'))

    timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(querytime))
    if kind == COMMODITY_CSV:
        sep = ';'
        header = sep.join(['System','Station','Commodity','Sell','Buy','Demand','','Supply','','Date','\n'])
        rowheader = sep.join([data['lastSystem']['name'], data['lastStarport']['name']])
    elif kind == COMMODITY_BPC:
        sep = ';'
        header = sep.join(['userID', 'System','Station','Commodity','Sell','Buy','Demand','','Supply','','Date\n'])
        cmdr = data['commander']['name'].strip()
        rowheader = sep.join([(config.getint('anonymous') and hashlib.md5(cmdr.encode('utf-8')).hexdigest()) or (sep in cmdr and '"%s"' % cmdr) or cmdr, data['lastSystem']['name'], data['lastStarport']['name']])
    else:
        sep = ','
        header = sep.join(['System','Station','Commodity','Sell','Buy','Demand','','Supply','','Average','FDevID','Date\n'])
        rowheader = sep.join([data['lastSystem']['name'], data['lastStarport']['name']])

    h = open(filename, 'wt')	# codecs can't automatically handle line endings, so encode manually where required
    h.write(header)

    for commodity in data['lastStarport']['commodities']:
        line = sep.join([
            rowheader,
            commodity['name'],
            commodity['sellPrice'] and str(int(commodity['sellPrice'])) or '',
            commodity['buyPrice'] and str(int(commodity['buyPrice'])) or '',
            str(int(commodity['demand'])) if commodity['demandBracket'] else '',
            bracketmap[commodity['demandBracket']],
            str(int(commodity['stock'])) if commodity['stockBracket'] else '',
            bracketmap[commodity['stockBracket']]
        ])
        if kind==COMMODITY_DEFAULT:
            line = sep.join([line, str(int(commodity['meanPrice'])), str(commodity['id']), timestamp+'\n'])
        else:
            line = sep.join([line, timestamp, '\n'])
        h.write(line.encode('utf-8'))

    h.close()