"""Super Admin — POS Lane management + pairing-code issuance."""
from fastapi import APIRouter, Depends, Query
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_db, get_superadmin_user
from app.core.models.user import User
from app.plugins.pos_sync.services import (
    create_lane, issue_pairing_code, list_lanes, unpair_lane, update_lane,
)

router = APIRouter(prefix="/superadmin/pos-lanes", tags=["超管-POS Lanes"])


class PosLaneCreate(BaseModel):
    tenant_id: int
    store_id: int
    store_code: str
    store_timezone: str = "Pacific/Auckland"
    lane_id: str
    lane_name: str | None = None
    store_country: str
    store_province: str = ""


class PosLaneUpdate(BaseModel):
    lane_name: str | None = None
    is_active: bool | None = None
    store_country: str | None = None
    store_province: str | None = None


@router.get("", summary="列出 POS lane")
async def get_lanes(
    tenant_id: int | None = Query(default=None),
    db: AsyncSession = Depends(get_db),
    _sa: User = Depends(get_superadmin_user),
):
    return await list_lanes(db, tenant_id)


@router.post("", summary="创建 POS lane 并返回一次性配对码", status_code=201)
async def post_lane(
    body: PosLaneCreate,
    db: AsyncSession = Depends(get_db),
    _sa: User = Depends(get_superadmin_user),
):
    lane, raw_code = await create_lane(
        db, tenant_id=body.tenant_id, store_id=body.store_id, store_code=body.store_code,
        store_timezone=body.store_timezone, lane_id=body.lane_id, lane_name=body.lane_name,
        store_country=body.store_country, store_province=body.store_province,
    )
    return {"id": lane.id, "lane_id": lane.lane_id, "pairing_code": raw_code}


@router.post("/{lane_pk}/pairing-code", summary="重新签发一次性配对码（不轮换 sync token）")
async def post_pairing_code(
    lane_pk: int,
    db: AsyncSession = Depends(get_db),
    _sa: User = Depends(get_superadmin_user),
):
    raw_code = await issue_pairing_code(db, lane_pk)
    return {"pairing_code": raw_code}


@router.patch("/{lane_pk}", summary="更新 lane 名称/启用状态")
async def patch_lane(
    lane_pk: int,
    body: PosLaneUpdate,
    db: AsyncSession = Depends(get_db),
    _sa: User = Depends(get_superadmin_user),
):
    return await update_lane(
        db, lane_pk, lane_name=body.lane_name, is_active=body.is_active,
        store_country=body.store_country, store_province=body.store_province,
    )


@router.post("/{lane_pk}/unpair", summary="Unpair current POS Agent and revoke its sync token")
async def post_unpair_lane(
    lane_pk: int,
    db: AsyncSession = Depends(get_db),
    _sa: User = Depends(get_superadmin_user),
):
    return await unpair_lane(db, lane_pk)
