import glob
import json
import pathlib


def get_seed_locale_names() -> set[str]:
    """Find all locales in the seed/resources/ folder

    Returns:
        A set of every file name where there's both a seed label and seed food file
    """

    LABELS_PATH = "/workspaces/mealie/mealie/repos/seed/resources/labels/locales/"
    FOODS_PATH = "/workspaces/mealie/mealie/repos/seed/resources/foods/locales/"
    label_locales = glob.glob("*.json", root_dir=LABELS_PATH)
    foods_locales = glob.glob("*.json", root_dir=FOODS_PATH)

    # ensure that a locale has both a label and a food seed file
    return set(label_locales).intersection(foods_locales)


def get_labels_from_file(locale: str) -> list[str]:
    """Query a locale to get all of the labels so that they can be added to the new foods seed format

    Returns:
        All of the labels found within the seed file for a given locale
    """

    locale_path = pathlib.Path("/workspaces/mealie/mealie/repos/seed/resources/labels/locales/" + locale)
    label_names = [label["name"] for label in json.loads(locale_path.read_text(encoding="utf-8"))]
    return label_names


def transform_foods(locale: str):
    """
    Convert the current food seed file for a locale into a new format which maps each food to a label

    Existing format of foods seed file is a dictionary where each key is a food name and the values are a dictionary
        of attributes such as name and plural_name

    New format maps each food to a label. The top-level dictionary has each key as a label e.g. "Fruits".
        Each label key as a value that is a dictionary with an element called "foods"
        "Foods" is a dictionary of each food for that label, with a key of the english food name e.g. "baking-soda"
        and a value of attributes, including the translated name of the item e.g. "bicarbonate of soda" for en-GB.
    """

    locale_path = pathlib.Path("/workspaces/mealie/mealie/repos/seed/resources/foods/locales/" + locale)

    with open(locale_path, encoding="utf-8") as infile:
        data = json.load(infile)

    first_value = next(iter(data.values()))
    if isinstance(first_value, dict) and "foods" in first_value:
        # Locale is already in the new format, skipping transformation
        return

    transformed_data = {"": {"foods": dict(data.items())}}

    # Seeding for labels now pulls from the foods file and parses the labels from there (as top-level keys),
    #   thus we need to add all of the existing labels to the new food seed file and give them an empty foods dictionary
    label_names = get_labels_from_file(locale)
    for label in label_names:
        transformed_data[label] = {"foods": {}}

    with open(locale_path, "w", encoding="utf-8") as outfile:
        json.dump(transformed_data, outfile, indent=4, ensure_ascii=False)


def main():
    for locale in get_seed_locale_names():
        transform_foods(locale)


if __name__ == "__main__":
    main()
