"""货币配置模型

每个租户可配置多种货币，其中一种为基准货币（is_default=True，exchange_rate=1.0）。
汇率约定：exchange_rate = 1 基准货币可兑换多少本货币
  例：基准=CNY，USD.exchange_rate=0.138 → 1 CNY = 0.138 USD
"""
from decimal import Decimal
from datetime import datetime
from typing import Optional

from sqlalchemy import (
    BigInteger, Boolean, DateTime, ForeignKey,
    String, DECIMAL, UniqueConstraint, text,
)
from sqlalchemy.orm import Mapped, mapped_column

from app.core.models.base import Base, TimestampMixin


class Currency(Base, TimestampMixin):
    __tablename__ = "currencies"
    __table_args__ = (
        UniqueConstraint("tenant_id", "code", name="uq_currencies_tenant_code"),
        {
            "mysql_engine": "InnoDB",
            "mysql_charset": "utf8mb4",
            "mysql_collate": "utf8mb4_unicode_ci",
            "comment": "租户货币配置表",
        },
    )

    id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
    tenant_id: Mapped[int] = mapped_column(
        BigInteger,
        ForeignKey("tenants.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
    )
    code: Mapped[str] = mapped_column(
        String(3), nullable=False,
        comment="ISO 4217 货币代码，如 CNY / USD / NZD",
    )
    name: Mapped[str] = mapped_column(String(100), nullable=False, comment="货币名称")
    symbol: Mapped[str] = mapped_column(String(10), nullable=False, comment="货币符号")
    exchange_rate: Mapped[Decimal] = mapped_column(
        DECIMAL(18, 8),
        nullable=False,
        server_default="1.00000000",
        comment="相对基准货币的汇率（1 基准 = rate 本货币）",
    )
    is_default: Mapped[bool] = mapped_column(
        Boolean, nullable=False, server_default="0",
        comment="是否为基准货币，每租户唯一，汇率固定为 1",
    )
    is_active: Mapped[bool] = mapped_column(
        Boolean, nullable=False, server_default="1",
        comment="是否在前台展示",
    )
    rate_mode: Mapped[str] = mapped_column(
        String(10), nullable=False, server_default="manual",
        comment="manual=手动设置汇率  auto=自动从 API 拉取",
    )
    last_fetched_at: Mapped[Optional[datetime]] = mapped_column(
        DateTime(timezone=False), nullable=True,
        comment="最后一次自动获取汇率的时间",
    )

    def __repr__(self) -> str:
        return f"<Currency {self.code} rate={self.exchange_rate} default={self.is_default}>"
