package com.xingxi.web.controller.master.product.service.impl;

import com.xingxi.common.enums.EAttrType;
import com.xingxi.common.enums.EDelFlag;
import com.xingxi.common.exception.BusinessException;
import com.xingxi.common.utils.DateUtils;
import com.xingxi.common.utils.ShiroUtils;
import com.xingxi.master.product.domain.ProdAttrJoint;
import com.xingxi.master.product.mapper.ProdAttrJointMapper;
import com.xingxi.web.controller.master.product.domain.ProdAttrVo;
import com.xingxi.web.controller.master.product.mapper.ProdAttrVoMapper;
import com.xingxi.web.controller.master.product.service.IProdAttrVoService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 商品属性Service业务层处理
 *
 * @author xingxi
 * @date 2025-03-06
 */
@Service
public  class ProdAttrVoServiceImpl implements IProdAttrVoService {
    @Resource
    private ProdAttrVoMapper prodAttrVoMapper;
    @Resource
    private ProdAttrJointMapper prodAttrJointMapper;

    /**
     * 查询商品属性VO
     *
     * @param prodAttrId 商品属性ID
     * @return 商品属性VO
     */
    @Override
    public ProdAttrVo selectProdAttrVoByProdAttrId(Long prodAttrId) {
        return prodAttrVoMapper.selectProdAttrVoByProdAttrId(prodAttrId);
    }

    /**
     * 查询商品属性列表
     *
     * @param prodAttrVo 商品属性
     * @return 商品属性
     */
    @Override
    public List<ProdAttrVo> selectProdAttrVoList(ProdAttrVo prodAttrVo) {
        prodAttrVo.setDelFlag(EDelFlag.NO.getVal());
        return prodAttrVoMapper.selectProdAttrVoList(prodAttrVo);
    }

    /**
     * 查询商品属性列表
     *
     * @param prodAttrVo 商品属性
     * @return 商品属性
     */
    @Override
    public List<ProdAttrVo> selectProdAttrJointList(ProdAttrVo prodAttrVo) {
        prodAttrVo.setDelFlag(EDelFlag.NO.getVal());
        return prodAttrVoMapper.selectProdAttrJointList(prodAttrVo);
    }

    /**
     * 添加商品属性
     *
     * @param prodAttrVo 商品属性Vo
     * @return 影响行数
     */
    @Override
    public int addProdAttr(ProdAttrVo prodAttrVo) {
        prodAttrVo.setDelFlag(EDelFlag.NO.getVal());
        prodAttrVo.setCreateUser(ShiroUtils.getLoginName());
        prodAttrVo.setCreateTime(DateUtils.getNowDate());
        int effectRows = prodAttrVoMapper.insertProdAttr(prodAttrVo);
        if (effectRows == 0) {
            throw new BusinessException("新建商品属性时发生错误！");
        }

        if (EAttrType.JOINT.getVal().equals(prodAttrVo.getAttrType())) {
            for (ProdAttrJoint prodAttrJoint : prodAttrVo.getProdAttrJoints()) {
                prodAttrJoint.setProdAttrId(prodAttrVo.getProdAttrId());
                prodAttrJoint.setDelFlag(EDelFlag.NO.getVal());
                prodAttrJoint.setCreateUser(ShiroUtils.getLoginName());
                prodAttrJoint.setCreateTime(DateUtils.getNowDate());
            }
            effectRows = prodAttrJointMapper.batchInsertProdAttrJoint(prodAttrVo.getProdAttrJoints());
        }
        return effectRows;
    }

    /**
     * 修改商品属性
     *
     * @param prodAttrVo 商品属性Vo
     * @return 影响行数
     */
    @Override
    public int updateProdAttr(ProdAttrVo prodAttrVo) {
        prodAttrVo.setUpdateUser(ShiroUtils.getLoginName());
        prodAttrVo.setUpdateTime(DateUtils.getNowDate());
        int effectRows = prodAttrVoMapper.updateProdAttr(prodAttrVo);
        if (effectRows == 0) {
            throw new BusinessException("修改商品属性时发生错误！");
        }

        if (EAttrType.JOINT.getVal().equals(prodAttrVo.getAttrType())) {
            List<String> ids = new ArrayList<>();
            for (ProdAttrJoint prodAttrJoint : prodAttrVo.getProdAttrJoints()) {
                prodAttrJoint.setProdAttrId(prodAttrVo.getProdAttrId());
                prodAttrJoint.setDelFlag(EDelFlag.NO.getVal());
                prodAttrJoint.setCreateUser(ShiroUtils.getLoginName());
                prodAttrJoint.setCreateTime(DateUtils.getNowDate());
                if (prodAttrJoint.getProdAttrJointId() != null) {
                    ids.add(prodAttrJoint.getProdAttrJointId().toString());
                }
            }
            effectRows = prodAttrJointMapper.deleteProdAttrJointByProdAttrJointIds(ids.toArray(new String[0]));
            effectRows = prodAttrJointMapper.batchInsertProdAttrJoint(prodAttrVo.getProdAttrJoints());
        }
        return effectRows;
    }

    /**
     * 删除商品属性
     *
     * @param prodAttrId 商品属性ID
     * @return 影响行数
     */
    @Override
    public int logicDeleteProdAttrByCondition(Long prodAttrId) {
        ProdAttrVo checkProdAttr = prodAttrVoMapper.selectProdAttrVoByProdAttrId(prodAttrId);
        // 如果是属性需要检查是否有商品组合在使用
        if (EAttrType.ATTR.getVal().equals(checkProdAttr.getAttrType())) {
            ProdAttrJoint cond = new ProdAttrJoint();
            cond.setProdAttrId(prodAttrId);
            cond.setProdId(checkProdAttr.getProdId());
            cond.setJointProdAttrId(checkProdAttr.getProdAttrId());
            cond.setDelFlag(EDelFlag.NO.getVal());
            List<ProdAttrJoint> checkResultList = prodAttrJointMapper.selectProdAttrJointList(cond);
            if (checkResultList.size() > 0) {
                throw new BusinessException("商品属性使用中，不能删除！");
            }
        }
        ProdAttrVo prodAttrVo = new ProdAttrVo();
        prodAttrVo.setProdAttrId(prodAttrId);
        return prodAttrVoMapper.logicDeleteProdAttrByCondition(prodAttrVo);
    }
}
