package com.diaoyun.zion.master.util.spider;

import com.diaoyun.zion.chinafrica.enums.PlatformEnum;
import com.diaoyun.zion.chinafrica.vo.*;
import com.diaoyun.zion.master.util.JsoupUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.math.BigDecimal;
import java.util.*;

import static com.diaoyun.zion.master.util.spider.SpiderUtil.exchangeRate;

/**
 * H&M 爬虫数据解析
 * @see com.diaoyun.zion.chinafrica.bis.impl.HmSpider
 * @author 爱酱油不爱醋
 */
public class HMSpiderParse {

    /**
     * 格式化返回数据
     * @param content 页面数据
     * @return 格式化后的数据
     */
    public static ProductResponse formatProductResponse(String content) {

        // targetUrl=https://m2.hm.com/m/zh_cn/productpage.0806412004.html

        // 获取主要数据并将转换 Json 数据及 Document 对象
        String detailStr = JsoupUtil.getScriptContent(content, "productArticleDetails");
        int firstBrackets = detailStr.indexOf("{");
        int lastbrackets = detailStr.lastIndexOf("}");
        String resultStr = detailStr.substring(firstBrackets,lastbrackets+1);
        resultStr = resultStr.replaceAll("\'", "\"")
                .replaceAll("\"image\": isDesktop [?] ", "")
                .replaceAll("\"fullscreen\": isDesktop [?] ", "")
                .replaceAll("\"zoom\": isDesktop [?] ", "");
        JSONObject dataMap = JSONObject.fromObject(resultStr);
        Document document = Jsoup.parse(content);

        // 声明封装类
        ProductResponse productResponse = new ProductResponse();
        // 属性：Zara 的商品属性有颜色、尺码
        Map<String, Set<ProductProp>> productPropSet = new HashMap<>(16);
        // 原始价
        List<OriginalPrice> originalPriceList = new ArrayList<>();
        // 促销价格
        List<ProductPromotion> promotionList = new ArrayList<>();
        // 库存
        DynStock dynStock = new DynStock();
        // 其实数据没有包含确切的库存数，这里默认给足量的库存
        dynStock.setSellableQuantity(9999);

        //////////////////////////////////// 获取商品基本信息 ////////////////////////////
        ItemInfo itemInfo = new ItemInfo();
        itemInfo.setShopName(PlatformEnum.HM.getLabel());
        itemInfo.setShopUrl("https://www2.hm.com/");
        itemInfo.setItemId(document.select("div[class=article-code]").select("li").text());
        itemInfo.setTitle(document.select("h1[class=primary product-item-headline]").text());
        //////////////////////////////////// 获取商品基本信息(图片下取)End /////////////////////////

        //////////////////////////////////// 获取商品颜色属性 ////////////////////////////////////////////
        // 取页面的数据
        Elements colorEle = document.select("div[class=mini-slider]").select("ul[class=inputlist clearfix]").select("li");
        Map<String, String> colorMap = new HashMap<>(16);
        Set<ProductProp> propSet = new HashSet<>(16);
        for (Element element : colorEle) {

            ProductProp productPropColor = new ProductProp();
            String color = element.select("a").attr("data-color");
            String colorNo = element.select("a").attr("data-articlecode");
            String imgUrl = element.select("noscript").attr("data-src");

            colorMap.put(colorNo, color);

            itemInfo.setPic(imgUrl);
            productPropColor.setPropId(colorNo);
            productPropColor.setPropName(color);
            productPropColor.setImage(imgUrl);
            propSet.add(productPropColor);

            if (productPropSet.get("颜色") == null) {
                productPropSet.put("颜色", propSet);
            } else {
                Set<ProductProp> oldPropSet = productPropSet.get("颜色");
                propSet.addAll(oldPropSet);
                productPropSet.put("颜色", propSet);
            }
        }
        //////////////////////////////////// 获取商品颜色属性 END ////////////////////////////////////////////

        ///////////////////////// 获取商品尺码属性 ///////////////////////////////////////////////////////////
        Map<String, String> sizeMap = new HashMap<>(16);
        Map<String, Map<String, String>> colorHaveSizeMap = new HashMap<>(16);
        Set<ProductProp> sizePropSet = new HashSet<>();

        for (Map.Entry<String, String> entry : colorMap.entrySet()) {
            JSONArray sizeArr = dataMap.getJSONObject(entry.getKey()).getJSONArray("sizes");
            for (int i = 0; i < sizeArr.size(); i++) {
                JSONObject sizeObj = sizeArr.getJSONObject(i);

                ProductProp productPropSize = new ProductProp();
                String sizeNo = sizeObj.getString("sizeCode");
                String size = sizeObj.getString("name");

                sizeMap.put(sizeNo, size);

                productPropSize.setPropId(sizeNo);
                productPropSize.setPropName(size);
                sizePropSet.add(productPropSize);
                if (productPropSet.get("尺码") == null) {
                    productPropSet.put("尺码", sizePropSet);
                } else {
                    Set<ProductProp> oldPropSet = productPropSet.get("尺码");
                    sizePropSet.addAll(oldPropSet);
                    productPropSet.put("尺码", sizePropSet);
                }
            }
            colorHaveSizeMap.put(entry.getKey(), sizeMap);
        }
        ///////////////////////// 获取商品尺码属性 END/////////////////////////////////////////////////////
        productResponse.setStockFlag(true);
        List<ProductSkuStock> productSkuStockList = dynStock.getProductSkuStockList();

        // 获取价格
        String fullPrice = document.select("div[class=primary-row product-item-price]").text();
        fullPrice = SpiderUtil.retainNumber(fullPrice);
        // TODO 转换汇率，目前商品单位是人民币
        fullPrice = exchangeRate(fullPrice);
        BigDecimal priceOld = new BigDecimal(fullPrice);
        BigDecimal div = new BigDecimal("100");
        fullPrice = priceOld.divide(div, 2, BigDecimal.ROUND_DOWN).toString();

        if (productSkuStockList == null) {
            productSkuStockList = new ArrayList<>();
        }
        for (Map.Entry<String, Map<String, String>> colorEntry : colorHaveSizeMap.entrySet()) {
            for (Map.Entry<String, String> sizeEntry : sizeMap.entrySet()) {
                // 设置 skuStr
                String skuStr = ";" + colorEntry.getKey() + ";" + sizeEntry.getKey() + ";";

                //////////////////////////////////// 获取库存 ////////////////////////////////////////////
                // H&M 尚未可用的库存
                ProductSkuStock productSkuStock = new ProductSkuStock();
                productSkuStock.setSkuStr(skuStr);
                productSkuStock.setSellableQuantity(999);
                productSkuStockList.add(productSkuStock);

                dynStock.setProductSkuStockList(productSkuStockList);
                //////////////////////////////////// 获取库存 END/////////////////////////////////////////

                //////////////////////////////////// 获取原始价 //////////////////////////////////
                OriginalPrice originalPrice = new OriginalPrice();

                originalPrice.setSkuStr(skuStr);
                originalPrice.setPrice(fullPrice);
                originalPriceList.add(originalPrice);

                productResponse.setPrice(fullPrice);
                productResponse.setSalePrice(fullPrice + "-" + fullPrice);
                //////////////////////////////////// 获取原始价 END//////////////////////////////////
            }
        }
        productResponse.setPropFlag(true);
        productResponse.setProductPropSet(productPropSet);
        productResponse.setPlatform(PlatformEnum.HM.getValue());
        productResponse.setPromotionList(promotionList);
        productResponse.setOriginalPriceList(originalPriceList);
        productResponse.setItemInfo(itemInfo);
        productResponse.setDynStock(dynStock);
        return productResponse;
    }
}
