# backend/app/plugins/unit_split/services.py
"""单位换算辅助服务"""
from decimal import Decimal
from typing import Optional
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.plugins.unit_split.models import ProductSellingUnit


async def resolve_selling_unit(
    db: AsyncSession,
    tenant_id: int,
    product_id: int,
    unit_name: str,
) -> Optional[tuple[int, Optional[Decimal]]]:
    """
    查找商品的销售单位配置。
    返回 (qty_per_base, price_override)，找不到返回 None。
    """
    r = await db.execute(
        select(ProductSellingUnit).where(
            ProductSellingUnit.tenant_id == tenant_id,
            ProductSellingUnit.product_id == product_id,
            ProductSellingUnit.unit_name == unit_name,
        )
    )
    unit = r.scalar_one_or_none()
    if unit is None:
        return None
    return (unit.qty_per_base, unit.price_override)


def format_stock_display(stock_qty: Decimal, base_unit_name: str, units: list) -> str:
    """
    将基础单位库存换算为"10箱1个（共241个）"格式。
    units: list of objects with unit_name, qty_per_base, is_base_unit attributes.
    """
    non_base = [u for u in units if not u.is_base_unit]

    if not non_base:
        return f"{stock_qty}{base_unit_name}"

    # 找最大单位（qty_per_base 最大）
    largest = max(non_base, key=lambda u: u.qty_per_base)
    boxes = stock_qty // largest.qty_per_base
    remainder = stock_qty % largest.qty_per_base

    parts = []
    if boxes > 0:
        parts.append(f"{boxes}{largest.unit_name}")
    if remainder > 0:
        parts.append(f"{remainder}{base_unit_name}")
    compound = "".join(parts) if parts else f"0{base_unit_name}"
    return f"{compound}（共{stock_qty}{base_unit_name}）"


async def seed_system_unit_dict(db: AsyncSession, tenant_id: int) -> None:
    """Insert built-in unit dict entries for a tenant if they don't exist yet."""
    from app.plugins.unit_split.models import ProductUnitDict

    system_units = [
        ("个", "Piece"),
        ("箱", "Box"),
        ("打", "Dozen"),
        ("托盘", "Pallet"),
        ("包", "Pack"),
    ]
    for unit_name, unit_name_en in system_units:
        existing = await db.execute(
            select(ProductUnitDict).where(
                ProductUnitDict.tenant_id == tenant_id,
                ProductUnitDict.unit_name == unit_name,
            )
        )
        if existing.scalar_one_or_none() is None:
            db.add(ProductUnitDict(
                tenant_id=tenant_id,
                unit_name=unit_name,
                unit_name_en=unit_name_en,
                is_system=1,
            ))
    await db.commit()
