package com.ruoyi.ems.service.impl;

import com.ruoyi.ems.domain.AreaAttr;
import com.ruoyi.ems.domain.ObjTagRel;
import com.ruoyi.ems.enums.BusObjType;
import com.ruoyi.ems.mapper.AreaAttrMapper;
import com.ruoyi.ems.service.IAreaAttrService;
import com.ruoyi.ems.service.IObjTagRelService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 区域对象属性Service业务层处理
 *
 * @author ruoyi
 * @date 2024-11-01
 */
@Service
public class AreaAttrServiceImpl implements IAreaAttrService {
     // TODO 区域打标签重构
    @Autowired
    private AreaAttrMapper areaAttrMapper;

    @Autowired
    private IObjTagRelService tagRelService;

    @Override
    public AreaAttr selectAreaAttrByCode(String areaCode) {
        AreaAttr areaAttr = areaAttrMapper.selectAreaAttrByCode(areaCode);

        if (null != areaAttr) {
            fillExt(areaAttr);
        }

        return areaAttr;
    }

    @Override
    public List<AreaAttr> selectAreaAttrList(List<String> areaCodes) {
        List<AreaAttr> list = areaAttrMapper.selectAreaAttrList(new HashSet<>(areaCodes));
        fillExtBatch(list);
        return list;
    }

    /**
     * 新增区域对象属性
     *
     * @param areaAttr 区域对象属性
     * @return 结果
     */
    @Override
    public int insertAreaAttr(AreaAttr areaAttr) {
        int cnt = areaAttrMapper.insertAreaAttr(areaAttr);
        insertTagRel(areaAttr);
        return cnt;
    }

    /**
     * 修改区域对象属性
     *
     * @param areaAttr 区域对象属性
     * @return 结果
     */
    @Override
    public int updateAreaAttr(AreaAttr areaAttr) {
        int cnt = areaAttrMapper.updateAreaAttr(areaAttr);
        updateTagRel(areaAttr);
        return cnt;
    }

    @Override
    public int deleteAreaAttrByCode(String areaCode) {
        int cnt = areaAttrMapper.deleteAreaAttrByCode(areaCode);
        tagRelService.deleteByObjCode(1, areaCode);
        return cnt;
    }

    private void fillExt(AreaAttr areaAttr) {
        List<ObjTagRel> tagRel = tagRelService.selectListByObjCode(BusObjType.AREA.getValue(), areaAttr.getAreaCode());

        if (CollectionUtils.isNotEmpty(tagRel)) {
            List<String> tagCodes = tagRel.stream().map(ObjTagRel::getTagCode).collect(Collectors.toList());
            List<String> tagNames = tagRel.stream().map(ObjTagRel::getTagName).collect(Collectors.toList());
            areaAttr.setTagCodeList(tagCodes);
            areaAttr.setTagCodes(StringUtils.join(tagCodes, ","));
            areaAttr.setTagNames(StringUtils.join(tagNames, ","));
        }
    }

    private void fillExtBatch(List<AreaAttr> list) {
        List<ObjTagRel> tagRel = tagRelService.selectListByType(BusObjType.AREA.getValue());
        Map<String, List<ObjTagRel>> tagRelMap = tagRel.stream()
            .collect(Collectors.groupingBy(ObjTagRel::getObjCode));

        for (AreaAttr areaAttr : list) {
            if (tagRelMap.containsKey(areaAttr.getAreaCode())) {
                List<ObjTagRel> relLists = tagRelMap.get(areaAttr.getAreaCode());
                List<String> tagCodes = relLists.stream().map(ObjTagRel::getTagCode).collect(Collectors.toList());
                List<String> tagNames = relLists.stream().map(ObjTagRel::getTagName).collect(Collectors.toList());
                areaAttr.setTagCodeList(tagCodes);
                areaAttr.setTagCodes(StringUtils.join(tagCodes, ","));
                areaAttr.setTagNames(StringUtils.join(tagNames, ","));
            }
        }
    }

    public void insertTagRel(AreaAttr areaAttr) {
        if (CollectionUtils.isNotEmpty(areaAttr.getTagCodeList())) {
            List<String> tagArray = areaAttr.getTagCodeList();

            for (String tagCode : tagArray) {
                ObjTagRel tagRel = new ObjTagRel(tagCode, BusObjType.AREA, areaAttr.getAreaCode());
                tagRelService.save(tagRel);
            }
        }
    }

    public void updateTagRel(AreaAttr areaAttr) {
        if (CollectionUtils.isNotEmpty(areaAttr.getTagCodeList())) {
            List<String> tagArray = areaAttr.getTagCodeList();
            tagRelService.deleteByObjCode(BusObjType.AREA.getValue(), areaAttr.getAreaCode());

            for (String tagCode : tagArray) {
                ObjTagRel tagRel = new ObjTagRel(tagCode, BusObjType.AREA, areaAttr.getAreaCode());
                tagRelService.save(tagRel);
            }
        }
        else {
            tagRelService.deleteByObjCode(BusObjType.AREA.getValue(), areaAttr.getAreaCode());
        }
    }
}
