package cn.qihangerp.model.request;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 外部系统统一商品上架/同步入参（Canonical，全平台同一套字段）。
 * <p>平台差异由本服务内部映射处理；{@link #shopId} 为店铺维度标识并写入商品表，<b>不校验</b> {@code o_shop}。</p>
 *
 * @author guochengyu
 */
@Data
public class ExternalGoodsUpsertRequest {

    /**
     * 店铺维度标识（写入 {@code o_goods}/{@code o_goods_sku}）；<b>不校验</b> {@code o_shop} 表是否存在。
     */
    private Long shopId;

    /**
     * 目标平台枚举：PDD/TAO/JD/DOU/WEIXIN/KWAI/XHS（与 EnumShopType 命名一致）
     */
    private String platform;

    /**
     * 外部系统商品 ID（幂等键，店铺维度唯一）
     */
    private String outGoodsId;

    /**
     * 拼多多侧商品 ID（{@code goods_id}）。调用方在「本店该商品货架已上架且 extension 已存 pddGoodsId」时传入，
     * 服务端将走 {@code pdd.goods.information.update}（与 {@code pdd.goods.add} 相同的顶层表单字段形态），而不再 {@code pdd.goods.add}
     * （需 {@code publish-enabled=true}）。
     */
    @JsonProperty("pddGoodsId")
    @JsonAlias({"pdd_goods_id"})
    private Long pddGoodsId;

    /**
     * 微信小店侧商品 ID（{@code product_id}）。二次上架/更新时由调用方从货架 extension 等来源传入，走 {@code channels.ec.product.update}。
     */
    @JsonProperty("sphProductId")
    @JsonAlias({"sph_product_id", "productId"})
    private Long sphProductId;

    /**
     * 商品标题
     */
    private String title;

    /**
     * 主图 URL；可与 {@link #images} 二选一或同时传（同时传时建议首张与 mainImage 一致）
     */
    private String mainImage;

    /**
     * 轮播图 URL 列表（有序）
     */
    private List<String> images;

    /**
     * 详情图 URL 列表（有序）
     */
    private List<String> detailImages;

    /**
     * 主图/详情视频等（公网可访问 URL）
     */
    private String videoUrl;

    /**
     * 标准类目编码（非平台 catId，由本服务映射到各平台叶子类目）
     */
    private String categoryCode;

    /**
     * 标准品牌编码（非平台 brandId）
     */
    private String brandCode;

    /**
     * 商品属性（非销售规格）
     */
    private List<AttributeItem> attributes;

    /**
     * 销售属性维度（如颜色、尺码等，values 为该维度可选值集合）
     */
    private List<SalesAttributeItem> salesAttributes;

    /**
     * 参考价/划线价（与平台展示口径可能不同，由适配层换算）
     */
    private BigDecimal marketPrice;

    /**
     * 承诺发货时效（小时），如 24、48
     */
    private Integer shipWithinHours;

    /**
     * 是否支持 7 天无理由（语义统一，各平台映射）
     */
    private Boolean isRefundable;

    /**
     * 是否预售
     */
    private Boolean isPreSale;

    /**
     * 是否二手
     */
    private Boolean isSecondHand;

    /**
     * 运费模板编码（本服务内映射到平台 templateId）
     */
    private String logisticsTemplateCode;

    /** 商品编号（商家侧） */
    private String goodsNum;

    private String province;
    private String city;
    private String town;

    private String barCode;

    private BigDecimal purPrice;
    private BigDecimal wholePrice;
    /** SPU 层建议零售价；可与 SKU salePrice 并存 */
    private BigDecimal retailPrice;
    private BigDecimal unitCost;

    /**
     * 商品外链（详情页/H5 等，非必填）
     */
    private String linkUrl;

    /**
     * 扩展 KV（禁止放平台私有字段名；仅放业务扩展）
     */
    private Map<String, String> ext;

    private List<Sku> skus;

    /**
     * 拼多多 POP 凭证（<b>每次请求</b>由调用方传入）。当 {@code platform=PDD} 且服务端
     * {@code external.pdd.publish-enabled=true} 时<b>必填</b>；不依赖 {@code o_shop}。
     */
    private PddPopAuth pddPopAuth;

    /**
     * 微信视频号小店凭证（与 {@link PddPopAuth} 形态一致：appId/secret + 店铺 access_token）。
     * 当 {@code platform=WEIXIN}（{@link cn.qihangerp.common.enums.EnumShopType#WEIXIN}）且 {@code external.sph.publish-enabled=true} 时<b>必填</b>。
     */
    private SphPopAuth sphPopAuth;

    @Data
    public static class PddPopAuth {
        @JsonAlias({"app_key", "clientId", "client_id"})
        private String appKey;

        @JsonAlias({"app_secret", "clientSecret", "client_secret"})
        private String appSecret;

        @JsonAlias({"access_token", "token", "sessionKey", "session_key"})
        private String accessToken;

        /** 可选；非空则作为 POP gateway，否则用服务端 {@code external.pdd.gateway-url} */
        @JsonAlias({"gateway_url", "popGatewayUrl"})
        private String gatewayUrl;
    }

    @Data
    public static class SphPopAuth {
        @JsonAlias({"app_key", "clientId", "client_id"})
        private String appKey;

        @JsonAlias({"app_secret", "clientSecret", "client_secret"})
        private String appSecret;

        @JsonAlias({"access_token", "token", "sessionKey", "session_key"})
        private String accessToken;

        @JsonAlias({"gateway_url", "channelsGatewayUrl"})
        private String gatewayUrl;
    }

    @Data
    public static class AttributeItem {
        private String code;
        private String name;
        private String value;
        private String unit;
        /** 拼多多类目属性 {@code ref_pid}，与 {@code value} 一并写入 {@code goods_properties} */
        @JsonProperty("refPid")
        @JsonAlias({"ref_pid", "refPid"})
        private Long refPid;
        @JsonAlias({"vid"})
        private Long vid;
    }

    @Data
    public static class SalesAttributeItem {
        private String code;
        private String name;
        private List<String> values;
    }

    @Data
    public static class Sku {
        private String outSkuId;
        private String skuCode;
        private String skuName;
        /** 单买价/常规售价 */
        private BigDecimal salePrice;
        /** 团购价/拼团价等（PDD multi_price 等映射来源） */
        private BigDecimal groupPrice;
        private Integer stockQty;
        private Long weightGram;
        private String barCode;
        private String imageUrl;
        private List<SkuAttributeValue> attributeValues;

        private BigDecimal purPrice;
        private BigDecimal retailPrice;
        private BigDecimal unitCost;
    }

    @Data
    public static class SkuAttributeValue {
        private String code;
        private String value;
    }
}
