"""微信登录 Admin 配置路由

挂载在 /admin/wechat-auth 前缀下：
  GET  /config   获取微信应用配置
  PUT  /config   保存微信应用配置
"""
import logging
from typing import Optional

from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_db, require_permission
from app.config import settings as s
from app.core.models.tenant_settings import TenantSettings
from app.core.services.plugin_helper import require_plugin

logger = logging.getLogger("uvicorn.error")

router = APIRouter(prefix="/admin/wechat-auth", tags=["微信登录管理"])


class WechatAuthConfig(BaseModel):
    # 小程序
    miniapp_appid:  Optional[str] = ""
    miniapp_secret: Optional[str] = ""
    # 公众号
    mp_appid:  Optional[str] = ""
    mp_secret: Optional[str] = ""
    # 开放平台（网页扫码）
    open_appid:  Optional[str] = ""
    open_secret: Optional[str] = ""
    # 通用开关
    enabled: bool = False
    # 微信支付（商户号）
    wxpay_mch_id:     Optional[str] = ""
    wxpay_api_v3_key: Optional[str] = ""
    wxpay_serial_no:  Optional[str] = ""
    wxpay_private_key: Optional[str] = ""  # PEM 格式私钥全文
    wxpay_notify_url:    Optional[str] = ""  # 必须是已备案 HTTPS 地址
    wxpay_platform_cert: Optional[str] = ""  # 微信平台公钥 PEM，填后启用回调验签


async def _get_or_create_settings(db: AsyncSession, tenant_id: int) -> TenantSettings:
    r = await db.execute(select(TenantSettings).where(TenantSettings.tenant_id == tenant_id))
    ts = r.scalar_one_or_none()
    if not ts:
        ts = TenantSettings(tenant_id=tenant_id, store_name="My Store")
        db.add(ts)
        await db.flush()
    return ts


@router.get("/config", summary="获取微信登录配置")
async def get_config(
    db:    AsyncSession = Depends(get_db),
    _user = Depends(require_permission("plugins.wechat_auth.configure")),
):
    tid = _user.tenant_id
    await require_plugin("wechat_auth", db, tid)
    ts  = await _get_or_create_settings(db, tid)
    cfg = ((ts.extra or {}).get("wechat_auth")) or {}
    return WechatAuthConfig(**cfg)


@router.put("/config", summary="保存微信登录配置")
async def put_config(
    body:  WechatAuthConfig,
    db:    AsyncSession = Depends(get_db),
    _user = Depends(require_permission("plugins.wechat_auth.configure")),
):
    tid = _user.tenant_id
    await require_plugin("wechat_auth", db, tid)
    ts  = await _get_or_create_settings(db, tid)

    extra = dict(ts.extra or {})
    extra["wechat_auth"] = body.model_dump()
    ts.extra = extra
    db.add(ts)
    await db.commit()

    return {"message": "微信登录配置已保存", "config": body.model_dump()}
