# Encoding: UTF-8
"""Reorganize Pokemon, PokemonForm, etc. to Species, Pokemon, etc.

This is an unmaintained one-shot script, only included in the repo for
reference.

"""

import csv
import os

from pokedex import defaults

number_of_species = 649
high_id_start = 10000

csv_dir = defaults.get_default_csv_dir()

def to_dict(filename):
    fullname = os.path.join(csv_dir, filename)
    reader = csv.reader(open(fullname))
    column_names = reader.next()
    entries = dict()
    for row in reader:
        row_dict = dict(zip(column_names, row))
        entries[row_dict.get('id', row_dict.get('pokemon_id'))] = row_dict
    return entries, column_names

pokemon, pokemon_columns = to_dict('pokemon.csv')
forms, form_columns = to_dict('pokemon_forms.csv')
form_groups, form_group_columns = to_dict('pokemon_form_groups.csv')
evolution_chains, evolution_chain_columns = to_dict('evolution_chains.csv')

result_columns = dict(
    species='''id identifier generation_id evolves_from_species_id
        evolution_chain_id color_id shape_id habitat_id
        growth_rate_id gender_rate capture_rate base_happiness is_baby
        hatch_counter has_gender_differences forms_switchable'''.split(),
    pokemon='''id species_id height weight base_experience order'''.split(),
    form='''id form_identifier pokemon_id introduced_in_version_group_id
        is_default is_battle_only order'''.split(),
    chain='''id baby_trigger_item_id'''.split(),
    )

def normalize_id(id):
    id = int(id)
    if id > number_of_species:
        id = id - high_id_start + number_of_species
    return id

def put(dct, entry):
    """Put entry in dct. If already there, check it's the same.
    """
    id = int(entry['id'])
    if id in dct:
        if entry == dct[id]:
            pass
        else:
            print entry
            print dct[id]
            assert False
    else:
        dct[id] = entry

forms_switchable = dict(
        castform=True,
        unown=False,
        darmanitan=True,
        basculin=False,
        rotom=True,
        shaymin=True,
        deerling=True,
        sawsbuck=True,
        arceus=True,
        pichu=False,
        giratina=True,
        burmy=True,
        wormadam=False,
        deoxys=True,
        genesect=True,
        meloetta=True,
        gastrodon=False,
        cherrim=True,
        shellos=False,
    )

result_species = dict()
result_pokemon = dict()
result_forms = dict()
result_chains = dict()

for form_id, source_form in forms.items():
    pokemon_id = source_form['unique_pokemon_id'] or source_form['form_base_pokemon_id']
    species_id = source_form['form_base_pokemon_id']
    source_pokemon = pokemon[pokemon_id]
    source_evolution_chain = evolution_chains[source_pokemon['evolution_chain_id']]
    try:
        source_group = form_groups[species_id]
    except KeyError:
        source_group = dict(is_battle_only=0)
    all_fields = dict(source_form)
    all_fields.update(source_group)
    all_fields.update(source_pokemon)
    all_fields.update(source_evolution_chain)
    del all_fields['id']
    new_species = dict()
    for column_name in result_columns['species']:
        if column_name == 'id':
            new_species[column_name] = normalize_id(species_id)
        elif column_name == 'evolves_from_species_id':
            new_species[column_name] = pokemon[species_id]['evolves_from_pokemon_id']
        elif column_name == 'shape_id':
            new_species[column_name] = all_fields['pokemon_shape_id']
        elif column_name == 'forms_switchable':
            if species_id in form_groups:
                new_species[column_name] = forms_switchable[source_pokemon['identifier']]
            else:
                new_species[column_name] = 0
        else:
            new_species[column_name] = all_fields[column_name]
    put(result_species, new_species)
    new_pokemon = dict()
    for column_name in result_columns['pokemon']:
        if column_name == 'id':
            new_pokemon[column_name] = normalize_id(pokemon_id)
        elif column_name == 'species_id':
            new_pokemon[column_name] = species_id
        else:
            new_pokemon[column_name] = all_fields[column_name]
    put(result_pokemon, new_pokemon)
    new_form = dict()
    for column_name in result_columns['form']:
        if column_name == 'id':
            new_form[column_name] = normalize_id(form_id)
        elif column_name == 'pokemon_id':
            new_form[column_name] = normalize_id(pokemon_id)
        elif column_name == 'form_identifier':
            new_form[column_name] = source_form['identifier']
        elif column_name == 'is_battle_only':
            if source_form['unique_pokemon_id'] == source_form['form_base_pokemon_id']:
                # Default form, herefore not battle-only
                new_form[column_name] = '0'
            else:
                # Keep
                new_form[column_name] = all_fields[column_name]
        else:
            new_form[column_name] = all_fields[column_name]
    put(result_forms, new_form)
    new_chain = dict(source_evolution_chain)
    del new_chain['growth_rate_id']
    put(result_chains, new_chain)

def write_csv(dct, fieldnames, filename):
    fullname = os.path.join(csv_dir, filename)
    reader = csv.DictWriter(open(fullname, 'w'), fieldnames)
    reader.writerow(dict((n,n) for n in fieldnames))
    for id, row in sorted(dct.items()):
        reader.writerow(row)

write_csv(result_species, result_columns['species'], 'pokemon_species.csv')
write_csv(result_pokemon, result_columns['pokemon'], 'pokemon.csv')
write_csv(result_forms, result_columns['form'], 'pokemon_forms.csv')
write_csv(result_chains, result_columns['chain'], 'evolution_chains.csv')