from dataclasses import dataclass
from typing import Dict, List, Optional


@dataclass
class ToolResult:
    ok: bool
    data: List[Dict]
    error: Optional[str] = None


def web_search(query: str, limit: int = 5) -> ToolResult:
    """Mock search tool"""
    if not query or not query.strip():
        return ToolResult(ok=False, data=[], error="invalid_query")

    mock_results = [
        {"title": "AI News A", "url": "https://example.com/a", "snippet": "update A"},
        {"title": "AI News B", "url": "https://example.com/b", "snippet": "update B"},
        {"title": "AI News C", "url": "https://example.com/c", "snippet": "update C"},
        {"title": "AI News D", "url": "https://example.com/d", "snippet": "update D"},
        {"title": "AI News E", "url": "https://example.com/e", "snippet": "update E"},
    ]
    return ToolResult(ok=True, data=mock_results[:limit])


def summarize(items: List[Dict]) -> ToolResult:
    """Simple summarizer"""
    if not items:
        return ToolResult(ok=False, data=[], error="empty_input")

    summaries = [
        {
            "summary": f"{item['title']} - 핵심 한 줄 요약",
            "url": item["url"],
        }
        for item in items[:3]
    ]
    return ToolResult(ok=True, data=summaries)


def validate(items: List[Dict]) -> ToolResult:
    """Basic validation stage"""
    if len(items) < 3:
        return ToolResult(ok=False, data=[], error="insufficient_results")

    valid = [x for x in items if x.get("url", "").startswith("https://")]
    if len(valid) < 3:
        return ToolResult(ok=False, data=[], error="invalid_url_format")

    return ToolResult(ok=True, data=valid)


def run_briefing(query: str) -> Dict:
    searched = web_search(query, limit=5)
    if not searched.ok:
        return {"ok": False, "stage": "search", "error": searched.error}

    validated = validate(searched.data)
    if not validated.ok:
        return {"ok": False, "stage": "validate", "error": validated.error}

    summarized = summarize(validated.data)
    if not summarized.ok:
        return {"ok": False, "stage": "summarize", "error": summarized.error}

    return {
        "ok": True,
        "count": len(summarized.data),
        "result": summarized.data,
    }


if __name__ == "__main__":
    output = run_briefing("today ai updates")
    print(output)
