"""SnelStart integration boundary tests — no real credentials required."""

from __future__ import annotations

import io

import pytest
from fastapi.testclient import TestClient

from app.main import app
from app.services import users as user_service
from app.services.snelstart import integration_enabled
from app.services.snelstart.bank import import_bank_transactions_all
from app.services.snelstart.exceptions import SnelStartIntegrationDisabled
from app.services.snelstart.invoices import push_invoice
from app.services.snelstart.reports import get_monthly_summary
from app.store import store


@pytest.fixture()
def client() -> TestClient:
    return TestClient(app)


def _setup_firm_client(prefix: str) -> tuple[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)
    user_service.ensure_user(platform="client", email=client_email, name="Client", client_id=ca.id)
    return firm_email, ca.id


def test_integration_disabled_by_default():
    assert integration_enabled() is False


def test_sync_invoice_while_disconnected_keeps_approved(client: TestClient):
    firm_email, client_id = _setup_firm_client("sync1")
    pdf = b"%PDF-1.4 snelstart sync test"
    upload = client.post(
        "/api/v1/documents/upload",
        files={"file": ("inv.pdf", io.BytesIO(pdf), "application/pdf")},
        data={"platform": "client", "email": f"client-sync1@test.com", "actor": "Client"},
    )
    assert upload.status_code == 200
    invoice_id = upload.json()["id"]

    store.update_invoice(invoice_id, {"supplier": "Acme BV"}, actor="Firm")
    approve = client.post(
        f"/api/v1/invoices/{invoice_id}/approve",
        json={"platform": "firm", "email": firm_email, "actor": "Firm User"},
    )
    assert approve.status_code == 200
    assert approve.json()["status"] == "Approved"

    sync = client.post(
        f"/api/v1/invoices/{invoice_id}/sync",
        json={"platform": "firm", "email": firm_email, "actor": "Firm User"},
    )
    assert sync.status_code == 503
    assert "not enabled" in sync.json()["detail"].lower() or "not connected" in sync.json()["detail"].lower()

    invoice = store._find_invoice(invoice_id)  # noqa: SLF001
    assert invoice.status == "Approved"
    assert invoice.syncedAt is None


def test_bank_import_returns_zero_without_integration():
    result = import_bank_transactions_all()
    assert result.imported == 0
    assert result.integrationEnabled is False
    assert "not enabled" in result.message.lower()


def test_bank_sync_endpoint_no_fake_transactions(client: TestClient):
    firm_email, _ = _setup_firm_client("bank1")
    before = len(store.snapshot().transactions)
    res = client.post(
        "/api/v1/bank-transactions/sync",
        json={"platform": "firm", "email": firm_email, "actor": "Firm User"},
    )
    assert res.status_code == 200
    body = res.json()
    assert body["imported"] == 0
    assert len(store.snapshot().transactions) == before


def test_financial_summary_requires_integration():
    _, client_id = _setup_firm_client("fin1")
    summary = get_monthly_summary(client_id=client_id, period="2026-08")
    assert summary.integrationRequired is True
    assert summary.revenue is None
    assert summary.costs is None


def test_client_cannot_access_bank_transactions(client: TestClient):
    _, _ = _setup_firm_client("sec1")
    res = client.get("/api/v1/bank-transactions?platform=client&email=client-sec1@test.com")
    assert res.status_code in {403, 422}


def test_snelstart_connections_overview_for_firm(client: TestClient):
    firm_email, client_id = _setup_firm_client("conn1")
    res = client.get(f"/api/v1/snelstart/connections?platform=firm&email={firm_email}")
    assert res.status_code == 200
    body = res.json()
    assert body["live"] is True
    assert "integrationEnabled" in body
    assert "counts" in body
    assert "items" in body
    assert "probe" in body
    assert isinstance(body["items"], list)
    assert any(item["clientId"] == client_id for item in body["items"])


def test_push_invoice_raises_when_disabled():
    firm_email, _ = _setup_firm_client("push1")
    user_service.ensure_user(platform="firm", email=firm_email, name="Firm User")
    pdf = b"%PDF push"
    tc = TestClient(app)
    upload = tc.post(
        "/api/v1/documents/upload",
        files={"file": ("x.pdf", io.BytesIO(pdf), "application/pdf")},
        data={"platform": "client", "email": "client-push1@test.com", "actor": "Client"},
    )
    invoice_id = upload.json()["id"]
    store.update_invoice(invoice_id, {"supplier": "Supplier"}, actor="Firm")
    store.approve_invoice(invoice_id, actor="Firm")
    with pytest.raises(SnelStartIntegrationDisabled):
        push_invoice(invoice_id, actor="Firm")
