#!/usr/bin/python
#
# build ship and module databases from https://github.com/EDCD/coriolis-data/
#

import base64
from collections import OrderedDict
import cPickle
import json

from config import config
import outfitting
import companion


if __name__ == "__main__":
    data = json.load(open('coriolis-data/dist/index.json'))

    # Map Coriolis's names to names displayed in the in-game shipyard
    coriolis_ship_map = {
        'Cobra Mk III' : 'Cobra MkIII',
        'Cobra Mk IV'  : 'Cobra MkIV',
        'Viper'        : 'Viper MkIII',
        'Viper Mk IV'  : 'Viper MkIV',
    }

    # Symbolic name from in-game name
    reverse_ship_map = {v: k for k, v in companion.ship_map.iteritems()}

    bulkheads = outfitting.armour_map.keys()

    ships = {}
    modules = {}

    # Ship and armour masses
    for m in data['Ships'].values():
        name = coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name']))
        assert name in reverse_ship_map, name
        ships[name] = { 'hullMass' : m['properties']['hullMass'] }
        for i in range(len(bulkheads)):
            modules['_'.join([reverse_ship_map[name], 'armour', bulkheads[i]])] = { 'mass': m['bulkheads'][i]['mass'] }

    ships = OrderedDict([(k,ships[k]) for k in sorted(ships)])	# sort for easier diffing
    cPickle.dump(ships, open('ships.p', 'wb'))

    # Module masses
    for cat in data['Modules'].values():
        for grp, mlist in cat.iteritems():
            for m in mlist:
                assert 'symbol' in m, m
                key = str(m['symbol'].lower())
                if grp == 'fsd':
                    modules[key] = {
                        'mass'      : m['mass'],
                        'optmass'   : m['optmass'],
                        'maxfuel'   : m['maxfuel'],
                        'fuelmul'   : m['fuelmul'],
                        'fuelpower' : m['fuelpower'],
                    }
                elif grp == 'gfsb':
                    modules[key] = {
                        'mass'      : m['mass'],
                        'jumpboost' : m['jumpboost'],
                    }
                else:
                    modules[key] = { 'mass': m.get('mass', 0) }	# Some modules don't have mass

    # 3.0 / 3.1 additions not yet present in coriolis-data
    for k in modules.keys():
        if k.startswith('int_hullreinforcement_'):
            modules['int_guardianhullreinforcement_' + k[22:]] = modules[k]
            modules['int_metaalloyhullreinforcement_' + k[22:]] = modules[k]
            modules['int_guardianmodulereinforcement_' + k[22:]] = modules[k]
    modules['hpt_causticmissile_fixed_medium'] = {'mass': 4}
    modules['hpt_flechettelauncher_fixed_medium'] = {'mass': 4}
    modules['hpt_flechettelauncher_turret_medium'] = {'mass': 4}
    modules['hpt_guardian_plasmalauncher_fixed_medium'] = {'mass': 4}
    modules['hpt_guardian_plasmalauncher_fixed_large'] = {'mass': 8}
    modules['hpt_guardian_plasmalauncher_turret_medium'] = {'mass': 4}
    modules['hpt_guardian_plasmalauncher_turret_large'] = {'mass': 8}
    modules['hpt_guardian_shardcannon_fixed_medium'] = {'mass': 4}
    modules['hpt_guardian_shardcannon_fixed_large'] = {'mass': 8}
    modules['hpt_guardian_shardcannon_turret_medium'] = {'mass': 4}
    modules['hpt_guardian_shardcannon_turret_large'] = {'mass': 8}
    modules['hpt_plasmashockcannon_fixed_medium'] = {'mass': 4}
    modules['hpt_plasmashockcannon_fixed_large'] = {'mass': 8}	# ???
    modules['hpt_plasmashockcannon_gimbal_medium'] = {'mass': 4}
    modules['hpt_plasmashockcannon_gimbal_large'] = {'mass': 8}	# ???
    modules['hpt_plasmashockcannon_turret_medium'] = {'mass': 4}
    modules['hpt_plasmashockcannon_turret_large'] = {'mass': 8}	# ???
    modules['int_dronecontrol_decontamination_size1_class1'] = {'mass': 1.3}
    modules['int_dronecontrol_decontamination_size3_class1'] = {'mass': 2}
    modules['int_dronecontrol_decontamination_size5_class1'] = {'mass': 20}
    modules['int_dronecontrol_decontamination_size7_class1'] = {'mass': 128}
    modules['int_dronecontrol_unkvesselresearch'] = {'mass': 1.3}

    modules = OrderedDict([(k,modules[k]) for k in sorted(modules)])	# sort for easier diffing
    cPickle.dump(modules, open('modules.p', 'wb'))