from __future__ import annotations

import argparse
import json
from pathlib import Path

from invoice_audit import build_file_rows, classify_document, run_audit, summarize_categories


def test_classify_document_prefers_specific_rules() -> None:
    assert classify_document("2026.05/windsurf/invoice.pdf", "") == ("windsurf", "windsurf")
    assert classify_document("x.pdf", "OpenAI invoice") == ("ai-saas", "openai")
    assert classify_document("x.pdf", "nothing useful") == ("unknown", "")


def test_build_file_rows_marks_duplicates() -> None:
    ocr = {
        "results": [
            {"path": "/root/a.pdf", "ok": True, "backend": "pdftotext", "chars": 10, "text": "OpenAI invoice"},
            {"path": "/root/b.pdf", "ok": False, "backend": "pdftotext", "chars": 0, "error": "bad"},
        ]
    }
    duplicates = {"groups": [{"paths": ["a.pdf", "c.pdf"]}]}
    rows = build_file_rows(ocr, duplicates, "/root")
    assert rows[0]["duplicate"] is True
    assert rows[0]["category"] == "ai-saas"
    assert rows[1]["ok"] is False


def test_summarize_categories_counts_files() -> None:
    rows = [
        {"category": "ai-saas", "ok": True, "duplicate": True, "chars": 5, "reason": "openai", "path": "a.pdf"},
        {"category": "ai-saas", "ok": False, "duplicate": False, "chars": 0, "reason": "openai", "path": "b.pdf"},
        {"category": "allegro", "ok": True, "duplicate": False, "chars": 8, "reason": "allegro", "path": "c.pdf"},
    ]
    summary = {row["category"]: row for row in summarize_categories(rows)}
    assert summary["ai-saas"]["file_count"] == 2
    assert summary["ai-saas"]["ocr_failed"] == 1
    assert summary["ai-saas"]["duplicate_files"] == 1


class FakeClient:
    def __init__(self):
        self.calls = []

    def run(self, uri, payload):
        self.calls.append((uri, payload))
        if uri.startswith("fs://"):
            return {"result": {"value": {"ok": True, "groupCount": 1, "duplicateFiles": 2, "reclaimableBytes": 3, "groups": [{"paths": ["a.pdf", "b.pdf"]}]}}}
        return {"result": {"value": {"ok": True, "count": 1, "ok_count": 1, "results": [{"path": "/root/a.pdf", "ok": True, "backend": "text-file", "chars": 14, "text": "Allegro faktura"}]}}}


def test_run_audit_writes_reports(tmp_path: Path) -> None:
    args = argparse.Namespace(
        node_url="http://node",
        root="/root",
        fs_path=".",
        extensions="pdf",
        max_files=10,
        max_chars_per_file=100,
        backend="auto",
        timeout=10,
        output_dir=str(tmp_path),
        fs_uri="fs://host/duplicates/query/find",
        ocr_uri="ocr://host/document/query/batch",
    )
    result = run_audit(args, client=FakeClient())
    assert result["ok"] is True
    assert Path(result["reports"]["categories_csv"]).is_file()
    raw = json.loads(Path(result["reports"]["raw_json"]).read_text(encoding="utf-8"))
    assert raw["files"][0]["category"] == "allegro"
