"""店铺端运费辅助接口"""
from typing import List, Optional
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.orm import selectinload
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_db, get_tenant_by_domain
from app.core.models.shipping_zone import ShippingZone
from app.core.models.country import Country, CountryProvince

router = APIRouter(prefix="/store/shipping", tags=["店铺运费"])


class ProvinceOut(BaseModel):
    name: str


class CountryOut(BaseModel):
    code: str
    name_zh: str
    name_en: str
    provinces: List[str] = []


@router.get("/countries", response_model=List[CountryOut], summary="获取店铺支持发货的国家及省份列表")
async def list_shipping_countries(
    tid: int = Depends(get_tenant_by_domain),
    db: AsyncSession = Depends(get_db),
):
    """
    1. 从激活的运费区域取出配置的国家代码
    2. 用这些代码查 countries + country_provinces 表
    3. 返回国家列表（含各国省份）
    """

    # 取该租户所有激活、非兜底区域的国家代码
    zone_result = await db.execute(
        select(ShippingZone.countries)
        .where(
            ShippingZone.tenant_id == tid,
            ShippingZone.is_active == 1,
            ShippingZone.is_all_countries == 0,
        )
    )
    codes: set[str] = set()
    for row in zone_result.scalars().all():
        if row:
            for c in row:
                codes.add(c.strip().upper())

    if not codes:
        return []

    # 查国家主数据（含省份）
    result = await db.execute(
        select(Country)
        .where(Country.code.in_(codes), Country.is_active == 1)
        .options(selectinload(Country.provinces))
        .order_by(Country.sort_order)
    )
    countries = result.scalars().all()

    return [
        CountryOut(
            code=c.code,
            name_zh=c.name_zh,
            name_en=c.name_en,
            provinces=[p.name for p in c.provinces],
        )
        for c in countries
    ]
