from datetime import datetime
from typing import Optional, Union

from pydantic import Field

from glQiwiApi.types.base import Base
from glQiwiApi.types.basics import Sum


class Provider(Base):
    """ object: Provider """
    id: Optional[int] = None
    """ID провайдера в QIWI Wallet"""

    short_name: Optional[str] = Field(default=None, alias="shortName")
    """краткое наименование провайдера"""

    long_name: Optional[str] = Field(alias="longName", default=None)
    """развернутое наименование провайдера"""

    logo_url: Optional[str] = Field(alias="logoUrl", default=None)
    """ссылка на логотип провайдера"""

    description: Optional[str] = None
    """описание провайдера (HTML)"""

    keys: Optional[Union[str, list]] = None
    """список ключевых слов"""

    site_url: Optional[str] = Field(alias="siteUrl", default=None)
    """сайт провайдера"""


class Transaction(Base):
    """ object: Transaction """
    transaction_id: int = Field(alias="txnId")
    """	ID транзакции в сервисе QIWI Кошелек"""

    person_id: int = Field(alias="personId")
    """Номер кошелька"""

    date: datetime
    """
    Для запросов истории платежей - Дата/время платежа,
    во временной зоне запроса (см. параметр startDate).
    Для запросов данных о транзакции - Дата/время платежа, время московское
    """

    error_code: Optional[int] = Field(alias="errorCode", default=None)
    """Код ошибки платежа"""

    error: Optional[str] = None
    """Описание ошибки"""

    status: str
    """
    Статус платежа. Возможные значения:
    WAITING - платеж проводится,
    SUCCESS - успешный платеж,
    ERROR - ошибка платежа.
    """

    type: str
    """
    Тип платежа. Возможные значения:
    IN - пополнение,
    OUT - платеж,
    QIWI_CARD - платеж с карт QIWI (QVC, QVP).
    """

    status_text: str = Field(alias="statusText")
    """Текстовое описание статуса платежа"""

    trm_transaction_id: str = Field(alias="trmTxnId")
    """Клиентский ID транзакции"""

    to_account: str = Field(alias="account")
    """
    Для платежей - номер счета получателя.
    Для пополнений - номер отправителя,
    терминала или название агента пополнения кошелька
    """

    sum: Sum
    """Данные о сумме платежа или пополнения."""

    commission: Sum
    """Данные о комиссии"""

    total: Sum
    """Общие данные о платеже в формате объекта Sum"""

    provider: Provider
    """Данные о провайдере."""

    source: Optional[Provider] = None
    """Служебная информация"""

    comment: Optional[str] = None
    """	Комментарий к платежу"""

    currency_rate: int = Field(alias="currencyRate")
    """Курс конвертации (если применяется в транзакции)"""

    _extras: Optional[dict] = Field(..., alias="extras")
    """Служебная информация"""

    _cheque_ready: bool = Field(..., alias="chequeReady")
    """Специальное поле"""

    _bank_document_available: bool = Field(..., alias="bankDocumentAvailable")
    """Специальное поле"""

    _repeat_payment_enabled: bool = Field(..., alias="repeatPaymentEnabled")
    """Специальное поле"""

    _favorite_payment_enabled: bool = Field(
        ..., alias="favoritePaymentEnabled"
    )
    """Специальное поле"""

    _regular_payment_enabled: bool = Field(..., alias="regularPaymentEnabled")
    """Специальное поле"""

    def __str__(self) -> str:
        return f"""Статус транзакции: {self.status}
Дата проведения платежа: {self.date}
Сумма платежа: {self.sum.amount}
Комментарий: {self.comment if isinstance(self.comment, str) else '-'}
{"Кому" if self.type == "OUT" else "От кого"}: {self.to_account}
"""
