package com.copy.trade.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.copy.trade.dao.TraderTagMapper;
import com.copy.trade.entity.po.Tag;
import com.copy.trade.entity.po.TraderTag;
import com.copy.trade.service.ITagService;
import com.copy.trade.service.ITraderTagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 交易员标签表 服务实现类
 * </p>
 *
 * @author wz
 * @since 2022-11-12
 */
@Service
public class TraderTagServiceImpl extends ServiceImpl<TraderTagMapper, TraderTag> implements ITraderTagService {

    @Autowired
    private ITraderTagService traderTagServiceImpl;

    @Autowired
    private ITagService tagServiceImpl;

    @Override
    public List<Tag> list(Long traderId) {
        return ((TraderTagMapper)baseMapper).traderTagByTraderId(traderId);
    }

    @Override
    @Transactional
    public Boolean update(Long traderId, List<Long> tagIdList) {
        //1.获取用户标签列表
        QueryWrapper<TraderTag> traderTagQueryWrapper = new QueryWrapper<>();
        traderTagQueryWrapper.eq("trader_id",traderId);
        List<TraderTag> traderTagList = list(traderTagQueryWrapper);
        //2.找出交集
        Map<Long, TraderTag> tagIdDbMap = new HashMap<>();
       traderTagList.forEach(traderTag -> {
           tagIdDbMap.put(traderTag.getTagId(),traderTag);
       });

        tagIdList.forEach(tagId ->{
            //验证是否存在
            TraderTag traderTag = tagIdDbMap.get(tagId);
            if(traderTag != null){
                tagIdDbMap.remove(tagId);
                return;
            }
            //验证tag合法性
            Tag tag = tagServiceImpl.getById(tagId);
            if(tag == null){
                return ;
            }
            //不存在则添加
            traderTag = new TraderTag();
            traderTag.setTraderId(traderId);
            traderTag.setTagId(tagId);
            traderTagServiceImpl.save(traderTag);
        });

        if(tagIdDbMap.size() == 0){
            return true;
        }

        tagIdDbMap.forEach((tagId,traderTag)->{
            traderTagServiceImpl.removeById(traderTag);
        });
        return true;
    }
}
