package com.bjtdba.wares.service.impl;

import com.bjtdba.entity.wares.*;
import com.bjtdba.utils.ResponseUtil;
import com.bjtdba.wares.dao.*;
import com.bjtdba.wares.service.PensionService;
import com.bjtdba.wares.service.WaresDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class WaresDetailServiceImpl implements WaresDetailService {

    /**
     * 商品
     */
    @Autowired
    private StoreProductDao storeProductDao;

    /**
     * 查看商品秒杀时间
     */
    @Autowired
    private ProductSeckillDao productSeckillDao;

    /**
     * 商品规格
     */
    @Autowired
    private StoreProductAttrDao storeProductAttrDao;

    /**
     * 商品评论
     */
    @Autowired
    private StoreProductReplyDao storeProductReplyDao;

    /**
     * 商品价格
     */
    @Autowired
    private StoreProductAttrValueDao storeProductAttrValueDao;

    /**
     * 商品详情
     */
    @Autowired
    private StoreProductContentDao storeProductContentDao;

    /**
     * 店铺信息
     */
    @Autowired
    private MerchantDao merchantDao;

    /**
     * 添加规格类
     */
    @Autowired
    private StoreProductAttrSortDao storeProductAttrSortDao;

    /**
     * 养老金
     */
    @Autowired
    private PensionService pensionService;

    /**
     * 注入调用养老金接口
     */
    @Autowired
    private RestTemplate restTemplate;


    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     *
     * @param product_id
     * @return
     * 商品详情
     * 1、判断网站是否开启  SELECT `value` FROM `rrx_system_config_value` WHERE  `config_key` = 'site_open'  AND `mer_id` = 0
     * 2、判断商品是否秒杀  SELECT seckill FROM rrx_store_product WHERE  product_id = 534 LIMIT 1   1是  0不是
     * 3、查询秒杀时间     SELECT id, product_id, seckill_date, status, ctime, mer_id FROM rrx_product_seckill;
     * 3、查询商品相关信息  SELECT
     *                      `product_id`,`mer_id`,`image`,`slider_image`,`store_name`,
     *                      `store_info`,`unit_name`,`price`,`cost`,`ot_price`,`stock`,`
     *                      sales`,`ficti`,`video_link`,`product_type`,`type`,`dc_price`,`seckill`
     *                  FROM `rrx_store_product`
     *                  WHERE (  `is_show` = 1  AND `status` = 1  AND `product_id` = 534  AND `is_used` = 1  AND `is_hide` = 0 )
     *                  AND `rrx_store_product`.`is_del` = '0' LIMIT 1
     * 4、查询商品规格    SELECT * FROM `rrx_store_product_attr` WHERE  `product_id` = 534
     * 5、查询商品价格    SELECT * FROM `rrx_store_product_attr_value` WHERE  `product_id` = 534
     *  养老金    1、查询商品返利类型（1、自定义0、系统） 。
     *          商户单独设置商品返利比例养老金计算公式：
     *         【商品价格-商品的价格*手续费（extension_one表 查询config_key = online_yanglao）】*返利比例（商户单独设置商品返利比例）*yanglaojin_admin（rrx_system_config_value表）
     *          2、系统返利分为两种：（1、商户设置的默认返利，2、储蓄保平台设置的返利）
     *          3、查询rrx_system_config_value表，查看商户设置的返利比例是否为0。（查询config_key=base_commission and mer_id = 商户ID）
     *              计算养老金公式：【商品价格-商品的价格*手续费（rrx_system_config_value表 查询config_key = online_yanglao）】*返利比例（商户默认比例）*yanglaojin_admin（rrx_system_config_value表）
     *          4、储蓄保平台默认养老金比例：
     *          【商品价格-商品的价格*手续费（rrx_system_config_value表 查询config_key = online_yanglao）】*返利比例（储蓄保平台默认比例）*yanglaojin_admin（rrx_system_config_value表）
     *
     *
     * 6、查询商品详情    SELECT * FROM rrx_store_product_content WHERE  product_id = 534
     * 7、获取用户对商品的评论 SELECT
     *                      reply_id,uid,nickname,merchant_reply_content,
     *                      avatar,order_product_id,product_id,product_score,
     *                      service_score,postage_score,comment,pics,create_time
     *                      FROM rrx_store_product_reply
     *                      WHERE  product_id = 534
     *                      ORDER BY product_score DESC,
     *                      service_score DESC,
     *                      postage_score DESC,
     *                      create_time DESC
     *  8、查询商户信息    SELECT mer_id,mer_name,mer_avatar,product_score,
     *                      service_score,postage_score,service_phone,care_count
     *                  FROM rrx_merchant
     *                  WHERE mer_id = 149   商户ID
     *  9、推荐相似商品：rrx_store_product表   SELECT * FROM rrx_store_product rsp  ORDER BY RAND() LIMIT 3
     *
     */
    @Override
    public Object waresDetail(Integer product_id) {
        Map<String, Object> data = new HashMap<>();
        /**
         * 1、判断该网站是否开放，肯定后期会舍去该功能。SELECT `value` FROM `rrx_system_config_value` WHERE  `config_key` = 'site_open'  AND `mer_id` = 0
         */
        //String  whetherOpen = waresDetailDao.getByMerId(mer_id);

        /**
         * 2、判断商品是否为秒杀商品  判断商品是否秒杀 传参商品ID  SELECT seckill FROM rrx_store_product WHERE  product_id = 534 LIMIT 1   1是  0不是
         */
            Integer seckill = storeProductDao.selectSechillByProductId(product_id);
        /**
         * 3、查询秒杀的时间 SELECT id, product_id, seckill_date, status, ctime, mer_id FROM rrx_product_seckill;
         */
            if(seckill == 1){
                ProductSeckill productSeckill = productSeckillDao.selectSeckillByProductId(product_id);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                try {
                    long millionSeconds = sdf.parse(productSeckill.getSeckill_date()).getTime()+60*60*1000;
                    productSeckill.setStart_time(productSeckill.getSeckill_date());
                    productSeckill.setEnd_time(sdf.format(new Date(millionSeconds)));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                data.put("productSeckill",productSeckill);
            }
        /**
         * 4、查询商品的相关信息
         */
        StoreProduct storeProduct = storeProductDao.selectByProductId(product_id);
        List<String> sliderList =(Arrays.asList(storeProduct.getSlider_image().split(",")));
        storeProduct.setSlider_image_list(sliderList);//商品轮播列表
        /**
         * 5、查询商品的价格   SELECT * FROM `rrx_store_product_attr_value` WHERE  `product_id` = 534
         *    查询sku 第一个的商品价格等信息
         */
        StoreProductAttrValue storeProductAttrValue = storeProductAttrValueDao.selectByProductId(product_id);
        BigDecimal yanglaojin = pensionService.pension(storeProductAttrValue);
        storeProductAttrValue.setYanglao_price(yanglaojin);
        /**
         * 使用接口的方式请求结算养老金
         */
          //List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("pension_service");
          //ServiceInstance instance = serviceInstanceList.get(0);
//        EurekaConfig eurekaConfig = new EurekaConfig();
//        String a = eurekaConfig.getEurekaConfig("pension_service");
//        String url = "http://127.0.0.1:8002/api/pensionService/pension";
//        BigDecimal yanglaojing = restTemplate.postForObject(url,storeProductAttrValue,BigDecimal.class);

        /**
         *6、查询商品详情    SELECT * FROM rrx_store_product_content WHERE  product_id = 534
         */
        StoreProductContent storeProductContent = storeProductContentDao.selectByProductId(product_id);
        storeProductContent.setIosContent("<html><head></head><body>"+storeProductContent.getContent()+"</body><html>");
        /**
         *7、获取用户对商品的评论
         */
        List<StoreProductReply> storeProductReplyList = storeProductReplyDao.selectByProductId(product_id);
        /**
         *8、查询商户信息
         */
        Merchant merchant = merchantDao.selectByMerId(storeProduct.getMer_id());
        /**
         * 获取商品规格和类别
         */
        List<StoreProductAttr> storeProductAttrList = storeProductAttrList(product_id);
        data.put("storeProduct",storeProduct);
        data.put("storeProductAttrList",storeProductAttrList);
        data.put("storeProductAttrValue",storeProductAttrValue);
        data.put("storeProductContent",storeProductContent);
        data.put("storeProductReplyList",storeProductReplyList);
        data.put("merchant",merchant);
        return ResponseUtil.ok(data);
    }

    /**
     * 商品规格查询
     * 1、查询商品的类别  在rrx_store_product_attr表中增加attrid（类别ID0001）
     * 2、根据类别ID查询，类别分类  新建规格表  product_id  attr_id 类别ID 类别名称  is_del   createtime
     * 3、在rrx_store_product_attr_value 表新增skuid （由商品ID+类别ID+分类ID） 后期可以直接弃用sku，和京东商城类似
     * 4、单规格的 类别ID和分类ID 全部都是0000
     * 后台管理新增规格
     */

    private List<StoreProductAttr> storeProductAttrList(Integer product_id) {
        /**
         * 创建一个返回的商品规格对象
         */
        List<StoreProductAttr> returnStoreProductAttrList = new ArrayList<>();
        List<String> attrvValuesList = null;
        /**
         * 4、查询商品规格    SELECT * FROM `rrx_store_product_attr` WHERE  `product_id` = 534
         */
        List<StoreProductAttr> storeProductAttrList = storeProductAttrDao.selectByProductId(product_id);
        /**
         * 1、查询rrx_store_product_attr表中的类别，同时判断规格id 是否为空
         *      假设为空，系统生成规格ID
         *      不为空继续
         *  2、拆分 attr_values中的值规格类别，同时判断类别表内是否有该类别。
         *      假设没有 生成类别ID，入库类别表。同时返回给前段
         */
        for(int i=0;i<storeProductAttrList.size();i++){
            StoreProductAttr storeProductAttr = new StoreProductAttr();//规格对象
            List<StoreProductAttrSort> storeProductAttrSortList = new ArrayList<>();//创建一个类别的list对象
            storeProductAttrList.get(i).getAttr_id();
            if(storeProductAttrList.get(i).getAttr_id()==null||"".equals(storeProductAttrList.get(i).getAttr_id())){
                String attr_index = "";
                if(i>9){
                    attr_index = new StringBuffer(i+1).reverse().toString();
                }else {
                    attr_index = "0"+(i+1);
                }
                //随后将attr_id写入数据库中
                String attr_id="00"+attr_index;//规格ID
                storeProductAttr.setAttr_id(attr_id);
                String attr_name = storeProductAttrList.get(i).getAttr_name();
                storeProductAttr.setAttr_name(attr_name);//规格名称
                storeProductAttrDao.updateAttrIdByProductId(product_id,attr_name,attr_id);
                /**
                 * 类别list
                 */
                attrvValuesList = Arrays.asList(storeProductAttrList.get(i).getAttr_values().split("-!-"));
                /**
                 * 循环类别名称，同时添加sort_id
                 */
                for(int j=0 ; j<attrvValuesList.size();j++){
                    StoreProductAttrSort storeProductAttrSort = new StoreProductAttrSort();
                    storeProductAttrSort.setSort_name(attrvValuesList.get(j));
                    String sort_id = "";
                    if(j>=9){
                        sort_id = (j+1)+attr_index;
                    }else {
                        sort_id = "0"+(j+1)+attr_index;
                    }
                    storeProductAttrSort.setSort_id(sort_id);
                    storeProductAttrSort.setAttr_id(attr_id);
                    storeProductAttrSort.setProduct_id(storeProductAttrList.get(i).getProduct_id());
                    storeProductAttrSortList.add(storeProductAttrSort);
                }
                /**
                 * 将storeProductAttrSortList 数据批量添加到rrx_store_product_attr_sort表中
                 */
                storeProductAttrSortDao.insertStoreProductAttrSort(storeProductAttrSortList);

            }else{
                storeProductAttr.setProduct_id(storeProductAttrList.get(i).getProduct_id());
                storeProductAttr.setAttr_name(storeProductAttrList.get(i).getAttr_name());
                storeProductAttr.setAttr_id(storeProductAttrList.get(i).getAttr_id());
                /**
                 * 如果数据库中有attr_id的话直接查询分类表
                 */
                storeProductAttrSortList = storeProductAttrSortDao.selectByprofuctIdAttrId(storeProductAttrList.get(i).getProduct_id(),storeProductAttrList.get(i).getAttr_id());
            }
            /**
             * 将规格名称   规格ID   类别名称   类别ID
             */
            storeProductAttr.setStoreProductAttrSortList(storeProductAttrSortList);
            returnStoreProductAttrList.add(storeProductAttr);
        }
        return returnStoreProductAttrList;
    }

    /**
     * 查询商品的价格以及sku等信息   sort_id 多个用，隔开
     */
    public Object productAttrValue(Integer product_id,String sort_ids){
        Map<String, Object> data = new HashMap<>();
        /**
         * 分割字符串
         * List<String> sliderList =(Arrays.asList(storeProduct.getSlider_image().split(",")));
         */
        List<String> sortIdList = Arrays.asList(sort_ids.split(","));
        List<StoreProductAttrSort> storeProductAttrSor = storeProductAttrSortDao.selectByProductId(product_id,sortIdList);
        String skus = "";
        for(int i = 0;i<storeProductAttrSor.size();i++){
            skus +=storeProductAttrSor.get(i).getSort_name()+",";
        }
        System.out.println(skus.substring(0,skus.length()-1));
        String sku = skus.substring(0,skus.length()-1);
        /**
         * product_id+sku 查询对象商品的价格等
         */
        StoreProductAttrValue storeProductAttrValue = storeProductAttrValueDao.selectByProductIdAndSku(product_id,sku);
        BigDecimal yanglaojin = pensionService.pension(storeProductAttrValue);
        storeProductAttrValue.setYanglao_price(yanglaojin);
        data.put("storeProductAttrValue",storeProductAttrValue);
        return ResponseUtil.ok(data);
    }
}
