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

import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplatePageReqVO;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateRespVO;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateSaveReqVO;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zt.plat.module.base.convert.doctemplate.DocTemplateConvert;
import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateDO;
import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

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 DocTemplateServiceImpl implements DocTemplateService {

    @Resource
    private DocTemplateMapper templateMapper;

    @Resource
    private DocTemplateCategoryService templateCategoryService;

    @Override
    public Long createTemplate(DocTemplateSaveReqVO createReqVO) {
        // 校验模板编码唯一性
        validateTemplateCodeUnique(null, createReqVO.getTmplCode());

        // 插入
        DocTemplateDO template = DocTemplateConvert.INSTANCE.convert(createReqVO);

        // 设置默认值
        if (template.getUseCount() == null) {
            template.setUseCount(0);
        }
        if (template.getEnabled() == null) {
            template.setEnabled("0"); // 默认为禁用状态 (0=禁用, 1=启用)
        }
        templateMapper.insert(template);
        // 返回
        return template.getId();
    }

    @Override
    public void updateTemplate(DocTemplateSaveReqVO updateReqVO) {
        // 校验存在
        validateTemplateExists(updateReqVO.getId());
        // 校验模板编码唯一性
        validateTemplateCodeUnique(updateReqVO.getId(), updateReqVO.getTmplCode());

        // 更新
        DocTemplateDO updateObj = DocTemplateConvert.INSTANCE.convert(updateReqVO);
        templateMapper.updateById(updateObj);
    }

    @Override
    public void deleteTemplate(Long id) {
        // 校验存在
        validateTemplateExists(id);
        // 删除
        templateMapper.deleteById(id);
    }

    private void validateTemplateExists(Long id) {
        if (templateMapper.selectById(id) == null) {
            throw exception(TEMPLATE_NOT_EXISTS);
        }
    }

    /**
     * 校验模板编码唯一性
     */
    private void validateTemplateCodeUnique(Long id, String tmplCode) {
        if (StrUtil.isBlank(tmplCode)) {
            return;
        }
        DocTemplateDO template = templateMapper.selectOne(new LambdaQueryWrapper<DocTemplateDO>()
                .eq(DocTemplateDO::getTmplCode, tmplCode));
        if (template == null) {
            return;
        }
        // 如果是更新操作，排除自己
        if (id != null && id.equals(template.getId())) {
            return;
        }
        throw exception(TEMPLATE_CODE_DUPLICATE);
    }

    @Override
    public DocTemplateRespVO getTemplate(Long id) {
        DocTemplateDO template = templateMapper.selectById(id);
        DocTemplateRespVO respVO = DocTemplateConvert.INSTANCE.convert(template);
        // 填充分类名称
        fillCategoryName(respVO);
        return respVO;
    }

    @Override
    public List<DocTemplateRespVO> getTemplateList() {
        List<DocTemplateDO> list = templateMapper.selectList();
        List<DocTemplateRespVO> result = DocTemplateConvert.INSTANCE.convertList(list);
        // 填充分类名称
        result.forEach(this::fillCategoryName);
        return result;
    }

    @Override
    public PageResult<DocTemplateRespVO> getTemplatePage(DocTemplatePageReqVO reqVO) {
        PageResult<DocTemplateDO> pageResult = templateMapper.selectPage(reqVO);
        PageResult<DocTemplateRespVO> result = DocTemplateConvert.INSTANCE.convertPage(pageResult);
        // 填充分类名称
        result.getList().forEach(this::fillCategoryName);
        return result;
    }

    /**
     * 填充分类名称（包含父级路径）
     *
     * @param respVO 模板响应VO
     */
    private void fillCategoryName(DocTemplateRespVO respVO) {
        if (respVO == null || respVO.getCategoryId() == null) {
            return;
        }

        // 调用分类Service获取完整路径
        String categoryPath = templateCategoryService.getCategoryFullPath(respVO.getCategoryId());
        respVO.setCategoryName(categoryPath);
    }

}
