package com.nokia.hb.service;

import com.nokia.common.R;
import com.nokia.common.exception.BizException;
import com.nokia.hb.dao.entity.IndicatorTemplate;
import com.nokia.hb.dao.entity.IndicatorTemplateItem;
import com.nokia.hb.dao.mapper.IndicatorTemplateItemMapper;
import com.nokia.hb.dao.mapper.IndicatorTemplateMapper;
import com.nokia.hb.pojo.TreeNode;
import com.nokia.hb.pojo.bo.IndicatorTemplateItemBo;
import com.nokia.hb.pojo.dto.AddTemplateDto;
import com.nokia.hb.pojo.dto.DeleteTemplateDto;
import com.nokia.hb.pojo.dto.UpdateTemplateDto;
import com.nokia.hb.utils.SessionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.servlet.http.HttpSession;
import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Service
public class IndicatorTemplateService {
    private final IndicatorTemplateMapper indicatorTemplateMapper;
    private final IndicatorTemplateItemMapper indicatorTemplateItemMapper;

    public IndicatorTemplateService(IndicatorTemplateMapper indicatorTemplateMapper,
                                    IndicatorTemplateItemMapper indicatorTemplateItemMapper) {
        this.indicatorTemplateMapper = indicatorTemplateMapper;
        this.indicatorTemplateItemMapper = indicatorTemplateItemMapper;
    }

    public R<List<TreeNode>> initTreeIndicatorTemplate(HttpSession session) {
        String username = SessionUtil.getUsername(session);
        List<IndicatorTemplate> indicatorTemplates = indicatorTemplateMapper.listByUsername(username);
        TreeNode allTree = new TreeNode("指标模板选择", "指标模板选择", true, new ArrayList<>());
        List<TreeNode> res = new ArrayList<>();
        res.add(allTree);
        if (CollectionUtils.isEmpty(indicatorTemplates)) {
            return R.ok(res);
        }
        List<Long> templateIds = indicatorTemplates.stream().map(IndicatorTemplate::getId).collect(Collectors.toList());
        List<IndicatorTemplateItemBo> indicatorTemplateItemBos = indicatorTemplateItemMapper.listByTemplateIds(templateIds);
        if (CollectionUtils.isEmpty(indicatorTemplateItemBos)) {
            return R.ok(res);
        }
        // 按templateId分组
        Map<Long, List<IndicatorTemplateItemBo>> map = indicatorTemplateItemBos.stream()
                .collect(Collectors.groupingBy(IndicatorTemplateItemBo::getTemplateId,
                        LinkedHashMap::new, Collectors.toList()));
        // 生成指标模板节点
        indicatorTemplates.forEach(i -> {
            Long id = i.getId();
            String templateName = i.getTemplateName();
            TreeNode t = new TreeNode(templateName, String.valueOf(id), new ArrayList<>());
            allTree.getChildren().add(t);
            List<IndicatorTemplateItemBo> bos = map.get(id);
            bos.forEach(b -> t.getChildren().add(new TreeNode(b.getIndicatorCn(), b.getIndicatorEn())));
        });
        return R.ok(res);
    }

    @Transactional(rollbackFor = Exception.class)
    public R<Object> addTemplate(AddTemplateDto dto, HttpSession session) {
        String username = SessionUtil.getUsername(session);
        IndicatorTemplate indicatorTemplate = new IndicatorTemplate();
        indicatorTemplate.setTemplateName(dto.getTemplateName());
        indicatorTemplate.setUsername(username);
        indicatorTemplateMapper.insert(indicatorTemplate);
        insertIndicatorTemplateItem(dto.getIndicators(), indicatorTemplate.getId());
        return R.ok();
    }

    @Transactional(rollbackFor = Exception.class)
    public R<Object> deleteTemplate(DeleteTemplateDto dto, HttpSession session) {
        String username = SessionUtil.getUsername(session);
        List<Long> ids = indicatorTemplateMapper.getIds(username, dto.getIds());
        if (CollectionUtils.isEmpty(ids)) {
            return R.ok();
        }
        indicatorTemplateMapper.deleteBatch(ids);
        indicatorTemplateItemMapper.deleteBatch(ids);
        return R.ok();
    }

    @Transactional(rollbackFor = Exception.class)
    public R<Object> updateTemplate(UpdateTemplateDto dto, HttpSession session) {
        String username = SessionUtil.getUsername(session);
        List<Long> ids = indicatorTemplateMapper.getIds(username, Collections.singleton(dto.getId()));
        if (CollectionUtils.isEmpty(ids)) {
            throw new BizException("禁止操作");
        }
        indicatorTemplateItemMapper.deleteBatch(ids);
        IndicatorTemplate indicatorTemplate = new IndicatorTemplate();
        indicatorTemplate.setTemplateName(dto.getTemplateName());
        indicatorTemplate.setUsername(username);
        indicatorTemplateMapper.updateById(indicatorTemplate);
        insertIndicatorTemplateItem(dto.getIndicators(), dto.getId());
        return R.ok();
    }

    @Transactional(rollbackFor = Exception.class)
    public void insertIndicatorTemplateItem(Set<Integer> indicators, Long id) {
        List<IndicatorTemplateItem> indicatorTemplateItems = new ArrayList<>();
        indicators.forEach(t -> {
            IndicatorTemplateItem tt = new IndicatorTemplateItem();
            tt.setTemplateId(id);
            tt.setIndicatorId(t);
            indicatorTemplateItems.add(tt);
        });
        indicatorTemplateItemMapper.insertBatch(indicatorTemplateItems);
    }
}
