"""
Krok 1 pipeline'u RAG: wczytaj dokumenty OWU z data/owu/, potnij na chunki
i zbuduj indeks wyszukiwania (TF-IDF) zapisany do .index/index.pkl.

Uruchomienie:
    python src/ingest.py

TF-IDF (a nie embeddingi z modelu językowego) to świadomy wybór na etap
MVP: działa lokalnie, bez GPU i bez kluczy API, jest szybkie do
uruchomienia, a dla języka prawniczego OWU (dużo powtarzalnych, konkretnych
terminów jak "franszyza", "kolizja parkingowa") radzi sobie zaskakująco
dobrze jako punkt startowy. Naturalny kolejny krok po zebraniu realnych
pytań agentów: podmienić na embeddingi (np. lokalny model
sentence-transformers albo API embeddingów) bez zmiany reszty architektury
-- patrz plan-techniczny-mvp.md, sekcja 4-5.
"""

import pickle
from pathlib import Path

import pdfplumber
from sklearn.feature_extraction.text import TfidfVectorizer

from chunking import chunk_document

DATA_DIR = Path(__file__).parent.parent / "data" / "owu"
INDEX_DIR = Path(__file__).parent.parent / ".index"
INDEX_PATH = INDEX_DIR / "index.pkl"


def read_text_from_file(path: Path) -> str:
    if path.suffix.lower() == ".pdf":
        with pdfplumber.open(path) as pdf:
            return "\n\n".join(page.extract_text() or "" for page in pdf.pages)
    return path.read_text(encoding="utf-8")


def main() -> None:
    if not DATA_DIR.exists():
        raise SystemExit(f"Brak folderu {DATA_DIR} — utwórz go i dodaj dokumenty OWU (.pdf lub .txt).")

    files = sorted([*DATA_DIR.glob("*.pdf"), *DATA_DIR.glob("*.txt")])
    if not files:
        raise SystemExit(f"Brak dokumentów w {DATA_DIR}. Dodaj co najmniej jeden plik .pdf lub .txt.")

    all_chunks = []
    for path in files:
        print(f"Wczytuję: {path.name}")
        raw_text = read_text_from_file(path)
        doc_chunks = chunk_document(raw_text, source_file=path.name)
        print(f"  -> {len(doc_chunks)} fragmentów")
        all_chunks.extend(doc_chunks)

    if not all_chunks:
        raise SystemExit("Nie udało się wyodrębnić żadnego fragmentu tekstu z dokumentów.")

    texts = [c.text for c in all_chunks]
    vectorizer = TfidfVectorizer(max_features=20000, ngram_range=(1, 2))
    matrix = vectorizer.fit_transform(texts)

    INDEX_DIR.mkdir(exist_ok=True)
    with open(INDEX_PATH, "wb") as f:
        pickle.dump({"vectorizer": vectorizer, "matrix": matrix, "chunks": all_chunks}, f)

    print(f"\nZapisano indeks: {INDEX_PATH}")
    print(f"Łącznie fragmentów w indeksie: {len(all_chunks)}")


if __name__ == "__main__":
    main()
