from __future__ import annotations

from typing import Literal

from pydantic import BaseModel, ConfigDict

HouseholdItemAction = Literal[
    "keep_not_duplicate",
    "exclude_duplicate",
    "reopen_duplicate",
    "credit_card_settlement",
    "internal_transfer",
]


class HouseholdItemActionRequest(BaseModel):
    model_config = ConfigDict(extra="forbid")

    item_token: str
    data_version: str
    action: HouseholdItemAction
    candidate_version: int
    candidate_baseline: str
    category_id: str | None = None
    original_transaction_token: str | None = None
    counterpart_account_token: str | None = None
    preview_fingerprint: str | None = None
    confirm: bool = False
    acknowledge_partial: bool = False


class HouseholdCategoryChangeRequest(BaseModel):
    model_config = ConfigDict(extra="forbid")

    transaction_token: str
    data_version: str
    transaction_baseline: str
    new_category_id: str
    preview_fingerprint: str | None = None
    confirm: bool = False


class HouseholdConfirmedDuplicateRequest(BaseModel):
    model_config = ConfigDict(extra="forbid")

    transaction_token: str
    data_version: str
    transaction_baseline: str
    original_transaction_token: str
    preview_fingerprint: str | None = None
    confirm: bool = False


class HouseholdReviewItemRead(BaseModel):
    model_config = ConfigDict(extra="forbid")

    item_token: str
    candidate_version: int
    candidate_baseline: str
    data_version: str
    status: str
    date: str
    merchant: str
    amount: str
    currency: str
    source_label: str
    account_hint: str | None
    original_transaction_token: str | None
    available_actions: list[HouseholdItemAction]
    capabilities: dict[str, bool]


class HouseholdClosedDuplicateList(BaseModel):
    model_config = ConfigDict(extra="forbid")

    items: list[HouseholdReviewItemRead]
    total: int
    has_more: bool
    next_cursor: str | None
    data_version: str


class HouseholdEligibleDuplicateOriginal(BaseModel):
    model_config = ConfigDict(extra="forbid")

    transaction_token: str
    date: str
    merchant: str
    amount: str
    currency: str
    masked_source: str


class HouseholdEligibleDuplicateOriginalList(BaseModel):
    model_config = ConfigDict(extra="forbid")

    item_token: str
    candidate_version: int
    candidate_baseline: str
    data_version: str
    items: list[HouseholdEligibleDuplicateOriginal]
    total: int
    has_more: bool
    next_cursor: str | None
