from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field


class PostFinanceImportRequest(BaseModel):
    zip_content_base64: str = Field(min_length=4)
    overview_content_base64: str = Field(min_length=4)
    zip_file_name: str = "postfinance-documents.zip"
    overview_file_name: str = "postfinance-account-overview.pdf"
    account_roles: dict[str, str] | None = None


class PostFinanceConfirmRequest(PostFinanceImportRequest):
    preview_id: str
    confirmation_id: str
    confirm: bool = False


class PostFinancePreviewResponse(BaseModel):
    preview_id: str
    confirmation_id: str
    db_revision: str
    bundle_sha256: str
    zip_sha256: str
    overview_sha256: str
    parser_id: str
    parser_version: str
    snapshot_at: str
    document_count: int
    zip_document_count: int
    page_count: int
    position_count: int
    cash_count: int
    event_count: int
    event_counts: dict[str, int]
    quality_counts: dict[str, int]
    transfer_group_count: int
    total_chf: str
    securities_chf: str
    cash_chf: str
    stocks_chf: str
    etfs_chf: str
    component_total_chf: str
    reconciliation_difference_chf: str
    reconciliation_status: str
    open_orders: int
    account_roles_resolved: list[str]
    mapped_position_count: int
    duplicate: bool
    existing_batch_id: str | None = None
    conflict: bool
    conflicting_batch_id: str | None = None
    warnings: list[str]


class PostFinanceConfirmResponse(BaseModel):
    status: str
    batch_id: str
    snapshot_id: str | None = None
    audit_id: str
    idempotent: bool


class PostFinanceSummaryResponse(BaseModel):
    latest_snapshot: dict[str, Any] | None
    positions: list[dict[str, Any]]
    cash: list[dict[str, Any]]
    event_counts: dict[str, int]
    imports: list[dict[str, Any]]
