package com.diagbot.facade;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.diagbot.client.UserServiceClient;
import com.diagbot.dto.RespDTO;
import com.diagbot.dto.UserOrgDTO;
import com.diagbot.entity.LantoneProduct;
import com.diagbot.entity.OpenedProducts;
import com.diagbot.entity.OpenedProductsIndex;
import com.diagbot.entity.wrapper.LantoneProductWrapper;
import com.diagbot.entity.wrapper.OpendProductWrapper;
import com.diagbot.enums.IsDeleteEnum;
import com.diagbot.enums.StatusEnum;
import com.diagbot.exception.CommonErrorCode;
import com.diagbot.exception.CommonException;
import com.diagbot.service.impl.LantoneProductServiceImpl;
import com.diagbot.util.BeanUtil;
import com.diagbot.util.DateUtil;
import com.diagbot.util.UserUtils;
import com.diagbot.vo.AddProductsVO;
import com.diagbot.vo.OppendedProductVO;
import com.diagbot.vo.UpdateProductVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

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

/**
 * @Description:产品业务层
 * @author: wangyu
 * @time: 2018/9/19 15:52
 */
@Component
public class LantoneProductFacade extends LantoneProductServiceImpl {
    @Autowired
    private OpenedProductsFacade openedProductsFacade;
    @Autowired
    private UserServiceClient userServiceClient;

    /**
     * 产品线管理添加产品
     *
     * @param addProductsVO 需要提供的参数（产品名称，产品介绍，产品url，产品计费方式）
     * @return Boolean true
     */
    public Boolean addProducts(AddProductsVO addProductsVO) {
        LantoneProduct lantoneProduct = new LantoneProduct();
        BeanUtil.copyProperties(addProductsVO, lantoneProduct);
        lantoneProduct.setGmtCreate(DateUtil.now());
        lantoneProduct.setCreator(UserUtils.getCurrentPrincipleID());
        if (!save(lantoneProduct)) {
            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
                    "产品添加失败");
        }
        return true;
    }


    /**
     * 朗通产品线管理修改产品
     *
     * @param updateProductVO 所需参数（产品名称，url，产品描述，接入模式，收费模式，是否试用）
     * @return Boolean true
     */
    public Boolean updateProduct(UpdateProductVO updateProductVO) {
        LantoneProduct lantoneProduct = this.getById(updateProductVO.getId());
        BeanUtil.copyProperties(updateProductVO, lantoneProduct);
        lantoneProduct.setModifier(UserUtils.getCurrentPrincipleID());
        lantoneProduct.setGmtModified(DateUtil.now());
        if (!updateById(lantoneProduct)) {
            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
                    "产品修改失败");
        }
        return true;
    }

    /**
     * 删除产品业务逻辑
     *
     * @param updateProductVO 所需参数（产品id）
     * @return Boolean true
     */
    public Boolean deleteProduct(UpdateProductVO updateProductVO) {
        LantoneProduct lantoneProduct = getById(updateProductVO.getId());
        OpenedProducts openedProducts = new OpenedProducts();
        openedProducts.setProductId(updateProductVO.getId());
        openedProducts.setServiceStatus(StatusEnum.Enable.getKey());
        if (openedProductsFacade.getOpendById(openedProducts).size() != 0) {
            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
                    "本产品还有用户使用，删除失败");
        }
        lantoneProduct.setModifier(UserUtils.getCurrentPrincipleID());
        lantoneProduct.setGmtModified(DateUtil.now());
        lantoneProduct.setIsDeleted(IsDeleteEnum.Y.getKey());
        if (!updateById(lantoneProduct)) {
            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
                    "产品删除失败");
        }
        return true;
    }

    /**
     * 查询当前用户已开通产品
     *
     * @return 查询当前用户已开通产品
     */
    public List<LantoneProductWrapper> opendedProductByCurrentUser() {
        Long userId = Long.parseLong(UserUtils.getCurrentPrincipleID());
        return this.opendedProductByUserId(userId);
    }

    /**
     * 根据用户id查询是否有开通产品
     *
     * @param page 页数和每页显示的条数默认显示10条
     * @return 根据用户id查询是否有开通产品
     */
    public RespDTO<IPage<LantoneProduct>> productLine(Page page) {
        Long userId = Long.parseLong(UserUtils.getCurrentPrincipleID());
        IPage<LantoneProduct> diagLantoneProducts =null;
        String name =null;
        List<Long> list = openedProductsFacade.getOpendCountByUserId(userId);
        if(list.size()!=0){
            diagLantoneProducts=this.productLine(page,list);
            return RespDTO.onSuc(diagLantoneProducts);
        }
        diagLantoneProducts = this.selectProduct(page,name);
        return RespDTO.onSuc(diagLantoneProducts);
    }


    /**
     * 根据产品id查询产品
     *
     * @param id 产品id
     * @return 产品信息
     */
    public LantoneProduct selectLanProduct(Long id) {
        return getById(id);
    }

    /**
     * 根据产品id查询当条产品线下所有订单信息
     *
     * @param oppendedProductVO 所需参数（产品id，页数，和每页条数，默认显示10条）
     * @return 当条产品线下所有订单信息
     */
    public List<OpendProductWrapper> opendedProduct(OppendedProductVO oppendedProductVO) {
        OpenedProductsIndex openedProductsIndex = new OpenedProductsIndex();
        Long curren = oppendedProductVO.getCurrent();
        Long size = oppendedProductVO.getSize();
        if (curren == null || curren==0) {
            oppendedProductVO.setCurrent(1L);
        }
        if (size == null || curren==0) {
            oppendedProductVO.setSize(10L);
        }
        BeanUtil.copyProperties(oppendedProductVO, openedProductsIndex);
        openedProductsIndex.setIndex((oppendedProductVO.getCurrent().longValue() - 1) * oppendedProductVO.getSize().longValue());
        List<OpendProductWrapper> list = openedProductsFacade.getByProductId(openedProductsIndex);
        List<Long> list1 = new ArrayList<>();
        for (OpendProductWrapper opendProducts : list) {
            Long longs = opendProducts.getUserId();
            list1.add(longs);
        }
        RespDTO<Map<Long, UserOrgDTO>> mapRespDTO = userServiceClient.getUserAndOrg(list1);
        if (mapRespDTO == null || !"0".equals(mapRespDTO.code)) {
            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
                    "获取用户和机构信息失败");
        }
        Map<Long, UserOrgDTO> dataMap = mapRespDTO.data;
        for (OpendProductWrapper bean : list) {
            UserOrgDTO uo = dataMap.get(bean.getUserId());
            if (uo != null) {
                BeanUtil.copyProperties(uo,bean);
            }
        }
        return list;
    }

    /**
     * 用户-分页查询产品信息
     *
     * @param page       分页参数
     * @param name 参数
     * @return 产品信息
     */
    public RespDTO<IPage<LantoneProduct>> index(Page page, String name) {
        IPage<LantoneProduct> res = this.selectProduct(page, name);
        return RespDTO.onSuc(res);
    }
}
