#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Design Search CLI - BM25 search engine for UI/UX style guides
Usage: python3 search.py --domain color --query "warm premium"
       python3 search.py --query "fintech dashboard"
       python3 search.py --stack nextjs --query "server components"
       python3 search.py --query "warm premium" --json

Domains: style, color, chart, landing, product, ux, typography, icons, react, web, google-fonts
Stacks: react, nextjs, vue, svelte, astro, swiftui, react-native, flutter, nuxtjs, nuxt-ui,
        html-tailwind, shadcn, jetpack-compose, threejs, angular, laravel
"""

import argparse
import io
import json as json_module
import sys

sys.path.insert(0, str(__import__("pathlib").Path(__file__).parent))
from core import (  # pyright: ignore[reportMissingImports]
    AVAILABLE_STACKS,
    CSV_CONFIG,
    MAX_RESULTS,
    search,
    search_stack,
)

# Force UTF-8 for stdout/stderr to handle emojis on Windows (cp1252 default)
if sys.stdout.encoding and sys.stdout.encoding.lower() != "utf-8":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
if sys.stderr.encoding and sys.stderr.encoding.lower() != "utf-8":
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")


def format_output(result):
    """Format results for human-readable consumption"""
    if "error" in result:
        return f"Error: {result['error']}"

    output = []
    if result.get("stack"):
        output.append(f"## Design Search Stack Guidelines")
        output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")
    else:
        output.append(f"## Design Search Results")
        output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
    output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")

    for i, row in enumerate(result["results"], 1):
        output.append(f"### Result {i}")
        for key, value in row.items():
            value_str = str(value)
            if len(value_str) > 300:
                value_str = value_str[:300] + "..."
            output.append(f"- **{key}:** {value_str}")
        output.append("")

    return "\n".join(output)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Design Search - BM25 search for UI/UX style guides")
    parser.add_argument("--query", "-q", required=True, help="Search query")
    parser.add_argument(
        "--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain (auto-detected if omitted)"
    )
    parser.add_argument(
        "--stack",
        "-s",
        choices=AVAILABLE_STACKS,
        help=f"Stack-specific search. Available: {', '.join(AVAILABLE_STACKS)}",
    )
    parser.add_argument(
        "--max-results", "-n", type=int, default=MAX_RESULTS, help=f"Max results (default: {MAX_RESULTS})"
    )
    parser.add_argument("--json", action="store_true", help="Output as JSON")

    args = parser.parse_args()

    # Stack search takes priority when --stack is specified
    if args.stack:
        result = search_stack(args.query, args.stack, args.max_results)
        if args.json:
            print(json_module.dumps(result, indent=2, ensure_ascii=False))
        else:
            print(format_output(result))
    else:
        result = search(args.query, args.domain, args.max_results)
        if args.json:
            print(json_module.dumps(result, indent=2, ensure_ascii=False))
        else:
            print(format_output(result))
