package com.dgtly.goods.service.impl;

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

import com.dgtly.common.constant.UserConstants;
import com.dgtly.common.core.domain.Ztree;
import com.dgtly.common.exception.BusinessException;
import com.dgtly.common.utils.DateUtils;
import com.dgtly.goods.domain.GoodsTypeAttribute;
import com.dgtly.goods.mapper.GoodsTypeAttributeMapper;
import com.dgtly.goods.service.IGoodsInfoService;
import com.dgtly.system.domain.SysDept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dgtly.goods.mapper.GoodsTypeMapper;
import com.dgtly.goods.domain.GoodsType;
import com.dgtly.goods.service.IGoodsTypeService;
import com.dgtly.common.core.text.Convert;
import org.springframework.transaction.annotation.Transactional;

/**
 * 商品分类列Service业务层处理
 * 
 * @author dgtly
 * @date 2020-02-13
 */
@Service
public class GoodsTypeServiceImpl implements IGoodsTypeService 
{
    @Autowired
    private GoodsTypeMapper goodsTypeMapper;
    @Autowired
    private GoodsTypeAttributeMapper goodsTypeAttributeMapper;

    @Autowired
    private IGoodsInfoService goodsInfoService;

    /**
     * 查询商品分类列
     * 
     * @param id 商品分类列ID
     * @return 商品分类列
     */
    @Override
    public GoodsType selectGoodsTypeById(Long id)
    {
        GoodsType gt = goodsTypeMapper.selectGoodsTypeById(id);
        handleAttributeName(gt);
        return gt;
    }

    /**
     * 查询商品分类列列表
     * 
     * @param goodsType 商品分类列
     * @return 商品分类列
     */
    @Override
    public List<GoodsType> selectGoodsTypeList(GoodsType goodsType)
    {
        List<GoodsType> goodsTypes = goodsTypeMapper.selectGoodsTypeList(goodsType);
        handleAttributeName(goodsTypes);
        return goodsTypes;
    }

    /**
     * 新增商品分类列
     * 
     * @param goodsType 商品分类列
     * @return 结果
     */
    @Override
    @Transactional
    public int insertGoodsType(GoodsType goodsType)
    {
        goodsType.setCreateTime(DateUtils.getNowDate());
        int i = goodsTypeMapper.insertGoodsType(goodsType);
        GoodsType type = goodsTypeMapper.selectGoodsTypeById(goodsType.getParentId());
        GoodsType upType = new GoodsType();
        if(i<1){
            throw new RuntimeException("新增类型失败");
        }
        if(type!=null){
            upType.setAncestors(type.getAncestors()+","+goodsType.getId());
        }else{
            upType.setAncestors(0+","+goodsType.getId());
        }
        upType.setId(goodsType.getId());
        i = goodsTypeMapper.updateGoodsType(upType);
        if(i<1){
            throw new RuntimeException("新增类型失败");
        }
        if(goodsType.getGoodsTypeAttributes()!=null&&goodsType.getGoodsTypeAttributes().size()>0){
            int num =goodsTypeAttributeMapper.batchAttribute(goodsType.getGoodsTypeAttributes(),goodsType.getId());
            if(num<goodsType.getGoodsTypeAttributes().size()){
                throw new RuntimeException("新增类型失败");
            }
        }
        return i  ;
    }

    /**
     * 修改商品分类列
     * 
     * @param goodsType 商品分类列
     * @return 结果
     */
    @Override
    @Transactional
    public int updateGoodsType(GoodsType goodsType)
    {
        goodsType.setUpdateTime(DateUtils.getNowDate());
        int i = goodsInfoService.selectGoodsInfoCountByTypeId(goodsType.getId());

        if(i>0&&goodsType.getGoodsTypeAttributes()!=null){
            throw new RuntimeException("分类存在商品时不允许编辑属性");
        }
        //如果有商品 只更新基本属性不更新属性列表
        if(i<=0){
            goodsTypeAttributeMapper.deleteGoodsTypeAttributeByTypeId(goodsType.getId());
            if(goodsType.getGoodsTypeAttributes()!=null){
                int goodsTypeAttributeSize =goodsType.getGoodsTypeAttributes().size();
                int n= goodsTypeAttributeMapper.batchAttribute(goodsType.getGoodsTypeAttributes(),goodsType.getId());
                if(n!=goodsTypeAttributeSize){
                    throw new RuntimeException("分类分类更新失败");
                }
            }
        }
        i = goodsTypeMapper.updateGoodsType(goodsType);

        return i;
    }

    /**
     * 删除商品分类列对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteGoodsTypeByIds(String ids)
    {
        return goodsTypeMapper.deleteGoodsTypeByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除商品分类列信息
     * 
     * @param id 商品分类列ID
     * @return 结果
     */
    @Override
    public int deleteGoodsTypeById(Long id)
    {
        return goodsTypeMapper.deleteGoodsTypeById(id);
    }

    /**
     * 获取商品分类树状结构
     * @param goodsType
     * @return
     */
    @Override
    public List<Ztree> selectGoodsTypeTree(GoodsType goodsType) {
        List<GoodsType> goodsTypes = goodsTypeMapper.selectGoodsTypeList(goodsType);
        List<Ztree> ztrees = initZtree(goodsTypes);
        return ztrees;
    }

    /**
     * 根据条件查询查询数量
     * @param goodsType
     * @return
     */
    @Override
    public Integer selectGoodsTypeCount(GoodsType goodsType) {
        return goodsTypeMapper.selectGoodsTypeCount(goodsType);
    }

    /**
     * 处理商品分类属性名称
     * @param goodsType
     */
    public void handleAttributeName(GoodsType goodsType) {
        String str = "";
        if(goodsType!=null&&goodsType.getGoodsTypeAttributes()!=null&&goodsType.getGoodsTypeAttributes().size()>0){
            for (GoodsTypeAttribute gta:goodsType.getGoodsTypeAttributes()) {
                str+=gta.getAttributeName()+",";
            }
            if(str.length()>2){
                str = str.substring(0,str.length()-2);
            }
            goodsType.setAttributeNames(str);
        }


    }
    /**
     * 处理商品分类属性名称
     * @param goodsTypes
     */
    public void handleAttributeName(List<GoodsType> goodsTypes) {

        for (GoodsType goodsType:goodsTypes) {
            String str = "";
            for (GoodsTypeAttribute gta:goodsType.getGoodsTypeAttributes()) {
                str+=gta.getAttributeName()+",";
            }
            if(str.length()>1){
                str = str.substring(0,str.length()-1);
            }
            goodsType.setAttributeNames(str);
        }

    }

    /**
     * 分类对象转分类树
     *
     * @param goodsTypes 分类列表
     * @return 树结构列表
     */
    public List<Ztree> initZtree(List<GoodsType>goodsTypes )
    {
        List<Ztree> ztrees = new ArrayList<Ztree>();
        for (GoodsType goodsType : goodsTypes)
        {
            Ztree ztree = new Ztree();
            ztree.setId(goodsType.getId());
            ztree.setpId(goodsType.getParentId());
            ztree.setName(goodsType.getName());
            ztree.setTitle(goodsType.getName());
            ztree.setRemake(goodsType.getImg());
            ztree.setOpen(false);
            ztrees.add(ztree);
        }
        return ztrees;
    }
}
