import glob
import re
from dataclasses import dataclass
from typing import Dict

CLEANR = re.compile("<[^<]+?>")
tooltip_files = glob.glob("documentation/docs/tooltips/**/*.mdx", recursive=True)


def read_tooltip_file(path: str) -> str:
    """
    Reads all lines of a text file.

    Args:
        filename: path to the file

    Returns:
        str: the text of the file
    """

    with open(path) as f:
        lines = f.readlines()
    return "".join(lines)


def cleanhtml(raw_html: str) -> str:
    """
    Removes html tags from a string.

    Args:
        raw_html: the string to clean

    Returns:
        str: the cleaned string
    """

    cleantext = re.sub(CLEANR, "", raw_html)
    return cleantext


def clean_docusaurus_tags(text: str) -> str:
    """
    Removes docusaurus tags from a string.

    Args:
        text: the string to clean

    Returns:
        str: the cleaned string
    """

    text = text.replace(":::info note", "")
    text = text.replace(":::info Note", "")
    text = text.replace(":::tip tip", "")
    text = text.replace(":::", "")
    return text


def clean_md_links(text: str) -> str:
    """
    Removes markdown links from a string.

    Args:
        text: the string to clean

    Returns:
        str: the cleaned string
    """

    text = re.sub(r"\[(.*?)\]\(.*?\)", r"\1", text)
    return text


@dataclass
class Tooltip:
    """
    A tooltip.

    Returns:
        str: the text of the tooltip
    """

    name: str
    text: str

    def __repr__(self):
        return f"{self.name}: {self.text}"


class Tooltips:
    """
    A collection of tooltips.

    During initialization, all tooltips are read from the tooltip files.

    Usage:
        tooltips = Tooltips()
        a tooltip can be accessed by its name:
        tooltips["name"] returns the tooltip with the name "name"
    """

    def __init__(self):
        self.tooltips: Dict[str, Tooltip] = {}
        for filename in tooltip_files:
            name = filename.split("/")[-1].split(".")[0]
            name = name.replace("-", "_")
            name = name[1:]  # remove leading underscore
            section = filename.split("/")[3]
            text = read_tooltip_file(filename)
            text = cleanhtml(text)
            text = clean_docusaurus_tags(text)
            text = clean_md_links(text)
            if name in self.tooltips.keys():
                raise ValueError
            self.add_tooltip(Tooltip(f"{section}_{name}", text))

    def add_tooltip(self, tooltip):
        self.tooltips[tooltip.name] = tooltip

    def __getitem__(self, name: str) -> str:
        try:
            text = self.tooltips[name].text
        except KeyError:
            text = None
        return text

    def __len__(self):
        return len(self.tooltips)

    def __repr__(self):
        return f"{self.tooltips}"

    def get(self, name: str, default=None):
        if name in self.tooltips.keys():
            return self.tooltips[name].text
        else:
            return default


tooltips = Tooltips()