# ============================================================
# core/search.py
# Tìm kiếm FTS5 trong database công ty
# ============================================================

import sqlite3
from typing import Optional
from core.db_init import get_conn


def search_vouchers(db_path: str, query: str, limit: int = 20,
                    period_year: Optional[int] = None,
                    period_month: Optional[int] = None,
                    voucher_type: Optional[str] = None) -> list:
    """
    Tìm kiếm chứng từ bằng FTS5.
    Trả về list dict với thông tin chứng từ + snippet.
    """
    conn = get_conn(db_path)
    c = conn.cursor()

    extra_where = ""
    params = [query, limit]
    if period_year:
        extra_where += " AND v.period_year = ?"
        params.insert(-1, period_year)
    if period_month:
        extra_where += " AND v.period_month = ?"
        params.insert(-1, period_month)
    if voucher_type:
        extra_where += " AND v.voucher_type = ?"
        params.insert(-1, voucher_type)

    rows = c.execute(f"""
        SELECT v.id, v.voucher_no, v.voucher_type, v.voucher_date,
               v.description, v.total_debit, v.status,
               snippet(vouchers_fts, 1, '【', '】', '...', 15) AS snip
        FROM vouchers_fts
        JOIN vouchers v ON v.id = vouchers_fts.rowid
        WHERE vouchers_fts MATCH ?
        {extra_where}
        ORDER BY rank
        LIMIT ?
    """, params).fetchall()

    cols = [d[0] for d in c.description]
    conn.close()
    return [dict(zip(cols, r)) for r in rows]


def search_partners(db_path: str, query: str, limit: int = 20) -> list:
    """Tìm kiếm đối tác (khách hàng / nhà cung cấp) bằng FTS5."""
    conn = get_conn(db_path)
    c = conn.cursor()

    rows = c.execute("""
        SELECT p.id, p.code, p.name, p.tax_code, p.type, p.phone, p.email,
               snippet(partners_fts, 1, '【', '】', '...', 15) AS snip
        FROM partners_fts
        JOIN partners p ON p.id = partners_fts.rowid
        WHERE partners_fts MATCH ?
        ORDER BY rank
        LIMIT ?
    """, (query, limit)).fetchall()

    cols = [d[0] for d in c.description]
    conn.close()
    return [dict(zip(cols, r)) for r in rows]


def search_accounts(db_path: str, query: str, limit: int = 30) -> list:
    """Tìm kiếm tài khoản theo mã hoặc tên (LIKE search)."""
    conn = get_conn(db_path)
    c = conn.cursor()

    rows = c.execute("""
        SELECT code, name, type, level, parent_code
        FROM accounts
        WHERE code LIKE ? OR name LIKE ?
        ORDER BY code
        LIMIT ?
    """, (f"%{query}%", f"%{query}%", limit)).fetchall()

    cols = [d[0] for d in c.description]
    conn.close()
    return [dict(zip(cols, r)) for r in rows]


def print_search_results(results: list, title: str = "Kết quả tìm kiếm") -> None:
    """In kết quả tìm kiếm ra terminal."""
    if not results:
        print(f"🔍 Không tìm thấy kết quả.")
        return
    print(f"\n🔍 {title} ({len(results)} kết quả)")
    print("─" * 70)
    for r in results:
        if "voucher_no" in r:
            print(f"  [{r['voucher_type']}] {r['voucher_no']} | {r['voucher_date']} | {r['total_debit']:>15,.0f}")
            print(f"      {r.get('snip', r.get('description', ''))[:60]}")
        elif "tax_code" in r and "code" in r:
            print(f"  [{r['type']}] {r['code']:>6}  {r['name'][:50]}")
        else:
            print(f"  {r}")
        print()
