"""前台钱包 API

路由：
  GET  /store/wallet               查看我的余额
  GET  /store/wallet/transactions  我的余额变动记录
  GET  /store/payment-methods      已启用支付方式列表（前台结账用，无需登录）
"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_db, get_current_customer, get_tenant_by_domain
from app.core.models.tenant import Tenant
from app.core.models.customer import Customer
from app.core.models.wallet import CustomerWallet, WalletTransaction
from app.core.models.payment_gateway import PaymentGateway

router = APIRouter(tags=["钱包"])


# ── 公开：支付方式列表（前台结账） ─────────────────────────────────────────

@router.get("/store/payment-methods", summary="已启用支付方式（无需登录）")
async def get_payment_methods(
    db: AsyncSession = Depends(get_db),
    tid: int = Depends(get_tenant_by_domain),
):
    result = await db.execute(
        select(PaymentGateway)
        .where(PaymentGateway.enabled == 1, PaymentGateway.tenant_id == tid)
        .order_by(PaymentGateway.sort_order)
    )
    items = []
    for gw in result.scalars().all():
        item: dict = {"code": gw.code, "name": gw.name, "icon": gw.icon or "💳"}
        # 银行转账：返回展示用的安全字段（无 API 密钥）
        if gw.code == "bank_transfer" and gw.config:
            cfg = gw.config
            item["bank_info"] = {
                "bank_name":      cfg.get("bank_name", ""),
                "account_name":   cfg.get("account_name", ""),
                "account_number": cfg.get("account_number", ""),
                "swift_code":     cfg.get("swift_code", ""),
                "routing_number": cfg.get("routing_number", ""),
                "reference_note": cfg.get("reference_note", ""),
                "instructions":   cfg.get("instructions", ""),
            }
        items.append(item)
    return items


# ── 登录用户：余额 ─────────────────────────────────────────────────────────

@router.get("/store/wallet", summary="查看我的余额")
async def my_wallet(
    db: AsyncSession = Depends(get_db),
    customer: Customer = Depends(get_current_customer),
):
    wallet = (
        await db.execute(
            select(CustomerWallet).where(CustomerWallet.customer_id == customer.id)
        )
    ).scalar_one_or_none()

    return {
        "balance": float(wallet.balance) if wallet else 0.0,
        "currency": wallet.currency if wallet else "NZD",
    }


@router.get("/store/wallet/transactions", summary="余额变动记录")
async def my_transactions(
    page: int = Query(1, ge=1),
    page_size: int = Query(20, ge=1, le=100),
    db: AsyncSession = Depends(get_db),
    customer: Customer = Depends(get_current_customer),
):
    from sqlalchemy import func

    total = (
        await db.execute(
            select(func.count())
            .select_from(WalletTransaction)
            .where(WalletTransaction.customer_id == customer.id)
        )
    ).scalar_one()

    txns = (
        await db.execute(
            select(WalletTransaction)
            .where(WalletTransaction.customer_id == customer.id)
            .order_by(WalletTransaction.id.desc())
            .offset((page - 1) * page_size)
            .limit(page_size)
        )
    ).scalars().all()

    return {
        "total": total,
        "page": page,
        "page_size": page_size,
        "items": [
            {
                "id": t.id,
                "amount": float(t.amount),
                "balance_after": float(t.balance_after),
                "type": t.type,
                "source_type": t.source_type,
                "source_id": t.source_id,
                "note": t.note,
                "created_at": t.created_at.isoformat() if t.created_at else None,
            }
            for t in txns
        ],
    }
