import csv
import json
from collections import OrderedDict

MASTERS_JSON = 'masters.json'
MASTERS_KEY = 'masters'
MONSTERS_CSV = 'monsters.csv'
RESULT_SUFFIX = '_results'
NEW_COLUMN = 'id'
JOIN_INDEX = 0


def loop_over_masters():
    masters_file = open(MASTERS_JSON)
    data = json.load(masters_file)[MASTERS_KEY]
    masters_file.close()
    for (key, value) in data.items():
        current_master = str(value['name'].lower())
        write_results(current_master)
        generate_json(current_master)
    replace_masters()


def write_results(current_master):
    with open(MONSTERS_CSV, 'r') as monsters:
        master_indices = dict((r[1], i) for i, r in enumerate(csv.reader(monsters)))

    with open(current_master + '.csv', 'r') as master:
        with open(current_master + RESULT_SUFFIX + '.csv', 'w') as results:
            reader = csv.reader(master)
            writer = csv.writer(results)

            # New column with old header
            writer.writerow([NEW_COLUMN] + next(reader, []))

            for row in reader:
                # row is found in slayer master AND monsters
                index = master_indices.get(row[JOIN_INDEX])

                if index is not None:
                    # Row with value for id and slayer_weight:
                    # 0,12\n
                    writer.writerow([index - 1] + row)


def generate_json(file_name):
    data = []

    with open(file_name + RESULT_SUFFIX + '.csv', 'r') as csv_file:
        csv_reader = csv.DictReader(csv_file)

        for rows in csv_reader:
            id = rows['id']
            data.append(rows)

    with open(file_name + RESULT_SUFFIX + '.json', 'w') as json_file:
        json_file.write(json.dumps(data, indent=4))

    return json_file


def replace_masters():
    masters_file = open(MASTERS_JSON)
    master_data = json.load(masters_file)[MASTERS_KEY]
    masters_file.close()
    for item in master_data.items():
        cur_master_file = open(item[1]['name'].lower()+'_results.json')
        cur_data = json.load(cur_master_file)
        cur_master_file.close()
        item[1]['assignments'] = cur_data

    with open(MASTERS_JSON + '_new' + '.json', 'w') as json_file:
        json_file.write(json.dumps(master_data, indent=4))


if __name__ == "__main__":
    loop_over_masters()