package thyyxxk.webserver.service.dictionary.wxservice;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.dao.his.dictionary.ServiceNumberDao;
import thyyxxk.webserver.dao.his.dictionary.wxservice.ZdHealthEducationDao;
import thyyxxk.webserver.dao.his.dictionary.wxservice.ZdHealthEducationTypeDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.dictionary.CodeName;
import thyyxxk.webserver.entity.dictionary.wxservice.ZdHealthEducation;
import thyyxxk.webserver.entity.dictionary.wxservice.ZdHealthEducationType;
import thyyxxk.webserver.utils.ResultVoUtil;
import thyyxxk.webserver.utils.StringUtil;

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

/**
 * @ClassName ServiceNumberService
 * @Author hsh
 * @Date 2024/3/22 8:54
 * @Version 1.0
 * @Description 服务号相关字典
 **/
@Service
@Slf4j
public class ServiceNumberService {

    private final ServiceNumberDao dao;

    private final ZdHealthEducationDao healthEducationDao;

    private final ZdHealthEducationTypeDao zdHealthEducationTypeDao;

    public ServiceNumberService(ServiceNumberDao dao, ZdHealthEducationDao healthEducationDao,
                                ZdHealthEducationTypeDao zdHealthEducationTypeDao) {
        this.dao = dao;
        this.healthEducationDao = healthEducationDao;
        this.zdHealthEducationTypeDao = zdHealthEducationTypeDao;
    }

    public ResultVo<Map<String, List<CodeName>>> selectServiceNumberDict(){
        Map<String, List<CodeName>> map = new HashMap<>();
        List<CodeName> list = dao.selectHealthEducationType();
        map.put("HEType", list);
        return ResultVoUtil.success(map);
    }

    public ResultVo<List<ZdHealthEducation>> selectHealthEducation(){
        return ResultVoUtil.success(healthEducationDao.selectHealthEducation());
    }

    public ResultVo<Map<String, Object>> saveHealthEducation(ZdHealthEducation zdHealthEducation){

        if(null == zdHealthEducation){
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "健康教育字典信息不存在，请检查！");
        }

        Map<String, Object> resultMap = new HashMap<>();
        String code = zdHealthEducation.getCode();
        ZdHealthEducation healthEducation = healthEducationDao.selectHealthEducationByCode(code);
        // 设置健康教育类型名称
        List<CodeName> he = dao.selectHealthEducationType();
        Optional<CodeName> s = he.stream().filter(codeName -> codeName.getCode().equals(zdHealthEducation.getType())).findFirst();
        s.ifPresent(codeName -> zdHealthEducation.setTypeName(codeName.getName()));
        int num;
        try{
            if(null != healthEducation){
                num = healthEducationDao.updateHealthEducationByCode(zdHealthEducation);
            } else {
                String maxCode = healthEducationDao.selectMaxCodeOfHealthEducation();
                String newCode;
                if(StringUtil.isEmpty(maxCode)){
                    newCode = "01";
                } else if(maxCode.startsWith("0")){
                    int number = Integer.parseInt(maxCode.replace("0", ""));
                    if(number == 9){
                        newCode = (number + 1) + "";
                    } else {
                        newCode = "0" + (number + 1);
                    }
                } else {
                    int number = Integer.parseInt(maxCode);
                    newCode = (number + 1) + "";
                }
                zdHealthEducation.setCode(newCode);
                num = healthEducationDao.insert(zdHealthEducation);
            }
            if(num == 0){
                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存健康教育字典信息失败！");
            }
            resultMap.put("cg", "保存健康教育字典信息成功！");
            return ResultVoUtil.success(resultMap);
        } catch(Exception e){
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存健康教育字典信息失败！");
        }
    }

    public ResultVo<Map<String, Object>> delHealthEducationByCode(String code) {
        if (StringUtil.isBlank(code)) {
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有健康教育字典编码，请检查！");
        }

        Map<String, Object> resultMap = new HashMap<>();
        try{
            int num = healthEducationDao.deleteHealthEducationByCode(code);
            if(num == 0){
                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "删除健康教育字典失败！");
            }
            resultMap.put("cg", "删除健康教育字典成功！");
            return ResultVoUtil.success(resultMap);
        } catch(Exception e){
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "删除健康教育字典失败！");
        }
    }

    public ResultVo<List<ZdHealthEducationType>> selectHeType(){
        return ResultVoUtil.success(zdHealthEducationTypeDao.selectHeType());
    }

    public ResultVo<Map<String, Object>> saveHeType(ZdHealthEducationType zdHealthEducationType){

        if(null == zdHealthEducationType || zdHealthEducationType.getCode() == null){
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "健康教育类型信息不存在，请检查！");
        }

        Map<String, Object> resultMap = new HashMap<>();
        String code = zdHealthEducationType.getCode();
        ZdHealthEducationType type = zdHealthEducationTypeDao.selectHeTypeByCode(code);
        int num;
        try{
            if(null != type){
                num = zdHealthEducationTypeDao.updateHeTypeByCode(zdHealthEducationType);
            } else {
                num = zdHealthEducationTypeDao.insert(zdHealthEducationType);
            }
            if(num == 0){
                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存健康教育类型信息失败！");
            }
            resultMap.put("cg", "保存健康教育类型信息成功！");
            return ResultVoUtil.success(resultMap);
        } catch(Exception e){
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存健康教育类型信息失败！");
        }
    }

    public ResultVo<Map<String, Object>> delHeTypeByCode(String code) {
        if (StringUtil.isBlank(code)) {
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有健康教育类型编码，请检查！");
        }

        Map<String, Object> resultMap = new HashMap<>();
        try{
            int num = zdHealthEducationTypeDao.deleteHeTypeByCode(code);
            if(num == 0){
                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "删除健康教育类型失败！");
            }
            resultMap.put("cg", "删除健康教育类型成功！");
            return ResultVoUtil.success(resultMap);
        } catch(Exception e){
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "删除健康教育类型失败！");
        }
    }

}
