"""Firm-only client overview assembled from existing PostgreSQL-backed stores."""

from __future__ import annotations

from typing import Any

from app.services import users as user_service
from app.services.snelstart.connection import get_connection
from app.store import ClientQuery, Invoice, store

NEEDS_REVIEW_STATUSES = frozenset(
    {"New", "Processing", "AI processed", "Needs review", "Auto-ready"}
)
OPEN_QUERY_STATUSES = frozenset({"Requested", "Delivered", "Answered"})
DOCUMENT_EXCLUDE = {"ocrText", "extractedFields", "lines", "suggestion"}


def _document_summary(invoice: Invoice) -> dict[str, Any]:
    data = invoice.model_dump(exclude=DOCUMENT_EXCLUDE)
    return {
        "id": data["id"],
        "file": data.get("file") or "",
        "clientId": data.get("clientId"),
        "supplier": data.get("supplier") or "",
        "number": data.get("number") or "",
        "total": data.get("total") or 0,
        "currency": data.get("currency") or "EUR",
        "uploadedAt": data.get("uploadedAt") or "",
        "status": data.get("status") or "",
        "confidence": data.get("confidence") or 0,
        "duplicateStatus": data.get("duplicateStatus") or "None",
        "invoiceDate": data.get("invoiceDate") or "",
    }


def _query_summary(query: ClientQuery) -> dict[str, Any]:
    invoice_label, _ = store._query_invoice_context(query.invoiceId)  # noqa: SLF001
    last_message_at = None
    if query.messages:
        last_message_at = max((m.createdAt for m in query.messages if m.createdAt), default=None)
    last_activity = query.updatedAt or last_message_at or query.answeredAt or query.createdAt
    return {
        "id": query.id,
        "clientId": query.clientId,
        "invoiceId": query.invoiceId,
        "invoiceLabel": invoice_label,
        "title": query.title,
        "question": query.question,
        "status": query.status,
        "priority": query.priority or "Normal",
        "createdAt": query.createdAt,
        "updatedAt": query.updatedAt,
        "lastActivityAt": last_activity,
    }


def get_firm_client_overview(client_id: str) -> dict[str, Any] | None:
    client = store.get_client(client_id)
    if not client:
        return None

    store._enrich_snelstart_clients([client])  # noqa: SLF001
    connection = get_connection(client_id, legacy_snelstart=bool(client.snelstart))
    portal = user_service.get_client_portal_user(client_id=client_id, email=client.email or None)

    invoices = store.list_invoices(client_id=client_id)
    queries = store.list_queries(client_id=client_id)
    queries.sort(key=lambda q: q.updatedAt or q.createdAt or "", reverse=True)
    activity = store.list_activity(client_id=client_id, limit=25)
    bank_stats = store.bank_transaction_stats(client_id=client_id)

    needs_review = sum(1 for inv in invoices if inv.status in NEEDS_REVIEW_STATUSES)
    open_queries = sum(1 for q in queries if q.status in OPEN_QUERY_STATUSES)
    last_activity = activity[0] if activity else None

    portal_out = None
    if portal:
        portal_out = {
            "name": portal.name,
            "email": portal.email,
            "company": portal.company,
            "avatarUrl": portal.avatar_url,
            "createdAt": portal.created_at.isoformat() if portal.created_at else None,
        }

    return {
        "client": {
            "id": client.id,
            "name": client.name,
            "kvk": client.kvk,
            "email": client.email or (portal.email if portal else ""),
            "snelstart": connection.isConnected,
            "snelstartStatus": connection.status,
            "lastUpload": client.lastUpload or "",
        },
        "portal": portal_out,
        "snelstart": connection.to_public_dict(),
        "kpis": {
            "documents": len(invoices),
            "needsReview": needs_review,
            "openQueries": open_queries,
            "matchedTransactions": bank_stats["matched"],
        },
        "lastActivity": (
            {
                "at": last_activity.at,
                "text": last_activity.text,
                "type": last_activity.type,
            }
            if last_activity
            else None
        ),
        "documents": [_document_summary(inv) for inv in invoices[:50]],
        "queries": [_query_summary(q) for q in queries[:50]],
        "activity": [event.model_dump() for event in activity],
        "bank": bank_stats,
    }
