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.DocTemplateTagPageReqVO;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagRespVO;
import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagSaveReqVO;
import com.zt.plat.module.base.convert.doctemplate.DocTemplateTagConvert;
import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateTagDO;
import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateTagMapper;
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.TEMPLATE_TAG_NOT_EXISTS;

/**
 * 标签库 Service 实现类
 *
 * @author 系统生成
 */
@Service
@Validated
public class DocTemplateTagServiceImpl implements DocTemplateTagService {

    @Resource
    private DocTemplateTagMapper templateTagMapper;

    @Resource
    private DocTemplateCategoryService templateCategoryService;

    @Override
    public Long createTemplateTag(DocTemplateTagSaveReqVO createReqVO) {
        // 插入
        DocTemplateTagDO templateTag = DocTemplateTagConvert.INSTANCE.convert(createReqVO);
        // 设置默认值
        if (templateTag.getSort() == null) {
            templateTag.setSort(0);
        }
        if (templateTag.getEnabled() == null) {
            templateTag.setEnabled("1");
        }
        templateTagMapper.insert(templateTag);
        // 返回
        return templateTag.getId();
    }

    @Override
    public void updateTemplateTag(DocTemplateTagSaveReqVO updateReqVO) {
        // 校验存在
        validateTemplateTagExists(updateReqVO.getId());
        // 更新
        DocTemplateTagDO updateObj = DocTemplateTagConvert.INSTANCE.convert(updateReqVO);
        templateTagMapper.updateById(updateObj);
    }

    @Override
    public void deleteTemplateTag(Long id) {
        // 校验存在
        validateTemplateTagExists(id);
        // 删除
        templateTagMapper.deleteById(id);
    }

    private void validateTemplateTagExists(Long id) {
        if (templateTagMapper.selectById(id) == null) {
            throw exception(TEMPLATE_TAG_NOT_EXISTS);
        }
    }

    @Override
    public DocTemplateTagRespVO getTemplateTag(Long id) {
        DocTemplateTagDO templateTag = templateTagMapper.selectById(id);
        DocTemplateTagRespVO respVO = DocTemplateTagConvert.INSTANCE.convert(templateTag);
        // 填充分类名称
        fillCategoryName(respVO);
        return respVO;
    }

    @Override
    public PageResult<DocTemplateTagRespVO> getTemplateTagPage(DocTemplateTagPageReqVO pageReqVO) {
        PageResult<DocTemplateTagDO> pageResult = templateTagMapper.selectPage(pageReqVO);
        PageResult<DocTemplateTagRespVO> result = DocTemplateTagConvert.INSTANCE.convertPage(pageResult);
        // 填充分类名称
        result.getList().forEach(this::fillCategoryName);
        return result;
    }

    @Override
    public List<DocTemplateTagRespVO> getTemplateTagList() {
        List<DocTemplateTagDO> list = templateTagMapper.selectList();
        List<DocTemplateTagRespVO> result = DocTemplateTagConvert.INSTANCE.convertList(list);
        // 填充分类名称
        result.forEach(this::fillCategoryName);
        return result;
    }

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

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

}
