package com.fizz.business.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fizz.business.domain.BizSendTemplateItem;
import com.fizz.business.mapper.BizSendTemplateItemMapper;
import com.fizz.business.service.IBizSendTemplateItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Service
public class BizSendTemplateItemServiceImpl extends ServiceImpl<BizSendTemplateItemMapper, BizSendTemplateItem> implements IBizSendTemplateItemService {

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean updateItemsBatch(List<BizSendTemplateItem> items) {
        if (items == null || items.isEmpty()) {
            return true;
        }
        // MyBatis-Plus 批量更新：这里简单循环 updateById（数量约40~100可接受）
        for (BizSendTemplateItem it : items) {
            this.updateById(it);
        }
        return true;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean batchSave(Integer templateId, List<BizSendTemplateItem> items, List<Integer> deleteIds, String username) {
        Date now = new Date();

        // 1) 删除（物理删除）。如果你们希望逻辑删除，可在此改为 enabled=0 / deleted 标记。
        if (deleteIds != null && !deleteIds.isEmpty()) {
            this.removeByIds(deleteIds);
        }

        // 2) 新增/更新
        if (items == null) {
            items = Collections.emptyList();
        }

        // 基础校验：templateId 必须一致
        for (BizSendTemplateItem it : items) {
            if (it.getTemplateId() == null) {
                it.setTemplateId(templateId);
            }
        }

        // 校验：同一 templateId 下 paramCode 唯一
        // - 先校验本次提交内是否重复
        Set<String> seen = new HashSet<>();
        for (BizSendTemplateItem it : items) {
            if (it.getParamCode() == null || it.getParamCode().trim().isEmpty()) {
                throw new IllegalArgumentException("参数编码是必需的");
            }
            String code = it.getParamCode().trim();
            if (!seen.add(code)) {
                throw new IllegalArgumentException("请求中包含重复参数编码: " + code);
            }
            it.setParamCode(code);
        }

        // - 再校验数据库里是否已存在同 paramCode（排除自身ID）
        for (BizSendTemplateItem it : items) {
            LambdaQueryWrapper<BizSendTemplateItem> qw = new LambdaQueryWrapper<>();
            qw.eq(BizSendTemplateItem::getTemplateId, templateId)
              .eq(BizSendTemplateItem::getParamCode, it.getParamCode());
            if (it.getTemplateItemId() != null) {
                qw.ne(BizSendTemplateItem::getTemplateItemId, it.getTemplateItemId());
            }
            long cnt = this.count(qw);
            if (cnt > 0) {
                throw new IllegalArgumentException("参数编码已存在: " + it.getParamCode());
            }
        }

        for (BizSendTemplateItem it : items) {
            it.setTemplateId(templateId);
            if (it.getTemplateItemId() == null) {
                it.setCreateBy(username);
                it.setCreateTime(now);
                it.setUpdateBy(username);
                it.setUpdateTime(now);
                this.save(it);
            } else {
                it.setUpdateBy(username);
                it.setUpdateTime(now);
                this.updateById(it);
            }
        }

        return true;
    }
}


