import { KNOWLEDGE } from '../data/knowledge.js'
import type { KnowledgeEntry } from '../types.js'

export interface KnowledgeHit {
  entry: KnowledgeEntry
  score: number
}

/**
 * Lengvas paieškos variklis (RAG-lite). MVP versijoje — raktažodžių
 * sutapimo įvertis abiem kalbomis. Produkcijoje keičiama į vektorinę
 * paiešką (pvz., Qdrant).
 */
export class KnowledgeService {
  list(category?: string): KnowledgeEntry[] {
    if (!category) return KNOWLEDGE
    return KNOWLEDGE.filter((e) => e.category === category)
  }

  get(id: string): KnowledgeEntry | undefined {
    return KNOWLEDGE.find((e) => e.id === id)
  }

  search(query: string, limit = 5): KnowledgeHit[] {
    // Nuimame skyrybą, kad „kraujavima?" virstų „kraujavima".
    const q = query.toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, ' ')
    const terms = q.split(/\s+/).filter((t) => t.length > 2)
    if (terms.length === 0) return []

    /** Kamienas — pirmieji simboliai, kad sutaptų lietuviškos galūnės. */
    const stem = (t: string) => t.slice(0, Math.max(4, t.length - 2))

    const hits: KnowledgeHit[] = KNOWLEDGE.map((entry) => {
      const haystack = [
        entry.title.lt,
        entry.title.en,
        entry.body.lt,
        entry.body.en,
        entry.tags.join(' '),
        entry.category,
      ]
        .join(' ')
        .toLowerCase()

      let score = 0
      for (const term of terms) {
        if (entry.tags.some((tag) => tag.toLowerCase() === term)) score += 3
        else if (haystack.includes(term)) score += 2
        else if (haystack.includes(stem(term))) score += 1 // dalinis (galūnių) atitikimas
      }
      return { entry, score }
    })

    return hits
      .filter((h) => h.score > 0)
      .sort((a, b) => b.score - a.score)
      .slice(0, limit)
  }
}

export const knowledgeService = new KnowledgeService()
