#!/usr/bin/env python3
"""
UserPromptSubmit hook for bluera-knowledge plugin.

Detects dependency-related prompts and injects a gentle BK reminder
into context, reinforcing the directive skill description.

Fires when:
- Prompt mentions dependency errors (Cannot find module, ModuleNotFoundError, etc.)
- Prompt involves planning/implementing with external packages
- Prompt mentions debugging + library/package keywords
- Prompt contains import/require statements with package names

Does NOT fire when:
- Prompt already mentions bluera-knowledge, /search, or mcp__bluera-knowledge
- No dependency-related content detected
"""

import json
import os
import re
import sys

# Shared store helpers
sys.path.insert(
    0, os.path.join(os.environ.get("CLAUDE_PLUGIN_ROOT", "."), "hooks", "lib")
)
from store_summary import format_store_catalog, load_stores


# Patterns that indicate dependency-related work
DEPENDENCY_ERROR_PATTERNS = [
    r"cannot find module",
    r"module not found",
    r"modulenotfounderror",
    r"importerror",
    r"no module named",
    r"package .+ not found",
    r"could not resolve",
    r"cannot resolve",
    r"peer dep",
    r"unresolved import",
]

LIBRARY_KEYWORDS = [
    r"\b(?:dependency|dependencies|package|library|framework|sdk|api)\b",
    r"\b(?:npm|pip|cargo|gem|maven|gradle|composer|nuget)\b",
    r"\b(?:node_modules|vendor|site-packages|\.venv)\b",
    r"\b(?:import|require|from .+ import)\b.*\b(?:express|react|vue|angular|fastapi|django|flask|hono|zod|pydantic|axios|lodash|prisma|drizzle|next|svelte|tailwind)\b",
]

PLANNING_PATTERNS = [
    r"\b(?:implement|integrate|set up|configure|use|add)\b.{1,40}\b(?:with|using)\b",
    r"\bhow (?:does|do|to)\b.{1,30}\b(?:work|handle|process)\b",
    r"\bwhat (?:is|are|does)\b.{1,30}\b(?:api|method|function|class|option|parameter)\b",
]

DEBUG_PATTERNS = [
    r"\b(?:error|bug|issue|crash|fail|broken|stuck|debug)\b.{1,60}\b(?:package|library|dependency|module|import)\b",
    r"\b(?:package|library|dependency|module|import)\b.{1,60}\b(?:error|bug|issue|crash|fail|broken|stuck|debug)\b",
]

# Patterns indicating the user is already using BK
ALREADY_USING_BK = [
    r"bluera.knowledge",
    r"/search",
    r"/bluera-knowledge",
    r"mcp__bluera.knowledge",
    r"mcp__.*bluera.*knowledge",
]


def prompt_involves_dependencies(prompt: str) -> bool:
    """Check if the prompt involves dependency/library work."""
    lower = prompt.lower()

    for pattern in DEPENDENCY_ERROR_PATTERNS:
        if re.search(pattern, lower):
            return True

    for pattern in LIBRARY_KEYWORDS:
        if re.search(pattern, lower, re.IGNORECASE):
            return True

    for pattern in PLANNING_PATTERNS:
        if re.search(pattern, lower, re.IGNORECASE):
            return True

    for pattern in DEBUG_PATTERNS:
        if re.search(pattern, lower, re.IGNORECASE):
            return True

    return False


def already_using_bk(prompt: str) -> bool:
    """Check if the prompt already references BK."""
    lower = prompt.lower()
    for pattern in ALREADY_USING_BK:
        if re.search(pattern, lower):
            return True
    return False


def main() -> None:
    try:
        stdin_data = sys.stdin.read()
        if not stdin_data.strip():
            return

        data = json.loads(stdin_data)
        prompt = data.get("prompt", "")

        if not prompt:
            return

        # Don't fire if user is already using BK
        if already_using_bk(prompt):
            return

        # Don't fire if prompt doesn't involve dependencies
        if not prompt_involves_dependencies(prompt):
            return

        # Build store-aware nudge message
        stores = load_stores()
        catalog = format_store_catalog(stores, cap=5)

        if catalog:
            context_msg = (
                f"These libraries are indexed and searchable in BK: {catalog}. "
                "Use mcp__bluera-knowledge__search to look up their APIs, "
                "implementation details, and usage patterns before relying on training data."
            )
        else:
            context_msg = (
                "You have indexed library sources available via Bluera Knowledge. "
                "Use mcp__bluera-knowledge__search to look up library APIs, "
                "implementation details, and usage patterns before relying on training data."
            )

        output = {
            "hookSpecificOutput": {
                "hookEventName": "UserPromptSubmit",
                "additionalContext": context_msg,
            }
        }
        print(json.dumps(output))

    except Exception:
        # Hooks must never crash — silent failure is safer than blocking
        pass


if __name__ == "__main__":
    main()
