"""
SEO Helper：JSON-LD + Meta Tags 生成

使用方式：
    from app.common.seo import generate_product_jsonld, generate_product_seo_tags
"""
from datetime import datetime
from decimal import Decimal
from typing import Any


def generate_product_jsonld(
    product: dict | Any,
    brand: str,
    variants: list,
    tenant_slug: str,
    base_url: str,
) -> dict:
    """
    生成 Product 的 JSON-LD 结构化数据（Schema.org Product）

    Args:
        product: Product 模型字典（ORM to_dict 或直接字典）
        brand: 品牌名称
        variants: [{sku, price, url, image}] 商品变体列表
        tenant_slug: 租户 slug，用于拼接 URL
        base_url: 站点基础 URL

    Returns:
        符合 Schema.org Product 的 dict
    """
    # 统一字段访问（支持 ORM 对象和 dict）
    def g(key: str, default=None):
        if hasattr(product, key):
            return getattr(product, key, default)
        return product.get(key, default)

    name = g("name", "Unknown")
    slug = g("slug", "")
    description = g("description") or ""
    # 截取前 5000 字符（Google 限制）
    description = description[:5000]

    # 商品页 URL
    product_url = f"{base_url.rstrip('/')}/{tenant_slug}/products/{slug}"

    # 主图
    og_image = g("og_image") or g("cover_url") or ""

    # 有效价格（取 base_price 或最低变体价）
    base_price = g("base_price")
    if base_price is None:
        price_values = [
            Decimal(str(v.get("price", 0))) for v in variants if v.get("price")
        ]
        offer_price = price_values[0] if price_values else Decimal("0")
    else:
        offer_price = Decimal(str(base_price))

    # availability: in_stock / out_of_stock / preorder / backorder
    stock_qty = g("stock_qty", 0)
    allow_oversell = g("allow_oversell", 0)
    if stock_qty > 0 or allow_oversell:
        avail = "https://schema.org/InStock"
    else:
        avail = "https://schema.org/OutOfStock"

    # Rating 数据（如有 review 模型，可扩展）
    aggregate_rating: dict | None = None
    # if reviews_count > 0:
    #     aggregate_rating = {
    #         "@type": "AggregateRating",
    #         "ratingValue": str(round(average_rating, 2)),
    #         "reviewCount": str(reviews_count),
    #     }

    # 构建 Offer
    offers_list = []
    if variants:
        for v in variants:
            price_val = Decimal(str(v.get("price", offer_price)))
            offer = {
                "@type": "Offer",
                "price": str(price_val),
                "priceCurrency": "CNY",
                "availability": avail,
                "url": v.get("url", product_url),
            }
            if v.get("image"):
                offer["image"] = v["image"]
            if v.get("sku"):
                offer["sku"] = v["sku"]
            offers_list.append(offer)
    else:
        offers_list.append({
            "@type": "Offer",
            "price": str(offer_price),
            "priceCurrency": "CNY",
            "availability": avail,
            "url": product_url,
        })

    jsonld = {
        "@context": "https://schema.org",
        "@type": "Product",
        "name": name,
        "description": description,
        "url": product_url,
        "image": og_image,
        "brand": {"@type": "Brand", "name": brand} if brand else None,
        "sku": g("sku", ""),
        "offers": offers_list,
    }

    if aggregate_rating:
        jsonld["aggregateRating"] = aggregate_rating

    # 清理 None 值
    return {k: v for k, v in jsonld.items() if v is not None}


def generate_product_seo_tags(
    product_name: str,
    category_name: str = "",
    brand_name: str = "",
    meta_title: str | None = None,
    meta_description: str | None = None,
    site_name: str = "",
) -> dict:
    """
    生成 SEO meta 标签内容（title / description / keywords）

    Args:
        product_name: 商品名称
        category_name: 分类名称
        brand_name: 品牌名称
        meta_title: 已有的 SEO 标题（优先使用）
        meta_description: 已有的 SEO 描述（优先使用）
        site_name: 店铺名称

    Returns:
        {"title": str, "description": str, "keywords": str}
    """
    if meta_title:
        title = meta_title
    else:
        parts = [product_name]
        if brand_name:
            parts.append(brand_name)
        if category_name:
            parts.append(category_name)
        if site_name:
            parts.append(site_name)
        title = " | ".join(parts)

    if meta_description:
        description = meta_description
    else:
        # 自动生成的描述：商品+分类+品牌拼接，截取 160 字符
        parts = [product_name]
        if category_name:
            parts.append(category_name)
        if brand_name:
            parts.append(f"来自{brand_name}")
        description = " - ".join(p for p in parts if p)[:320]

    # keywords：商品+分类+品牌，逗号分隔，去重
    kw_set: set[str] = set()
    for val in [product_name, category_name, brand_name]:
        if val:
            kw_set.update(kw.strip() for kw in val.split() if kw.strip())
    keywords = ", ".join(sorted(kw_set)) if kw_set else product_name

    return {
        "title": title[:160],
        "description": description[:320],
        "keywords": keywords[:500],
    }
