from __future__ import annotations

from typing import Literal

from pydantic import BaseModel

DataQualityStatus = Literal["fresh", "stale", "partial", "unavailable", "unknown"]


class ReconciliationRecordResponse(BaseModel):
    account_id: str
    account_label: str
    currency: str
    status: Literal["reconciled", "difference", "not_comparable", "partial", "unavailable"]
    reason_codes: list[str]
    as_of: str | None = None
    last_successful_import: str | None = None
    ledger_balance: str | None = None
    snapshot_balance: str | None = None
    difference: str | None = None
    freshness_status: DataQualityStatus
    data_quality_status: DataQualityStatus


class SnapshotMetadataResponse(BaseModel):
    snapshot_kind: Literal["account_valuation", "fx_rate"]
    as_of: str | None = None
    received_at: str | None = None
    source: str
    currency: str | None = None
    base_currency: str | None = None
    quote_currency: str | None = None
    value: str | None = None
    freshness_status: DataQualityStatus
    availability_status: DataQualityStatus
    issue_codes: list[str]
    is_estimated: bool = False


class ReconciliationSnapshotResponse(BaseModel):
    reconciliations: list[ReconciliationRecordResponse]
    snapshots: list[SnapshotMetadataResponse]
    data_quality_status: DataQualityStatus
