"""Firm client overview — scoped to one client, firm-only."""

from __future__ import annotations

import io

from fastapi.testclient import TestClient

from app.main import app
from app.services import users as user_service
from app.store import CreateQueryRequest, store

client = TestClient(app)


def _setup(prefix: str) -> tuple[str, str, str]:
    firm_email = f"firm-{prefix}@test.com"
    client_email = f"client-{prefix}@test.com"
    user_service.ensure_user(platform="firm", email=firm_email, name="Firm User")
    ca = store.create_client(f"Client {prefix}", email=client_email, kvk="12345678")
    user_service.ensure_user(
        platform="client",
        email=client_email,
        name=f"Portal {prefix}",
        company=f"Company {prefix}",
        client_id=ca.id,
    )
    return firm_email, client_email, ca.id


def test_firm_can_load_client_overview():
    firm_email, client_email, client_id = _setup("ov1")
    res = client.get(f"/api/v1/clients/{client_id}?platform=firm&email={firm_email}")
    assert res.status_code == 200
    body = res.json()
    assert body["client"]["id"] == client_id
    assert body["client"]["email"] == client_email
    assert body["portal"]["company"] == "Company ov1"
    assert "kpis" in body
    assert body["kpis"]["documents"] == 0
    assert body["kpis"]["openQueries"] == 0
    assert body["documents"] == []
    assert body["queries"] == []
    assert "bank" in body
    assert "snelstart" in body
    assert body["snelstart"]["clientId"] == client_id


def test_client_portal_cannot_access_firm_overview():
    _, client_email, client_id = _setup("ov2")
    res = client.get(f"/api/v1/clients/{client_id}?platform=client&email={client_email}")
    assert res.status_code == 403


def test_unknown_client_returns_404():
    firm_email, _, _ = _setup("ov3")
    res = client.get(f"/api/v1/clients/c-does-not-exist?platform=firm&email={firm_email}")
    assert res.status_code == 404


def test_overview_is_scoped_to_that_client_only():
    firm_email, email_a, id_a = _setup("ova")
    _, email_b, id_b = _setup("ovb")

    upload_a = client.post(
        "/api/v1/documents/upload",
        files={"file": ("a-ova.pdf", io.BytesIO(b"%PDF-1.4 unique-client-a-" + email_a.encode()), "application/pdf")},
        data={"platform": "client", "email": email_a, "actor": "Client A"},
    )
    assert upload_a.status_code == 200, upload_a.text
    inv_a = upload_a.json()["id"]

    upload_b = client.post(
        "/api/v1/documents/upload",
        files={"file": ("b-ovb.pdf", io.BytesIO(b"%PDF-1.4 unique-client-b-" + email_b.encode()), "application/pdf")},
        data={"platform": "client", "email": email_b, "actor": "Client B"},
    )
    assert upload_b.status_code == 200, upload_b.text
    inv_b = upload_b.json()["id"]

    store.create_query(
        CreateQueryRequest(clientId=id_a, question="Please confirm invoice A", platform="firm", email=firm_email),
        actor="Firm User",
    )
    store.create_query(
        CreateQueryRequest(clientId=id_b, question="Please confirm invoice B", platform="firm", email=firm_email),
        actor="Firm User",
    )

    res = client.get(f"/api/v1/clients/{id_a}?platform=firm&email={firm_email}")
    assert res.status_code == 200
    body = res.json()
    doc_ids = {d["id"] for d in body["documents"]}
    query_questions = {q["question"] for q in body["queries"]}
    activity_clients = {e.get("clientId") for e in body["activity"]}
    assert inv_a in doc_ids
    assert inv_b not in doc_ids
    assert "Please confirm invoice A" in query_questions
    assert "Please confirm invoice B" not in query_questions
    assert id_b not in activity_clients
    assert body["kpis"]["documents"] >= 1
    assert body["kpis"]["openQueries"] >= 1
