package com.hotent.project.manager.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hotent.baseInfo.manager.AuditedUnitManager;
import com.hotent.baseInfo.manager.CostDocumentTemplateManager;
import com.hotent.baseInfo.manager.CostDocumentWhManager;
import com.hotent.baseInfo.model.AuditedUnit;
import com.hotent.baseInfo.model.CostDocumentTemplate;
import com.hotent.baseInfo.model.CostDocumentWh;
import com.hotent.config.EipConfig;
import com.hotent.constant.BaseConstant;
import com.hotent.project.manager.CostProjectDocumentFileManager;
import com.hotent.project.model.CostProjectDocument;
import com.hotent.project.dao.CostProjectDocumentDao;
import com.hotent.project.manager.CostProjectDocumentManager;
import com.hotent.base.manager.impl.BaseManagerImpl;
import com.hotent.project.model.CostProjectDocumentFile;
import com.hotent.project.req.CostProjectBasePageReq;
import com.hotent.project.req.CostProjectDocumentPageReq;
import com.hotent.project.req.CostProjectDocumentReq;
import com.hotent.project.resp.CostProjectDocumentResp;
import com.hotent.req.PageReq;
import com.hotent.uc.exception.BaseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;

import com.hotent.base.util.BeanUtils;


/**
 * 监审项目文书表 服务实现类
 *
 * @author 超级管理员
 * @company 山西清众科技股份有限公司
 * @since 2025-09-26
 */
@Service
public class CostProjectDocumentManagerImpl extends BaseManagerImpl<CostProjectDocumentDao, CostProjectDocument> implements CostProjectDocumentManager {

    @Autowired
    private CostProjectDocumentFileManager costProjectDocumentFileManager;

    @Autowired
    private CostDocumentTemplateManager costDocumentTemplateManager;

    @Autowired
    private AuditedUnitManager auditedUnitManager;

    @Autowired
    private CostDocumentWhManager costDocumentWhManager;

    @Override
    public CostProjectDocument getDetail(String id) {
        CostProjectDocument costProjectDocument = this.get(id);


        return costProjectDocument;
    }

    @Override
    public void deleteByIds(List<String> ids) {
        List<CostProjectDocument> costProjectDocuments = this.listByIds(ids);
        if (costProjectDocuments!=null){
            costProjectDocuments.forEach(item -> {
                //逻辑删除
                item.setIsDeleted( BaseConstant.DELETE_FLAG);

            });
            this.updateBatchById(costProjectDocuments);
        }
    }

    @Override
    @Transactional
    public void createOrUpdate(CostProjectDocument costProjectDocument) {
        //新建或更新
        this.saveOrUpdate(costProjectDocument);
    }

    @Override
    public IPage<CostProjectDocument> pageList(CostProjectDocumentPageReq req) {
        LambdaQueryWrapper<CostProjectDocument> qw = new LambdaQueryWrapper<>();
        if (req.getDocumentType() != null) {
//            LambdaQueryWrapper<CostDocumentTemplate> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//            lambdaQueryWrapper.eq(CostDocumentTemplate::getId, req.getDocumentType());
//            lambdaQueryWrapper.eq(CostDocumentTemplate::getIsWh, "0");
            qw.eq(CostProjectDocument::getDocumentType, req.getDocumentType());
        }
        qw.eq(CostProjectDocument::getProjectId, req.getProjectId());

        IPage<CostProjectDocument> page = new Page<>(req.getPageNum(), req.getPageSize());
        return this.page(page, qw);
    }

//    @Override
//    public void create(CostProjectDocument costProjectDocument) {
//        if (ObjectUtil.isEmpty(costProjectDocument.getDocumentId())) {
//            throw new BaseException("请选择文书模板");
//        }
//        if (ObjectUtil.isEmpty(costProjectDocument.getProjectId())) {
//            throw new BaseException("请选择项目");
//        }
//        if (ObjectUtil.isEmpty(costProjectDocument.getDocumentNumber())) {
//            throw new BaseException("请填写通知文号");
//        }
//        if (ObjectUtil.isEmpty(costProjectDocument.getEnterpriseId())) {
//            throw new BaseException("请选择监审单位");
//        }
//        costProjectDocument.setGenerateTime(LocalDateTime.now());
//        costProjectDocument.setIsPushed("1");
//
//        CostDocumentTemplate costDocumentTemplate = this.costDocumentTemplateManager.get(costProjectDocument.getDocumentId());
//        if (costDocumentTemplate == null || BaseConstant.DELETE_FLAG.equals(costDocumentTemplate.getIsDeleted())) {
//            throw new BaseException("文书模板不存在");
//        }
//        costProjectDocument.setDocumentAlias(costDocumentTemplate.getAlias());
//        AuditedUnit auditedUnit = auditedUnitManager.get(costProjectDocument.getEnterpriseId());
//        if (auditedUnit == null || BaseConstant.DELETE_FLAG.equals(auditedUnit.getIsDeleted())) {
//            throw new BaseException("被监审单位不存在");
//        }
//        CostDocumentWh costDocumentWh = costDocumentWhManager.get(costProjectDocument.getDocumentWhId());
//        if (costDocumentWh == null || BaseConstant.DELETE_FLAG.equals(costDocumentWh.getIsDeleted())) {
//            throw new BaseException("文书文号不存在");
//        }
//
//        LambdaQueryWrapper<CostProjectDocument> qw = new LambdaQueryWrapper<>();
//        qw.eq(CostProjectDocument::getProjectId, costProjectDocument.getProjectId());
//        qw.eq(CostProjectDocument::getDocumentId, costProjectDocument.getDocumentId());
//        qw.eq(CostProjectDocument::getEnterpriseId, costProjectDocument.getEnterpriseId());
//        if (this.count(qw) > 0) {
//            throw new BaseException("该项目监审单位已存在此文书");
//        }
//        super.create(costProjectDocument);
//
//
//    }


    @Override
    public void create(CostProjectDocumentReq req) {
        if (ObjectUtil.isEmpty(req.getDocumentId())) {
            throw new BaseException("请选择文书模板");
        }
        if (ObjectUtil.isEmpty(req.getProjectId())) {
            throw new BaseException("请选择项目");
        }
        if (ObjectUtil.isEmpty(req.getDocumentNumber())) {
            throw new BaseException("请填写通知文号");
        }
        if (ObjectUtil.isEmpty(req.getEnterpriseId())) {
            throw new BaseException("请选择监审单位");
        }
        req.setGenerateTime(LocalDateTime.now());
        req.setIsPushed("1");

        CostDocumentTemplate costDocumentTemplate = this.costDocumentTemplateManager.get(req.getDocumentId());
        if (costDocumentTemplate == null || BaseConstant.DELETE_FLAG.equals(costDocumentTemplate.getIsDeleted())) {
            throw new BaseException("文书模板不存在");
        }
        req.setDocumentAlias(costDocumentTemplate.getAlias());
        AuditedUnit auditedUnit = auditedUnitManager.get(req.getEnterpriseId());
        if (auditedUnit == null || BaseConstant.DELETE_FLAG.equals(auditedUnit.getIsDeleted())) {
            throw new BaseException("被监审单位不存在");
        }
        CostDocumentWh costDocumentWh = costDocumentWhManager.get(req.getDocumentWhId());
        if (costDocumentWh == null || BaseConstant.DELETE_FLAG.equals(costDocumentWh.getIsDeleted())) {
            throw new BaseException("文书文号不存在");
        }
        //返回文号
        String whNo = costDocumentWh.getRulePattern().replace("{prefixText}", costDocumentWh.getPrefixText())
                .replace("{year}", costDocumentWh.getYear()).replace("{currentValue}", costDocumentWh.getCurrentValue().toString());

        LambdaQueryWrapper<CostProjectDocument> qw = new LambdaQueryWrapper<>();
        qw.eq(CostProjectDocument::getProjectId, req.getProjectId());
        qw.eq(CostProjectDocument::getDocumentId, req.getDocumentId());
        qw.eq(CostProjectDocument::getEnterpriseId, req.getEnterpriseId());
        if (this.count(qw) > 0) {
            throw new BaseException("该项目监审单位已存在此文书");
        }
        //类型转换
        CostProjectDocument costProjectDocument = new CostProjectDocument();
        BeanUtil.copyProperties(req, costProjectDocument);
        costProjectDocument.setDocumentNumber(whNo);
        costProjectDocument.setDocumentName(costDocumentTemplate.getDocumentName());
        costProjectDocument.setDocumentType(costDocumentTemplate.getType());
        super.create(costProjectDocument);
        //文件关联信息赋值
        req.getCostProjectDocumentFiles().forEach(costProjectDocumentFile -> {
            costProjectDocumentFile.setDocumentId(costProjectDocument.getDocumentId());
            costProjectDocumentFile.setProjectId(costProjectDocument.getProjectId());
        });
        //保存解析出的文件内容
        costProjectDocumentFileManager.saveBatch(req.getCostProjectDocumentFiles());

        //更新文号值
        costDocumentWhManager.updateCurrentValue(costDocumentWh.getId());


    }

    @Override
    public List<CostProjectDocumentFile> getDocumentFileList(String id) {
        CostProjectDocument costProjectDocument = this.get(id);
        if(costProjectDocument == null){
            throw new BaseException("文书模板不存在");
        }

        return null;
    }



    @Override
    public void updateProjectDocument(CostProjectDocumentReq req) {
        if (ObjectUtil.isEmpty(req.getId())) {
            throw new BaseException("请选择要修改的文书");
        }
        if (ObjectUtil.isEmpty(req.getDocumentId())) {
            throw new BaseException("请选择文书模板");
        }
        if (ObjectUtil.isEmpty(req.getProjectId())) {
            throw new BaseException("请选择项目");
        }
        if (ObjectUtil.isEmpty(req.getDocumentNumber())) {
            throw new BaseException("请填写通知文号");
        }
        if (ObjectUtil.isEmpty(req.getEnterpriseId())) {
            throw new BaseException("请选择监审单位");
        }
        CostProjectDocument selectCostProjectDocument = this.get(req.getId());
        if (selectCostProjectDocument == null) {
            throw new BaseException("请选择要修改的文书");
        }

        req.setIsPushed("1");

        CostDocumentTemplate costDocumentTemplate = this.costDocumentTemplateManager.get(req.getDocumentId());
        if (costDocumentTemplate == null || BaseConstant.DELETE_FLAG.equals(costDocumentTemplate.getIsDeleted())) {
            throw new BaseException("文书模板不存在");
        }
        req.setDocumentAlias(costDocumentTemplate.getAlias());
        AuditedUnit auditedUnit = auditedUnitManager.get(req.getEnterpriseId());
        if (auditedUnit == null || BaseConstant.DELETE_FLAG.equals(auditedUnit.getIsDeleted())) {
            throw new BaseException("被监审单位不存在");
        }
        CostDocumentWh costDocumentWh = costDocumentWhManager.get(req.getDocumentWhId());
        if (costDocumentWh == null || BaseConstant.DELETE_FLAG.equals(costDocumentWh.getIsDeleted())) {
            throw new BaseException("文书文号不存在");
        }

        LambdaQueryWrapper<CostProjectDocument> qw = new LambdaQueryWrapper<>();
        qw.eq(CostProjectDocument::getProjectId, req.getProjectId());
        qw.eq(CostProjectDocument::getDocumentId, req.getDocumentId());
        qw.eq(CostProjectDocument::getEnterpriseId, req.getEnterpriseId());
        if (this.count(qw) > 0) {
            throw new BaseException("该项目监审单位已存在此文书");
        }

        selectCostProjectDocument.setDocumentWhId(req.getDocumentWhId());
        selectCostProjectDocument.setDocumentId(req.getDocumentId());
        selectCostProjectDocument.setEnterpriseId(req.getEnterpriseId());
//        类型转换
         BeanUtil.copyProperties(req,selectCostProjectDocument);
        super.update(selectCostProjectDocument);
        costProjectDocumentFileManager.remove(new LambdaQueryWrapper<CostProjectDocumentFile>().eq(CostProjectDocumentFile::getProjectId,selectCostProjectDocument.getProjectId()));
        List<CostProjectDocumentFile> costProjectDocumentFiles = req.getCostProjectDocumentFiles();
        if (costProjectDocumentFiles != null){
            for (CostProjectDocumentFile costProjectDocumentFile : costProjectDocumentFiles) {
                costProjectDocumentFile.setDocumentId(selectCostProjectDocument.getDocumentId());
                costProjectDocumentFile.setProjectId(selectCostProjectDocument.getProjectId());
            }

        }
        costProjectDocumentFileManager.saveBatch(req.getCostProjectDocumentFiles());
    }

    @Override
    public List<CostProjectDocument> getListByProjectId(String projectId) {
        LambdaQueryWrapper<CostProjectDocument> qw = new LambdaQueryWrapper<>();
        qw.eq(CostProjectDocument::getProjectId, projectId);
        qw.eq(CostProjectDocument::getIsDeleted, BaseConstant.NORMAL_STATUS);
        List<CostProjectDocument> list = this.list(qw);
        if (ObjectUtil.isEmpty(list)) {
            return new ArrayList<>();
        }
        return list;
    }

     @Override
     public CostProjectDocumentResp getByProjectId(String projectId){
        //查询监审文书
         LambdaQueryWrapper<CostProjectDocument> qw = new LambdaQueryWrapper<>();
         qw.eq(CostProjectDocument::getProjectId, projectId);
         qw.eq(CostProjectDocument::getIsDeleted, BaseConstant.NORMAL_STATUS);
         CostProjectDocument costProjectDocument = this.getOne(qw);
         //转换为返回类型
         CostProjectDocumentResp costProjectDocumentResp = BeanUtil.copyProperties(costProjectDocument, CostProjectDocumentResp.class);

            //查询文书下的文书内容
             LambdaQueryWrapper<CostProjectDocumentFile> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(CostProjectDocumentFile::getProjectId, costProjectDocument.getProjectId());
             //获取文件内容返回
             costProjectDocumentResp.setCostProjectDocumentFiles(costProjectDocumentFileManager.list(wrapper));
         CostDocumentTemplate costDocumentTemplate = costDocumentTemplateManager.get(costProjectDocument.getDocumentId());
         costProjectDocumentResp.setFullPath(EipConfig.getImgUrl()+costDocumentTemplate.getFileUrl());
         return costProjectDocumentResp;

     }
}
