package cn.qihangerp.service.external.pdd;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 拼多多 POP 网关与上架映射（内部配置，不暴露给外部调用方）。
 *
 * @author guochengyu
 */
@Data
@ConfigurationProperties(prefix = "external.pdd")
public class ExternalPddProperties {

    /**
     * 是否在 upsert 成功后尝试调用 pdd.goods.add
     */
    private boolean publishEnabled = false;

    /**
     * 是否允许调用 {@code pdd.goods.sale.status.set}（下架时 {@code is_onsale=0}）。
     */
    private boolean saleStatusSetEnabled = true;

    /**
     * 发品前是否将外链图片经 POP 图片上传接口上传到拼多多图床，并用返回 URL 替换
     * {@code carousel_gallery}/{@code detail_gallery}/{@code sku_list[].thumb_url}（去重上传）。
     */
    private boolean imageUploadEnabled = true;

    /**
     * 单张图片最大下载字节（默认 3MB，与常见平台主图上限一致）
     */
    private long imageUploadMaxBytes = 3145728L;

    /**
     * 允许下载的图片 URL 域名后缀（SSRF 防护）：如 {@code etjbooks.com.cn} 可匹配 {@code oss.etjbooks.com.cn}。
     * 为空则不允许下载任何外链（须显式配置）。
     */
    private List<String> imageUploadAllowedHostSuffixes = new ArrayList<>(List.of("etjbooks.com.cn"));

    /**
     * 命中后缀则视为已在拼多多侧，跳过重传（小写比较，支持子域）。
     */
    private List<String> imageUploadSkipHostSuffixes = new ArrayList<>(List.of(
            "pddpic.com", "pinduoduo.com", "yangkeduo.com"));

    /**
     * 是否在图床上传路径上对下载后的图片做「商品编辑」线素材规则校验（轮播/商详/SKU）。
     * 关闭后仅上传不校验；关闭图床上传（{@link #imageUploadEnabled}=false）时本项不生效（无下载字节）。
     */
    private boolean materialValidationEnabled = true;

    /**
     * POP 网关地址
     */
    private String gatewayUrl = "https://gw-api.pinduoduo.com/api/router";

    /**
     * Canonical categoryCode -> 拼多多叶子类目 cat_id
     */
    private Map<String, Long> categoryMap = new LinkedHashMap<>();

    /**
     * logisticsTemplateCode 或 DEFAULT -> cost_template_id
     */
    private Map<String, Long> costTemplateMap = new LinkedHashMap<>();

    private int defaultGoodsType = 1;
    private int defaultCountryId = 0;
    /** 承诺发货秒数，如 172800=48h */
    private long defaultShipmentLimitSecond = 172800L;
    private boolean defaultIsFolt = true;
    private boolean defaultIsPreSale = false;
    private boolean defaultIsRefundable = true;
    private boolean defaultSecondHand = false;

    /**
     * {@code pdd.goods.add} 根级 {@code two_pieces_discount}（满件折，默认 99 表示 99 折）
     */
    private int twoPiecesDiscount = 99;

    /**
     * 拼单价 = 建议零售价 ×（本值/100），默认 75 即七五折；为百分比整数，非分。
     */
    private int groupBuyDiscountPercent = 75;

    /**
     * 单买价（分）= 拼单价（分）+ 本值；须为正（分），默认 200=2 元。
     */
    private long singleBuyAddFen = 200L;

    /**
     * 图书等类目「ISBN编号」在 {@code goods_properties} 中的 {@code ref_pid}（以 {@code pdd.goods.cat.rule.get} 为准，常见 425）。
     * 当请求 {@code ext.isbn} 有值且本值 &gt; 0 时自动拼接一条属性；为 0 则关闭自动拼接。
     */
    private long isbnGoodsPropertyRefPid = 425L;

    /**
     * 是否根据 {@code pdd.goods.cat.rule.get} 中 {@code goods_properties_rule} 的必填项自动补全 {@code goods_properties}。
     */
    private boolean fillGoodsPropertiesFromCatRule = true;

    /**
     * 与单次请求 {@code skus} 列表顺序一一对应（过滤掉 null 后的顺序），
     * 每条对应 PDD sku_list 一项的 spec_id_list 与 sku_properties。
     * <p>若为空且开启 {@link #autoResolveSpecIdsWhenSkuOverridesEmpty}，将尝试用 cat.rule + spec.id.get 自动生成。</p>
     */
    private List<PddSkuOverride> skuOverrides = new ArrayList<>();

    /**
     * 发布前自动调用 pdd.goods.cat.rule.get（结果片段写入接口返回便于排查）
     */
    private boolean autoFetchCatRule = false;

    /**
     * 当 {@link #skuOverrides} 为空时，根据类目规则找销售 parent_spec_id，并对每个 SKU 调 pdd.goods.spec.id.get（规格名=skuName）
     */
    private boolean autoResolveSpecIdsWhenSkuOverridesEmpty = false;

    @Data
    public static class PddSkuOverride {
        /**
         * 文档示例："[25]" 或 "[20,5]"
         */
        private String specIdList;
        private List<PddSkuProperty> properties = new ArrayList<>();
    }

    @Data
    public static class PddSkuProperty {
        private Long refPid;
        private Long vid;
        private String value;
        private String punit;
    }
}
