#!/usr/bin/env python3
"""Aria-Brain Frontmatter-Validator.

Pruet ob eine Markdown-Note die Aria-Vault-Konvention erfuellt
(siehe /root/aria/brain/CLAUDE.md Abschnitt 1):

- YAML-Frontmatter zwischen ---/--- am Anfang
- Pflichtfelder: title, type, date, status
- type aus erlaubter Enum
- date als ISO-Format (YYYY-MM-DD)
- status aus erlaubter Enum

Usage:
    markdown_frontmatter.py --input /root/aria/brain/02-Wissen/foo.md
    cat foo.md | markdown_frontmatter.py --input -

Exit-Codes: 0 pass, 2 fail, 3 missing-deps.
"""
import argparse
import re
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent))
from _lib import emit_report, read_input

REQUIRED = ["title", "type", "date", "status"]
TYPE_ENUM = {
    "project", "reference", "research", "daily", "identity",
    "system", "learnings", "template", "inbox", "audit", "schema",
    "moc",
}
STATUS_ENUM = {"aktiv", "archiv", "draft", "done"}
DATE_RE = re.compile(r"^\d{4}-\d{2}-\d{2}$")


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("--input", default="-")
    ap.add_argument("--allow-missing-recommended", action="store_true",
                    help="Skip warnings for tags/related (recommended but not required)")
    args = ap.parse_args()

    try:
        import yaml
    except ImportError:
        return emit_report("markdown_frontmatter", False,
                           ["pyyaml nicht installiert: pip install pyyaml"]) or 3

    content = read_input(args.input)
    parts = content.split("---", 2)
    if len(parts) < 3 or parts[0].strip():
        return emit_report("markdown_frontmatter", False,
                           ["Note hat keinen Frontmatter-Block (---/--- am Datei-Anfang)"])

    # Aria-Brain-Konvention: related: [[Note1]], [[Note2]] ist Obsidian-Syntax
    # und nicht valid YAML. Vor dem Parse: wikilinked-Felder als String quoten.
    fm_raw = parts[1]
    fm_raw_normalized = re.sub(
        r"^(\s*(?:related|tags|crossref|references):\s*)(\[\[.+?)$",
        lambda m: f'{m.group(1)}"{m.group(2).replace(chr(34), chr(39))}"',
        fm_raw, flags=re.MULTILINE,
    )

    try:
        fm = yaml.safe_load(fm_raw_normalized)
    except yaml.YAMLError as e:
        return emit_report("markdown_frontmatter", False, [f"YAML-Parse-Error: {e}"])

    if not isinstance(fm, dict):
        return emit_report("markdown_frontmatter", False, ["Frontmatter ist kein dict"])

    errors: list[str] = []
    for field in REQUIRED:
        if field not in fm or fm[field] in (None, ""):
            errors.append(f"Pflichtfeld fehlt oder leer: {field}")

    if "type" in fm and fm["type"] not in TYPE_ENUM:
        errors.append(f"type='{fm['type']}' nicht in erlaubter Enum {sorted(TYPE_ENUM)}")
    if "status" in fm and fm["status"] not in STATUS_ENUM:
        errors.append(f"status='{fm['status']}' nicht in erlaubter Enum {sorted(STATUS_ENUM)}")
    if "date" in fm and isinstance(fm["date"], str) and not DATE_RE.match(fm["date"]):
        errors.append(f"date='{fm['date']}' nicht im Format YYYY-MM-DD")

    if not args.allow_missing_recommended:
        if "tags" not in fm:
            errors.append("Empfohlenes Feld fehlt: tags (--allow-missing-recommended um zu skippen)")

    return emit_report("markdown_frontmatter", not errors, errors,
                       details={"input": args.input, "frontmatter_keys": list(fm.keys())})


if __name__ == "__main__":
    sys.exit(main())
