from collections import namedtuple
from typing import List

ModelInfo = namedtuple("ModelInfo", ["simple_name", "link", "description"])
model_info = {}

def register_model_info(
    full_names: List[str], simple_name: str, link: str, description: str
):
    info = ModelInfo(simple_name, link, description)

    for full_name in full_names:
        model_info[full_name] = info

def get_model_info(name: str) -> ModelInfo:
    if name in model_info:
        return model_info[name]
    else:
        # To fix this, please use `register_model_info` to register your model
        return ModelInfo(
            name, "", "Register the description at fastchat/model/model_registry.py"
        )

def get_model_description_md(model_list):
    model_description_md = """
| | | | | | | | | | | |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
"""
    ct = 0
    visited = set()
    for i, name in enumerate(model_list):
        model_source, model_name, model_type = name.split("_")
        minfo = get_model_info(model_name)
        if minfo.simple_name in visited:
            continue
        visited.add(minfo.simple_name)
        # one_model_md = f"[{minfo.simple_name}]({minfo.link}): {minfo.description}"
        one_model_md = f"{minfo.simple_name}"

        if ct % 11 == 0:
            model_description_md += "|"
        model_description_md += f" {one_model_md} |"
        if ct % 11 == 10:
            model_description_md += "\n"
        ct += 1
    return model_description_md

def get_video_model_description_md(model_list):
    model_description_md = """
| | | | | | |
| ---- | ---- | ---- | ---- | ---- | ---- |
"""
    ct = 0
    visited = set()
    for i, name in enumerate(model_list):
        model_source, model_name, model_type = name.split("_")
        minfo = get_model_info(model_name)
        if minfo.simple_name in visited:
            continue
        visited.add(minfo.simple_name)
        # one_model_md = f"[{minfo.simple_name}]({minfo.link}): {minfo.description}"
        one_model_md = f"{minfo.simple_name}"

        if ct % 7 == 0:
            model_description_md += "|"
        model_description_md += f" {one_model_md} |"
        if ct % 7 == 6:
            model_description_md += "\n"
        ct += 1
    return model_description_md