package cn.hnthyy.thmz.controller.mz;

import cn.hnthyy.thmz.Utils.IDCardUtil;
import cn.hnthyy.thmz.Utils.SeedUtil;
import cn.hnthyy.thmz.Utils.StringUtil;
import cn.hnthyy.thmz.comment.UserLoginToken;
import cn.hnthyy.thmz.entity.his.mz.MzPatientMi;
import cn.hnthyy.thmz.enums.YesNoEnum;
import cn.hnthyy.thmz.service.his.mz.MzPatientMiService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.web.bind.annotation.*;

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

@Slf4j
@RestController
public class MzPatientMiController {
    @Autowired
    private MzPatientMiService mzPatientMiService;

    /**
     * 根据病人就诊卡号查询病人信息
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/getByIcCardNo", method = {RequestMethod.GET})
    public Map<String, Object> getByIcCardNo(@RequestParam("icCardNo") String icCardNo) {
        log.info("根据病人就诊卡号查询病人信息");
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(icCardNo)) {
                resultMap.put("code", -1);
                resultMap.put("message", "就诊卡号不能为空");
                return resultMap;
            }
            resultMap.put("code", 0);
            resultMap.put("message", "查询病人信息成功");
            resultMap.put("data", mzPatientMiService.queryByIcCardNo(icCardNo));
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", "系统出错，请联系管理员");
            log.error("系统异常，错误信息{}", e.getMessage());
            return resultMap;
        }
    }


//    /**
//     * 根据病人姓名查询病人信息
//     *
//     * @return
//     */
//    @UserLoginToken
//    @RequestMapping(value = "/getPatientMiByName", method = {RequestMethod.GET})
//    public Map<String, Object> getPatientMiByName(@RequestParam("name") String name, @RequestParam("pageIndex") Integer pageIndex) {
//        log.info("根据病人姓名查询病人信息");
//        Map<String, Object> resultMap = new HashMap<>();
//        try {
//            if (StringUtils.isBlank(name)) {
//                name = null;
//            }
//            if (pageIndex == null) {
//                pageIndex = 1;
//            }
//            resultMap.put("code", 0);
//            resultMap.put("message", "查询病人信息成功");
//            resultMap.put("data", mzPatientMiService.queryByNameFuzzy(name, pageIndex, 10));
//            return resultMap;
//        } catch (Exception e) {
//            e.printStackTrace();
//            resultMap.put("code", -1);
//            resultMap.put("message", "系统出错，请联系管理员");
//            log.error("系统异常，错误信息{}", e.getMessage());
//            return resultMap;
//        }
//    }



    /**
     * 根据病人姓名查询病人信息
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/getPatientMiByName", method = {RequestMethod.GET})
    public Map<String, Object> getPatientMiByName(@RequestParam("name") String name) {
        log.info("根据病人姓名查询病人信息");
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(name)) {
                name = null;
            }
            resultMap.put("code", 0);
            resultMap.put("message", "查询病人信息成功");
            resultMap.put("data", mzPatientMiService.queryByNameFuzzy(name, 0, 10000));
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", "系统出错，请联系管理员");
            log.error("系统异常，错误信息{}", e.getMessage());
            return resultMap;
        }
    }


    /**
     * 根据病人ID查询病人信息
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/getByPatientId", method = {RequestMethod.GET})
    public Map<String, Object> getByPatientId(@RequestParam("patientId") String patientId) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(patientId)) {
                resultMap.put("code", -1);
                resultMap.put("message", "病人id不能为空");
                return resultMap;
            }
            resultMap.put("code", 0);
            resultMap.put("message", "根据病人ID查询病人信息成功");
            resultMap.put("data", mzPatientMiService.queryByPatientId(patientId));
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", "系统出错，请联系管理员");
            log.error("系统异常，错误信息{}", e.getMessage());
            return resultMap;
        }
    }



    /**
     * 根据病人身份证号码查询病人信息
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/getBySocialNo", method = {RequestMethod.GET})
    public Map<String, Object> getBySocialNo(@RequestParam("socialNo") String socialNo) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(socialNo)) {
                resultMap.put("code", -1);
                resultMap.put("message", "病人身份证号码不能为空");
                return resultMap;
            }
            List<MzPatientMi> mzPatientMis=mzPatientMiService.queryBySocialNo(socialNo,null);
//            MzPatientMi mzPatientMi = null;
//            if(mzPatientMis!=null && mzPatientMis.size()>0){
//                mzPatientMi=mzPatientMis.get(0);
//            }
            resultMap.put("code", 0);
            resultMap.put("message", "根据病人身份证号码查询病人信息成功");
            resultMap.put("data", mzPatientMis);
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", "系统出错，请联系管理员");
            log.error("系统异常，错误信息{}", e.getMessage());
            return resultMap;
        }
    }



    /**
     * 根据病人身份证号码查询病人信息
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/getByPhoneNo", method = {RequestMethod.GET})
    public Map<String, Object> getByPhoneNo(@RequestParam("phoneNo") String phoneNo) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(phoneNo)) {
                resultMap.put("code", -1);
                resultMap.put("message", "病人手机号码不能为空");
                return resultMap;
            }
            List<MzPatientMi> mzPatientMis=mzPatientMiService.queryByPhoneNo(phoneNo);
//            MzPatientMi mzPatientMi = null;
//            if(mzPatientMis!=null && mzPatientMis.size()>0){
//                mzPatientMi=mzPatientMis.get(0);
//            }
            resultMap.put("code", 0);
            resultMap.put("message", "根据病人身份证号码查询病人信息成功");
            resultMap.put("data", mzPatientMis);
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", "系统出错，请联系管理员");
            log.error("系统异常，错误信息{},{}", e.getMessage(),"电话号码"+phoneNo);
            return resultMap;
        }
    }


    /**
     * 新增病人信息
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/savePatient", method = {RequestMethod.POST})
    public Map<String, Object> savePatient(@RequestBody MzPatientMi mzPatientMi) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (checkPatient(mzPatientMi, resultMap,YesNoEnum.NO)){
                return resultMap;
            }
            List<MzPatientMi> mzPatientMis=mzPatientMiService.queryBySocialNo(mzPatientMi.getSocialNo(),null);
            if(mzPatientMis!=null && mzPatientMis.size()>0){
                resultMap.put("code", -1);
                resultMap.put("message", "保存病人信息失败,已经存在相同的身份证号码记录");
                return resultMap;
            }
            mzPatientMi.setIcCardNo(mzPatientMi.getIcCardNo().trim());
            MzPatientMi dbMzPatientMi=mzPatientMiService.queryByIcCardNo(mzPatientMi.getIcCardNo());
            if(dbMzPatientMi!=null){
                resultMap.put("code", -1);
                resultMap.put("message", "新增病人信息失败,已经存在相同的诊疗卡");
                return resultMap;
            }
            int num=mzPatientMiService.saveMzPatientMi(mzPatientMi);
            if(num==1){
                resultMap.put("code", 0);
                resultMap.put("message", "保存病人信息成功");
                resultMap.put("data",mzPatientMi);
                return resultMap;
            }
            resultMap.put("code", -1);
            resultMap.put("message", "保存病人信息失败");
            return resultMap;
        } catch (Exception e) {
            if (e instanceof DataIntegrityViolationException){
                if(e.getMessage().contains("将截断字符串或二进制数据")){
                    resultMap.put("code", -1);
                    resultMap.put("message", "病人地址信息超长");
                    log.error("系统异常，错误信息{病人地址信息超长}");
                    return resultMap;
                }
            }
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", StringUtils.isBlank(e.getMessage())?"系统出错，请联系管理员":e.getMessage());
            log.error("系统异常，错误信息{}", e.getMessage());
            return resultMap;
        }
    }


    /**
     * 修改病人信息
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/modifyPatient", method = {RequestMethod.POST})
    public Map<String, Object> modifyPatient(@RequestBody MzPatientMi mzPatientMi) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (checkPatient(mzPatientMi, resultMap,YesNoEnum.YES)){
                return resultMap;
            }
            List<MzPatientMi> mzPatientMis=mzPatientMiService.queryBySocialNo(mzPatientMi.getSocialNo(),mzPatientMi.getPatientId());
            if(mzPatientMis!=null && mzPatientMis.size()>0){
                resultMap.put("code", -1);
                resultMap.put("message", "修改病人信息失败,已经存在相同的身份证号码记录");
                return resultMap;
            }
            mzPatientMi.setIcCardNo(mzPatientMi.getIcCardNo().trim());
            MzPatientMi dbMzPatientMi=mzPatientMiService.queryByIcCardNo(mzPatientMi.getIcCardNo());
            if(dbMzPatientMi!=null && !dbMzPatientMi.getPatientId().equals(mzPatientMi.getPatientId())){
                resultMap.put("code", -1);
                resultMap.put("message", "修改病人信息失败,已经存在相同的诊疗卡");
                return resultMap;
            }
            int num=mzPatientMiService.modifyMzPatientMi(mzPatientMi);
            if(num==1){
                resultMap.put("code", 0);
                resultMap.put("message", "修改病人信息成功");
                resultMap.put("data",mzPatientMi);
                return resultMap;
            }
            resultMap.put("code", -1);
            resultMap.put("message", "修改病人信息失败");
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", StringUtils.isBlank(e.getMessage())?"系统出错，请联系管理员":e.getMessage());
            log.error("系统异常，错误信息{}", e.getMessage());
            return resultMap;
        }
    }


    /**
     * 校验病人信息
     * @param mzPatientMi
     * @param resultMap
     * @param yesNo 是否校验病人主键是否存在 yes 校验 no 反之
     * @return
     */
    private boolean checkPatient(@RequestBody MzPatientMi mzPatientMi, Map<String, Object> resultMap, YesNoEnum yesNo) {
        if (mzPatientMi == null) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人信息不能为空");
            return true;
        }
        if (YesNoEnum.YES.equals(yesNo) && StringUtils.isBlank(mzPatientMi.getPatientId())) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人id不能为空");
            return true;
        }
        if (StringUtils.isBlank(mzPatientMi.getIcCardNo())) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人卡号不能为空");
            return true;
        }
        if (StringUtils.isBlank(mzPatientMi.getName())) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人姓名不能为空");
            return true;
        }
        if (mzPatientMi.getAge() == null) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人年龄不能为空");
            return true;
        }
        if (mzPatientMi.getSex() == null) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人性别不能为空");
            return true;
        }
        if (mzPatientMi.getBirthDay() == null) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人出生日期不能为空");
            return true;
        }
        if (StringUtils.isBlank(mzPatientMi.getPhoneNo())) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人手机号码不能为空");
            return true;
        }
        if (StringUtils.isBlank(mzPatientMi.getResponseType())) {
            resultMap.put("code", -1);
            resultMap.put("message", "病人性质不能为空");
            return true;
        }
        if(!mzPatientMi.getSocialNo().startsWith("K")){
            //校验身份证号码格式
            String checkResult = IDCardUtil.IdentityCardVerification(mzPatientMi.getSocialNo());
            if (StringUtils.isNotBlank(mzPatientMi.getSocialNo()) && StringUtils.isNotBlank(checkResult)) {
                resultMap.put("code", -1);
                resultMap.put("message", checkResult);
                return true;
            }
        }
        //校验手机号码格式
        String checkResult = StringUtil.isPhone(mzPatientMi.getPhoneNo());
        if (StringUtils.isNotBlank(checkResult)) {
            resultMap.put("code", -1);
            resultMap.put("message", checkResult);
            return true;
        }
        //如果紧急联系人电话不为空，校验紧急联系电话号码
        if(StringUtils.isNotBlank(mzPatientMi.getContractName())){
            checkResult = StringUtil.isPhone(mzPatientMi.getContractName());
            if(StringUtils.isNotBlank(checkResult)){
                resultMap.put("code", -1);
                resultMap.put("message", checkResult);
                return true;
            }
        }
        if (StringUtils.isBlank(mzPatientMi.getSocialNo())) {
//            resultMap.put("code", -1);
//            resultMap.put("message", "病人身份证号码不能为空");
//            return true;
            mzPatientMi.setSocialNo(SeedUtil.getId());
        }
        return false;
    }



    /**
     * 验证病人身份证
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/identityCardVerification", method = {RequestMethod.GET})
    public Map<String, Object> identityCardVerification(@RequestParam("patientId") String patientId) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(patientId)) {
                resultMap.put("code", -1);
                resultMap.put("message", "病人ID不能为空");
                return resultMap;
            }
            MzPatientMi mzPatientMi =mzPatientMiService.queryByPatientId(patientId);
            if(mzPatientMi==null){
                resultMap.put("code", -1);
                resultMap.put("message", "病人不存在");
                return resultMap;
            }
            //校验身份证号码格式
            String checkResult = IDCardUtil.IdentityCardVerification(mzPatientMi.getSocialNo());
            if (StringUtils.isNotBlank(mzPatientMi.getSocialNo()) && StringUtils.isNotBlank(checkResult)) {
                resultMap.put("code", -1);
                resultMap.put("message", checkResult);
                return resultMap;
            }
            resultMap.put("code", 0);
            resultMap.put("message", "身份证校验成功");
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", "系统出错，请联系管理员");
            log.error("系统异常，错误信息{},{}", e.getMessage(),"病人ID"+patientId);
            return resultMap;
        }
    }


    /**
     * 消卡
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/clearIcCardNo", method = {RequestMethod.GET})
    public Map<String, Object> clearIcCardNo(@RequestParam String patientId) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(patientId)) {
                resultMap.put("code", -1);
                resultMap.put("message", "销卡的病人id不能为空");
                return resultMap;
            }
            int num = mzPatientMiService.clearIcCardNo(patientId);
            if (num == 1) {
                resultMap.put("code", 0);
                resultMap.put("message", "销卡成功");
                return resultMap;
            }
            resultMap.put("code", -1);
            resultMap.put("message", "销卡失败");
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("code", -1);
            resultMap.put("message", "销卡失败，系统出错，请联系管理员");
            log.error("销卡失败，系统异常，错误信息{}", e.getMessage());
            return resultMap;
        }
    }

}
