import yaml
import re
from pathlib import Path

CONFIG_FILE = "config.yaml"

def load_yaml(file_path):
    with open(file_path, "r", encoding="utf-8") as f:
        return yaml.safe_load(f)

def get_nested_value(data, path, default="-"):
    """Достаёт значение по пути вида 'some.properties.fieldA' или 'owners.0.name'."""
    keys = path.split(".")
    current = data
    try:
        for key in keys:
            if isinstance(current, list) and key.isdigit():
                current = current[int(key)]
            elif isinstance(current, dict):
                current = current.get(key, default)
            else:
                return default
        if isinstance(current, list):
            return ", ".join(map(str, current))
        return str(current)
    except Exception:
        return default

def build_table(contracts, tags, columns):
    filtered = []
    for contract_id, contract in contracts.get("paths", {}).items():
        if any(tag in contract.get("tags", []) for tag in tags):
            contract["id"] = contract_id 
            filtered.append(contract)

    if not filtered:
        return f"*Нет контрактов с тегами {', '.join(tags)}*"

    headers = [col["header"] for col in columns]
    table_lines = ["| " + " | ".join(headers) + " |"]
    table_lines.append("|" + "|".join(["------"] * len(columns)) + "|")

    for c in filtered:
        row = []
        for col in columns:
            value = get_nested_value(c, col["field"])
            row.append(value)
        table_lines.append("| " + " | ".join(row) + " |")

    return "\n".join(table_lines)

def insert_table(md_content, table, section):
    pattern = rf"({re.escape(section)}\s*\n)"
    return re.sub(pattern, r"\1" + table + "\n\n", md_content, count=1)

def main():
    config = load_yaml(CONFIG_FILE)

    for mapping in config.get("mappings", []):
        tags = mapping.get("tags") or [mapping["tag"]]
        columns = mapping.get("columns", [])
        section = mapping.get("section", "### Title")
        input_md = Path(mapping["input_md"])
        output_md = Path(mapping["output_md"])
        yaml_file = Path(mapping["yaml_file"])
        contracts = load_yaml(yaml_file)
        table = build_table(contracts, tags, columns)
        md_content = input_md.read_text(encoding="utf-8")
        updated_md = insert_table(md_content, table, section)
        output_md.write_text(updated_md, encoding="utf-8")
        print(f"[+] Сгенерирован файл: {output_md} (tags={tags}, section={section})")

if __name__ == "__main__":
    main()
