package com.cool.store.service.impl;

import com.cool.store.context.CurrentUserHolder;
import com.cool.store.dto.label.LabelGroupAddDTO;
import com.cool.store.dto.label.LabelGroupDeleteDTO;
import com.cool.store.dto.label.LabelGroupListDTO;
import com.cool.store.dto.label.LabelGroupUpdateDTO;
import com.cool.store.entity.HyPartnerLabelGroupDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.mapper.HyPartnerLabelGroupMapper;
import com.cool.store.mapper.HyPartnerLabelMapper;
import com.cool.store.service.LabelGroupService;
import com.cool.store.vo.LabelGroupListVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @author Fun Li 2023/8/10 13:35
 * @version 1.0
 */
@Service
public class LabelGroupServiceImpl implements LabelGroupService {

    @Autowired
    private HyPartnerLabelGroupMapper labelGroupMapper;

    @Autowired
    private HyPartnerLabelMapper labelMapper;


    @Value("${ec.sync.createUserId:null}")
    private String createUserId;

    /**
     * 查询标签组信息列表
     * @param dto 查询条件
     */
    @Override
    public List<LabelGroupListVo> getLabelGroupList(LabelGroupListDTO dto) {
        HyPartnerLabelGroupDO labelGroupDO = new HyPartnerLabelGroupDO();
        labelGroupDO.setLabelGroupName(dto.getLabelGroupName());
        return labelGroupMapper.getLabelGroupList(labelGroupDO);
    }

    /**
     * 添加标签组
     * @param dto 新增标签组信息
     */
    @Override
    public void addLabelGroup(LabelGroupAddDTO dto) throws ApiException {
        HyPartnerLabelGroupDO labelGroupDO = new HyPartnerLabelGroupDO();
        labelGroupDO.setLabelGroupName(dto.getLabelGroupName());
        if (whetherGroupDuplicated(labelGroupDO)) {
            throw new ApiException(ErrorCodeEnum.LABEL_GROUP_EXIST);
        }
        String userId = CurrentUserHolder.getUserId();
        labelGroupDO.setEditUserId(userId);
        labelGroupDO.setEditDate(new Date());
        labelGroupDO.setCreateUserId(userId);
        labelGroupDO.setUpdateUserId(userId);
        labelGroupMapper.insertSelective(labelGroupDO);
    }

    /**
     * 修改标签组信息
     * @param dto 修改内容
     */
    @Override
    public void updateLabelGroup(LabelGroupUpdateDTO dto) throws ApiException {
        HyPartnerLabelGroupDO labelGroupDO = new HyPartnerLabelGroupDO();
        labelGroupDO.setLabelGroupName(dto.getLabelGroupName());
        labelGroupDO.setId(dto.getId());
        if (whetherGroupDuplicated(labelGroupDO)) {
            throw new ApiException(ErrorCodeEnum.LABEL_GROUP_EXIST);
        }
        String userId = CurrentUserHolder.getUserId();
        labelGroupDO.setId(dto.getId());
        labelGroupDO.setLabelGroupName(dto.getLabelGroupName());
        labelGroupDO.setEditUserId(userId);
        labelGroupDO.setEditDate(new Date());
        labelGroupDO.setUpdateUserId(userId);
        labelGroupMapper.updateByPrimaryKeySelective(labelGroupDO);
    }

    /**
     * 删除标签组
     * @param dto 待删除标签组信息
     */
    @Override
    public void deleteLabelGroup(LabelGroupDeleteDTO dto) throws ApiException {
        if (whetherGroupInUse(dto.getId())) {
            throw new ApiException(ErrorCodeEnum.LABEL_GROUP_IN_USE);
        }
        HyPartnerLabelGroupDO labelGroupDO = new HyPartnerLabelGroupDO();
        String userId = CurrentUserHolder.getUserId();
        labelGroupDO.setId(dto.getId());
        labelGroupDO.setDeleted(Boolean.TRUE);
        labelGroupDO.setUpdateUserId(userId);
        labelGroupMapper.updateByPrimaryKeySelective(labelGroupDO);
    }

    /**
     * 获取所有标签组
     */
    @Override
    public List<LabelGroupListVo> getAllLabelGroupList() {
        HyPartnerLabelGroupDO labelGroupDO = new HyPartnerLabelGroupDO();
        return labelGroupMapper.getLabelGroupList(labelGroupDO);
    }

    @Override
    public HyPartnerLabelGroupDO selectByPrimaryKey(Long id){
       return labelGroupMapper.selectByPrimaryKey(id);
    }

    @Override
    public void addEcLabelGroup(HyPartnerLabelGroupDO hyPartnerLabelGroupDO) {
        hyPartnerLabelGroupDO.setCreateTime(new Date()).setCreateUserId(createUserId).setEditDate(new Date())
                        .setEditUserId(createUserId);
        labelGroupMapper.insertSelective(hyPartnerLabelGroupDO);
    }

    /**
     * 查询标签组信息列表正序
     */
    @Override
    public List<LabelGroupListVo> getLabelGroupListOrder() {
        HyPartnerLabelGroupDO labelGroupDO = new HyPartnerLabelGroupDO();
        return labelGroupMapper.getLabelGroupListOrder(labelGroupDO);
    }

    /**
     * 某个标签组内是否有未删除的标签
     * @param id 标签组 id
     */
    private Boolean whetherGroupInUse(Long id) {
        return labelMapper.whetherGroupInUse(id);
    }

    private Boolean whetherGroupDuplicated(HyPartnerLabelGroupDO labelGroupDO) {
        Long id = labelGroupDO.getId();
        labelGroupDO.setId(null);
        List<HyPartnerLabelGroupDO> hyPartnerLabelGroupDOS = labelGroupMapper.selectSelective(labelGroupDO);
        labelGroupDO.setId(id);
        //如果修改后的标签组名与原标签组名一致也不算重复，但是要记录更新人
        if (hyPartnerLabelGroupDOS != null && hyPartnerLabelGroupDOS.size() > 0) {
            //更新操作还要检查是否与原标签组信息相同，相同的话也不算重复
            if (hyPartnerLabelGroupDOS.get(0).getId().equals(id)) {
                return Boolean.FALSE;
            }
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

}
