package digital.laboratory.platform.entrustment.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import digital.laboratory.platform.common.core.constant.CommonConstants;
import digital.laboratory.platform.common.core.util.R;
import digital.laboratory.platform.entrustment.entity.CaseEvent;
import digital.laboratory.platform.entrustment.entity.CaseEvidence;
import digital.laboratory.platform.entrustment.mapper.CaseEvidenceMapper;
import digital.laboratory.platform.entrustment.service.CaseEvidenceService;
import digital.laboratory.platform.othersys.utils.ConvertUtils;
import digital.laboratory.platform.othersys.vo.EntrustDataVo;
import digital.laboratory.platform.othersys.vo.MaterialVo;
import digital.laboratory.platform.sys.feign.RemoteDictionaryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 与案件相关的物证信息服务实现类
 *
 * @author Zhang Xiaolong created at  2022-04-20
 * @describe 与案件相关的物证信息服务实现类
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, CaseEvidence> implements CaseEvidenceService {
	private final CaseEvidenceMapper caseEvidenceMapper;

	private final RemoteDictionaryService remoteDictionaryService;
	/**
	 * 用于标识某个案件的物证。
	 * 顺序号使用 6 位的原因, 是现勘系统的物证编码结构就是这样。有可能这 6 位编码中有不同的用途, 并不完全是顺序号。
	 * 但是我们不得而知。
	 * 如果该编码由我们系统自己生成, 则使用 6 位顺序号。
	 * ```
	 * W <案件编号后 22 位> <顺序号 6 位>
	 * 例如:
	 * W 5201010400002020030002 000001
	 * 合计 29 位
	 * ```
	 * 如果有现勘系统, 则使用现勘系统的物证编号。
	 * 如果有案事件系统, 则使用案事件系统的物证编号。
	 *
	 * 作为兼容性考虑, 如果案件编码不足 23 位, 取 除掉第 1 个字符之后的, 即去掉 "A" 字符剩下的
	 *
	 * @param caseNo
	 * @return
	 */
	@Override
	public String getNewEvidenceCode(String caseNo) {
		String prefix = CommonConstants.CODE_PREFIX_EVIDENCE + StrUtil.removePrefixIgnoreCase(caseNo, CommonConstants.CODE_PREFIX_CASE);

		int newCount = 1;

		// 根据前缀查询最大物证编码
		String maxno = caseEvidenceMapper.getMaxEvidenceNo(prefix);
		if (maxno != null) {
			String strCount = StrUtil.removePrefix(maxno, prefix);
			try
			{
				int maxcount = Integer.parseUnsignedInt(strCount);
				newCount = maxcount + 1;
			}
			catch (NumberFormatException e) {
				// 如果后缀有非数字, 则无视之, 重头编码
				newCount = 1;
			}
		}

		String newCode = prefix+ String.format("%06d", newCount);

		return newCode;
	}

	@Override
	public long countByCaseId(String caseId) {
		return baseMapper.selectCount(Wrappers.<CaseEvidence>query()
				.eq(StrUtil.isNotBlank(caseId), "case_id", caseId)
		);

	}

	/**
     * 同步禁毒数据平台上的物证
     *
     * @param
     * @param isUpdate 案件更新删除对应的物质，重新插入
     * @return
     */
	@Override
	public List<Map<String, String>> syncCaseEvidenceInfo(EntrustDataVo entrustDataVo, CaseEvent caseEvent, Boolean isUpdate) {
		// 判断当前的操作是更新还是插入
		if (isUpdate) {
			if (StrUtil.isBlank(caseEvent.getId())) {
				throw new RuntimeException("案件id 不能为空");
			}
			this.remove(Wrappers.<CaseEvidence>query().eq("case_id", caseEvent.getId()));
		}

		List<Map<String, String>> caseEvidenceList = new ArrayList<>();

		// 获取物证列表
		List<MaterialVo> materialList = entrustDataVo.getMaterialList();
		for (int j = 0; j < materialList.size(); j++) {
			MaterialVo materialVo = materialList.get(j);

			CaseEvidence caseEvidence = new CaseEvidence();
			caseEvidence.setDataSources(1);//设置数据是来自何处
			caseEvidence.setId(IdWorker.get32UUID().toUpperCase());
			caseEvidence.setCaseId(caseEvent.getId());
			caseEvidence.setName(materialVo.getName());
			caseEvidence.setEvidenceNo(this.getNewEvidenceCode(caseEvent.getCaseNo()));
			// 物证分类
			//caseEvidence.setType(getDictionaryInfo(materialVo.getShapeType(), "WZFL.1.6"));
			caseEvidence.setType(getDictionaryInfo(materialVo.getShapeType(), "6f4b55454a3ccde502493e04f63eed32"));//对应常用分类
			// 颜色
			caseEvidence.setColor(materialVo.getColorType());
			// 承载物
			caseEvidence.setFundName(materialVo.getPackageType()); // 名称
			caseEvidence.setFundQuantity(1); // 数量
			caseEvidence.setFundUnit(materialVo.getPackageType().substring(materialVo.getPackageType().length()-1)); // 承载物单位
			// 物证的重量和单位
			caseEvidence.setQuantity(materialVo.getAmount());

			caseEvidence.setUnit(ConvertUtils.getCaseEvidenceUnit(StringUtils.isBlank(materialVo.getUnit()) ? "9999-" + materialVo.getEntrustId() : materialVo.getUnit()));

			// 存储方法
			caseEvidence.setStorageMethod("常规");
			// 物证性状
			//caseEvidence.setForm(getDictionaryInfo(materialVo.getShapeType(), "wzxz.11"));
			caseEvidence.setForm(getDictionaryInfo(materialVo.getShapeType(), "cdb0ca92f0d9c8f6af12457f8f924f21"));
			// 包装情况
			//caseEvidence.setPack(getDictionaryInfo(materialVo.getPackageType(), "BZFL.08"));
			caseEvidence.setPack(getDictionaryInfo(materialVo.getPackageType(), "56e4dda4300f99ae147c0c72d03f9488"));
			// 来源
//			caseEvidence.setSource(getDictionaryInfo(
//					ConvertUtils.getCaseEvidenceSource(entrustDataVo.getMaterialType()),
//					"WZLY.7"));
			caseEvidence.setSource(getDictionaryInfo(
					ConvertUtils.getCaseEvidenceSource(entrustDataVo.getMaterialType()),
					"d01ea65959ad16b32dc7e857cd1f6026"));

			Map<String, String> res = new HashMap<>();
			if (this.save(caseEvidence)) {
				res.put(materialVo.getIndex(), caseEvidence.getId());
				caseEvidenceList.add(res);
			} else {
				throw new RuntimeException("物证同步出差");
			}
		}
		return caseEvidenceList;
	}

	// 远程调用查询字典中的id值,比如说获取包装类中的某一个包装的id
	public String getDictionaryInfo(String label, String id) {
		String result = new String();
		R r = remoteDictionaryService.queryDictionaryVO(label, id);
		if (r.getCode() == CommonConstants.SUCCESS) {
			result = (String) r.getData();
			return result;
		} else {
			return null;
		}
	}

}
