package com.zt.plat.module.base.service.doctemplate;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstancePageReqVO;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceRespVO;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceSaveReqVO;
import com.zt.plat.module.base.convert.doctemplate.DocTemplateInstanceConvert;
import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateInstanceDO;
import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateDO;
import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateInstanceMapper;
import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import jakarta.annotation.Resource;
import java.util.List;

import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.module.base.enums.ErrorCodeConstants.*;

/**
 * 模板实例 Service 实现类
 *
 * @author 系统生成
 */
@Service
@Validated
public class DocTemplateInstanceServiceImpl implements DocTemplateInstanceService {

    @Resource
    private DocTemplateInstanceMapper docTemplateInstanceMapper;

    @Resource
    private DocTemplateMapper docTemplateMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createTemplateInstance(DocTemplateInstanceSaveReqVO createReqVO) {
        // 校验模板存在
        DocTemplateDO template = docTemplateMapper.selectById(createReqVO.getTemplateId());
        if (template == null) {
            throw exception(TEMPLATE_NOT_EXISTS);
        }
        // 校验实例编码唯一性
        validateInstanceCodeUnique(null, createReqVO.getInstanceCode());

        // 插入实例
        DocTemplateInstanceDO templateInstance = DocTemplateInstanceConvert.INSTANCE.convert(createReqVO);

        // 深拷贝模板内容到editedContent（实例完全独立于模板）
        if (StrUtil.isBlank(templateInstance.getEditedContent()) && StrUtil.isNotBlank(template.getContent())) {
            templateInstance.setEditedContent(template.getContent());
        }

        // 从模板复制快照字段（实例创建时获取模板的快照，后续修改模板不影响实例）
        if (templateInstance.getSqlConfig() == null) {
            templateInstance.setSqlConfig(template.getSqlConfig());
        }
        if (templateInstance.getDataSource() == null) {
            templateInstance.setDataSource(template.getDataSource());
        }
        if (templateInstance.getCategoryId() == null) {
            templateInstance.setCategoryId(template.getCategoryId());
        }
        if (templateInstance.getIcon() == null) {
            templateInstance.setIcon(template.getIcon());
        }
        if (templateInstance.getDescription() == null) {
            templateInstance.setDescription(template.getDescription());
        }
        if (templateInstance.getVersion() == null) {
            templateInstance.setVersion(template.getVersion());
        }

        // 设置默认状态为草稿
        if (templateInstance.getStatus() == null) {
            templateInstance.setStatus("draft");
        }

        docTemplateInstanceMapper.insert(templateInstance);

        // 更新模板使用次数
        incrementTemplateUseCount(createReqVO.getTemplateId());

        // 返回
        return templateInstance.getId();
    }

    @Override
    public void updateTemplateInstance(DocTemplateInstanceSaveReqVO updateReqVO) {
        // 校验存在
        validateTemplateInstanceExists(updateReqVO.getId());
        // 校验实例编码唯一性
        validateInstanceCodeUnique(updateReqVO.getId(), updateReqVO.getInstanceCode());
        // 更新
        DocTemplateInstanceDO updateObj = DocTemplateInstanceConvert.INSTANCE.convert(updateReqVO);
        docTemplateInstanceMapper.updateById(updateObj);
    }

    @Override
    public void deleteTemplateInstance(Long id) {
        // 校验存在
        validateTemplateInstanceExists(id);
        // 删除
        docTemplateInstanceMapper.deleteById(id);
    }

    private void validateTemplateInstanceExists(Long id) {
        if (docTemplateInstanceMapper.selectById(id) == null) {
            throw exception(TEMPLATE_INSTANCE_NOT_EXISTS);
        }
    }

    /**
     * 校验实例编码唯一性
     */
    private void validateInstanceCodeUnique(Long id, String instanceCode) {
        if (StrUtil.isBlank(instanceCode)) {
            return;
        }
        DocTemplateInstanceDO instance = docTemplateInstanceMapper.selectOne(new LambdaQueryWrapper<DocTemplateInstanceDO>()
                .eq(DocTemplateInstanceDO::getInstanceCode, instanceCode));
        if (instance == null) {
            return;
        }
        // 如果是更新操作，排除自己
        if (id != null && id.equals(instance.getId())) {
            return;
        }
        throw exception(TEMPLATE_INSTANCE_CODE_DUPLICATE);
    }

    /**
     * 增加模板使用次数
     */
    private void incrementTemplateUseCount(Long templateId) {
        DocTemplateDO template = docTemplateMapper.selectById(templateId);
        if (template != null) {
            DocTemplateDO updateObj = new DocTemplateDO();
            updateObj.setId(templateId);
            updateObj.setUseCount(template.getUseCount() == null ? 1 : template.getUseCount() + 1);
            docTemplateMapper.updateById(updateObj);
        }
    }

    @Override
    public DocTemplateInstanceRespVO getTemplateInstance(Long id) {
        DocTemplateInstanceDO templateInstance = docTemplateInstanceMapper.selectById(id);
        DocTemplateInstanceRespVO respVO = DocTemplateInstanceConvert.INSTANCE.convert(templateInstance);
        
        // 填充模板名称
        if (respVO != null && respVO.getTemplateId() != null) {
            DocTemplateDO template = docTemplateMapper.selectById(respVO.getTemplateId());
            if (template != null) {
                respVO.setTemplateName(template.getTmplName());
            }
        }
        
        return respVO;
    }

    @Override
    public PageResult<DocTemplateInstanceRespVO> getTemplateInstancePage(DocTemplateInstancePageReqVO pageReqVO) {
        PageResult<DocTemplateInstanceDO> pageResult = docTemplateInstanceMapper.selectPage(pageReqVO);
        PageResult<DocTemplateInstanceRespVO> respVOPageResult = DocTemplateInstanceConvert.INSTANCE.convertPage(pageResult);

        // 填充模板名称
        fillTemplateName(respVOPageResult.getList());

        return respVOPageResult;
    }

    @Override
    public List<DocTemplateInstanceRespVO> getTemplateInstanceList() {
        List<DocTemplateInstanceDO> list = docTemplateInstanceMapper.selectList();
        List<DocTemplateInstanceRespVO> respVOList = DocTemplateInstanceConvert.INSTANCE.convertList(list);

        // 填充模板名称
        fillTemplateName(respVOList);

        return respVOList;
    }

    /**
     * 填充模板名称
     */
    private void fillTemplateName(List<DocTemplateInstanceRespVO> list) {
        if (list == null || list.isEmpty()) {
            return;
        }
        for (DocTemplateInstanceRespVO vo : list) {
            if (vo.getTemplateId() != null) {
                DocTemplateDO template = docTemplateMapper.selectById(vo.getTemplateId());
                if (template != null) {
                    vo.setTemplateName(template.getTmplName());
                }
            }
        }
    }

}
