#!/usr/bin/env python3

import configparser
import subprocess
from itertools import groupby
from operator import itemgetter


def read_gitmodules(file_path):
    config = configparser.ConfigParser(allow_no_value=True, delimiters=("=", ":"))
    config.read(file_path)
    modules = []
    for section in config.sections():
        path = config[section].get("path", "Not found")
        url = config[section].get("url", "Not found")
        submodule_info = {"path": path, "url": url}
        if path not in ["odoo", "enterprise", "themes"]:
            modules.append(submodule_info)
    return modules


# Settings
versions = ["13.0", "14.0", "15.0", "16.0", "17.0", "18.0"]
output_file = "modules.md"

# Define dictionary for module data
module_info = {}

# Iterate over each branch
for version in versions:

    # Switch to the version
    subprocess.run(["./task", "checkout", version])

    # Pull all submodules
    subprocess.run(["./task", "sync-git-folder"])

    # Get all submodules
    submodules = read_gitmodules(".gitmodules")

    # Iterate over each submodule
    for submodule in submodules:

        if submodule["url"].startswith("git@"):
            org = submodule["url"].split(":")[1].split("/")[0]
            repo = (
                submodule["url"].split(":")[1].split("/")[1].replace(".git", "").lower()
            )
        elif submodule["url"].startswith("https://"):
            org = submodule["url"].replace("https://github.com/", "").split("/")[0]
            repo = (
                submodule["url"]
                .replace("https://github.com/", "")
                .split("/")[1]
                .replace(".git", "")
                .lower()
            )

        if org == "mint-system":
            org = "Mint-System"
        if repo.startswith("odoo-apps-"):
            repo = repo.replace("odoo-apps-", "")

        path = submodule["path"]

        if not org:
            raise ValueError(f"Org not found in {submodule['url']}")

        # Get list of modules
        try:
            result = subprocess.run(
                ["git", "-C", path, "ls-tree", "--name-only", "-d", version],
                capture_output=True,
                text=True,
                check=True,
            )
            modules = result.stdout.split("\n")
        except subprocess.CalledProcessError as e:
            print(f"Error executing command: {e}")
            print(f"Return code: {e.returncode}")
            print(f"stderr: {e.stderr}")
            modules = []

        # Cleanup list
        modules = list(filter(None, modules))
        modules = list(filter(lambda x: x not in ["setup", ".github"], modules))

        # Add module data to the dictionary
        for module in modules:
            module_key = f"{org}|{repo}|{module}"

            if org == "Mint-System":
                url = f"https://github.com/{org}/odoo-apps-{repo}"
            else:
                url = f"https://github.com/{org}/{repo}"
            branch_link = f" [{version}]({url}/tree/{version}/{module})"

            if module_key in module_info:
                module_info[module_key] += branch_link
            else:
                module_info[module_key] = branch_link


# Sort module data by key
module_info = dict(sorted(module_info.items()))

# Process module data
module_data = []
for key, value in module_info.items():
    org, repo, name = key.split("|")
    module_data.append({"org": org, "repo": repo, "name": name, "link": value})

with open(output_file, "w") as f:
    f.write("# Modules\n\n")
    f.write(
        "This page shows all the modules managed with Odoo Build grouped by organization and repository.\n\n"
    )

    for org, repos in groupby(module_data, key=itemgetter("org")):
        f.write(f"## {org}\n\n")

        for repo, modules in groupby(repos, key=itemgetter("repo")):
            f.write(f"### {repo}\n\n")
            f.write(" | name | links |\n")
            f.write("|---|---|\n")

            for module in modules:
                f.write(f"| {module['name']} |{module['link']} |\n")
            f.write("\n")

print(f"Markdown table created in {output_file}")
