"""
Author:  PH01L
Email:   phoil@osrsbox.com
Website: https://www.osrsbox.com

Description:
Script to update JSON files.

Copyright (c) 2019, PH01L

###############################################################################
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
###############################################################################
"""
import json
import collections
import os
from pathlib import Path
import argparse

import config
from osrsbox import items_api
from osrsbox import monsters_api
from osrsbox import prayers_api


def generate_items_complete():
    """Generate the `docs/items-complete.json` file."""
    # Read in the item database content
    path_to_items_json = Path(config.DOCS_PATH / "items-json")
    all_db_items = items_api.all_items.AllItems(path_to_items_json)

    items = {}

    for item in all_db_items:
        json_out = item.construct_json()
        items[item.id] = json_out

    # Save all items to docs/items_complete.json
    out_fi = Path(config.DOCS_PATH / "items-complete.json")
    with open(out_fi, "w") as f:
        json.dump(items, f)

    # Save all items to osrsbox/docs/items_complete.json
    out_fi = Path(config.PACKAGE_PATH / "docs" / "items-complete.json")
    with open(out_fi, "w") as f:
        json.dump(items, f)


def generate_item_slot_files():
    """Generate the `docs/items-slot/` JSON files."""
    # Read in the item database content
    all_db_items = items_api.load()

    items = collections.defaultdict(list)

    # Fetch every equipable item with an item slot value
    for item in all_db_items:
        if item.equipable_by_player:
            items[item.equipment.slot].append(item)

    # Process each item found, and add to an individual file for each equipment slot
    for slot in items:
        json_out = {}
        for item in items[slot]:
            json_out_temp = item.construct_json()
            json_out[item.id] = json_out_temp
        out_fi = Path(config.DOCS_PATH / "items-json-slot" / f"items-{slot}.json")
        os.makedirs(os.path.dirname(out_fi), exist_ok=True)
        with open(out_fi, "w") as f:
            json.dump(json_out, f)


def generate_monsters_complete():
    """Generate the `docs/monsters-complete.json` file."""
    # Read in the monster database content
    path_to_monsters_json = Path(config.DOCS_PATH / "monsters-json")
    all_db_monsters = monsters_api.all_monsters.AllMonsters(path_to_monsters_json)

    monsters = {}

    for monster in all_db_monsters:
        json_out = monster.construct_json()
        monsters[monster.id] = json_out

    # Save all monsters to docs/monsters-complete.json
    out_fi = Path(config.DOCS_PATH / "monsters-complete.json")
    with open(out_fi, "w") as f:
        json.dump(monsters, f)

    # Save all monsters to osrsbox/docs/monsters-complete.json
    out_fi = Path(config.PACKAGE_PATH / "docs" / "monsters-complete.json")
    with open(out_fi, "w") as f:
        json.dump(monsters, f)


def generate_prayers_complete():
    """Generate the `docs/prayers-complete.json` file."""
    # Read in the item database content
    path_to_prayers_json = Path(config.DOCS_PATH / "prayers-json")
    all_db_prayers = prayers_api.all_prayers.AllPrayers(path_to_prayers_json)

    prayers = {}

    for prayer in all_db_prayers:
        json_out = prayer.construct_json()
        prayers[prayer.id] = json_out

    # Save all prayers to docs/prayers-complete.json
    out_fi = Path(config.DOCS_PATH / "prayers-complete.json")
    with open(out_fi, "w") as f:
        json.dump(prayers, f)

    # Save all prayers to osrsbox/docs/prayers-complete.json
    out_fi = Path(config.PACKAGE_PATH / "docs" / "prayers-complete.json")
    with open(out_fi, "w") as f:
        json.dump(prayers, f)


def generate_items_search_file():
    """Generate the `docs/items-search.json` file."""
    # Read in the item database content
    path_to_items_json = Path(config.DOCS_PATH / "items-json")
    all_db_items = items_api.all_items.AllItems(path_to_items_json)

    items_search = {}

    for item in all_db_items:
        # Make a temporary dictionary for each item
        temp_dict = dict()

        # Add id, name, type and duplicate status
        temp_dict["id"] = item.id
        temp_dict["name"] = item.name
        temp_dict["type"] = None
        if item.noted:
            temp_dict["type"] = "noted"
        elif item.placeholder:
            temp_dict["type"] = "placeholder"
        else:
            temp_dict["type"] = "normal"
        temp_dict["duplicate"] = item.duplicate

        # Add temp_dict to all items
        items_search[item.id] = temp_dict

    # Save search file to docs/items_complete.json
    out_fi = Path(config.DOCS_PATH / "items-search.json")
    with open(out_fi, "w") as f:
        json.dump(items_search, f, indent=4)


def main(args):
    """The main function for generating the static JSON files."""
    if args.items:
        print("Generating items-complete.json file...")
        generate_items_complete()
        print("Generating items-json-slot JSON files...")
        generate_item_slot_files()
        print("Generating items-search.json file...")
        generate_items_search_file()
    if args.monsters:
        print("Generating monsters-complete.json file...")
        generate_monsters_complete()
    if args.prayers:
        print("Generating prayers-complete.json file...")
        generate_prayers_complete()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--monsters',
                        default=False,
                        required=False,
                        help='A boolean of whether to generate monsters.')
    parser.add_argument('--items',
                        default=False,
                        required=False,
                        help='A boolean of whether to generate items.')
    parser.add_argument('--prayers',
                        default=False,
                        required=False,
                        help='A boolean of whether to generate prayers.')
    args = parser.parse_args()
    main(args)
