package cn.hnthyy.thmz.controller.zy;

import cn.hnthyy.thmz.Utils.DateUtil;
import cn.hnthyy.thmz.Utils.TokenUtil;
import cn.hnthyy.thmz.comment.UserLoginToken;
import cn.hnthyy.thmz.entity.his.zy.ZyDetailCharge;
import cn.hnthyy.thmz.entity.thmz.User;
import cn.hnthyy.thmz.service.his.yz.YzActOrderService;
import cn.hnthyy.thmz.service.his.zy.NewZyjsService;
import cn.hnthyy.thmz.service.thmz.ZyjsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
public class ZyjsController {
    /**
     * 出院结算
     */
    private static final Integer DISMISSFLAG_CY=1;
    /**
     * 中间断账
     */
    private static final Integer DISMISSFLAG_ZJDZ=2;
    @Autowired
    private ZyjsService zyjsService;
    @Autowired
    private NewZyjsService newZyjsService;
    @Autowired
    private YzActOrderService yzActOrderService;


//    /**
//     * 获取异常状态医嘱列表
//     *
//     * @return
//     */
//    @UserLoginToken
//    @RequestMapping(value = "/getActOrders", method = {RequestMethod.POST})
//    public Map<String, Object> getActOrders(@RequestBody ZyActpatient zyActpatient) {
//        Map<String, Object> resultMap = new HashMap<>();
//        try {
//            if (zyActpatient == null) {
//                resultMap.put("code", -1);
//                resultMap.put("message", "查询参数不能为空");
//                return resultMap;
//            }
//            if (StringUtils.isBlank(zyActpatient.getInpatientNo())) {
//                resultMap.put("code", -1);
//                resultMap.put("message", "住院号不能为空");
//                return resultMap;
//            }
//            if (zyActpatient.getAdmissTimes() == null) {
//                resultMap.put("code", -1);
//                resultMap.put("message", "住院次数不能为空");
//                return resultMap;
//            }
//            List<ActOrderGroup> list= zyjsService.getActOrders(zyActpatient.getInpatientNo(),zyActpatient.getAdmissTimes());
//            if(list==null){
//                resultMap.put("code", -1);
//                resultMap.put("message", "查询出错，请稍后重试");
//                return resultMap;
//            }
//            resultMap.put("code", 0);
//            resultMap.put("message", "查询异常状态医嘱列表信息成功");
//            resultMap.put("data", list);
//            return resultMap;
//        } catch (Exception e) {
//            e.printStackTrace();
//            resultMap.put("code", -1);
//            resultMap.put("message", "查询异常状态医嘱列表失败，系统出错，请联系管理员");
//            log.error("查询异常状态医嘱列表失败，系统异常，错误信息{}", e.getMessage());
//            return resultMap;
//        }
//    }
//
//
//    /**
//     * 费用计算
//     *
//     * @return
//     */
//    @UserLoginToken
//    @RequestMapping(value = "/verification", method = {RequestMethod.GET})
//    public Map<String, Object> verification(@RequestParam("inpatientNo") String inpatientNo,@RequestParam("dismissFlag") Integer dismissFlag,@RequestParam("zjdzDatetime") String zjdzDatetime, HttpServletRequest httpServletRequest) {
//        Map<String, Object> resultMap = new HashMap<>();
//        try {
//            if (StringUtils.isBlank(inpatientNo)) {
//                resultMap.put("code", -1);
//                resultMap.put("message", "住院号不能为空");
//                return resultMap;
//            }
//            if (dismissFlag == null) {
//                resultMap.put("code", -1);
//                resultMap.put("message", "结算标志不能为空");
//                return resultMap;
//            }
//            if (DISMISSFLAG_ZJDZ==dismissFlag && StringUtils.isBlank(zjdzDatetime)) {
//                resultMap.put("code", -1);
//                resultMap.put("message", "中间断账时间不能为空");
//                return resultMap;
//            }
//            User tokenUser = TokenUtil.getUser(httpServletRequest);
//            Map<String, Object> result= zyjsService.verification(tokenUser.getUserIdCode(),inpatientNo,dismissFlag,zjdzDatetime);
//            if(result==null){
//                resultMap.put("code", -1);
//                resultMap.put("message", "费用计算出错，请稍后重试");
//                return resultMap;
//            }
//            Integer code=(Integer) result.get("code");
//            if(code==2001){
//                resultMap.put("code", -1);
//                resultMap.put("message", result.get("message"));
//                return resultMap;
//            }
//            if(code==1004){
//                resultMap.put("code", -1);
//                resultMap.put("message", result.get("message"));
//                resultMap.put("data", result.get("data"));
//                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());
//            return resultMap;
//        }
//    }



    /**
     * 出院结算
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/execute", method = {RequestMethod.GET})
    public Map<String, Object> execute(@RequestParam("inpatientNo") String inpatientNo,@RequestParam("admissTimes") Integer admissTimes,@RequestParam("dismissFlag") Integer dismissFlag,@RequestParam("zjdzDatetime") String zjdzDatetime, HttpServletRequest httpServletRequest) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(inpatientNo)) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院号不能为空");
                return resultMap;
            }
            if (admissTimes == null) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院次数不能为空");
                return resultMap;
            }

            List<Map<String, Object>> list= zyjsService.getActOrders(inpatientNo,admissTimes);
            if(list==null){
                resultMap.put("code", -1);
                resultMap.put("message", "查询出错，请稍后重试");
                return resultMap;
            }
            if(list.size()>0){
                resultMap.put("code", -2);
                resultMap.put("message", "查询异常状态医嘱列表信息成功");
                for (Map<String, Object> map:list){
                    List<Map<String, Object>> tempList=(List<Map<String, Object>>)map.get("list");
                    if(tempList!=null && tempList.size()>0){
                        Map<String, Object> actOrderDetail= tempList.get(0);
                        map.put("actOrderNo",actOrderDetail.get("actOrderNo"));
                        map.put("orderName",actOrderDetail.get("orderName"));
                        map.put("frequCode",actOrderDetail.get("frequCode"));
                        map.put("cxFlag",actOrderDetail.get("cxFlag"));
                        map.put("startTime",actOrderDetail.get("startTime"));
                        map.put("endTime",actOrderDetail.get("endTime"));
                        map.put("physician",actOrderDetail.get("physician"));
                        map.put("enterOper",actOrderDetail.get("enterOper"));
                        map.put("wardName",actOrderDetail.get("wardName"));
                        map.put("chargeStatus",actOrderDetail.get("chargeStatus"));
                    }
                }
                resultMap.put("data", list);
                return resultMap;
            }
            if (dismissFlag == null) {
                resultMap.put("code", -1);
                resultMap.put("message", "结算标志不能为空");
                return resultMap;
            }
            if (DISMISSFLAG_ZJDZ==dismissFlag && StringUtils.isBlank(zjdzDatetime)) {
                resultMap.put("code", -1);
                resultMap.put("message", "中间断账时间不能为空");
                return resultMap;
            }
            User tokenUser = TokenUtil.getUser(httpServletRequest);
            Map<String, Object> result= zyjsService.verification(tokenUser.getUserIdCode(),inpatientNo,admissTimes,dismissFlag,zjdzDatetime);
            if(result==null){
                resultMap.put("code", -1);
                resultMap.put("message", "费用计算出错，请稍后重试");
                return resultMap;
            }
            Integer code=(Integer) result.get("code");
            if(code==2001){
                resultMap.put("code", -1);
                resultMap.put("message", result.get("message"));
                return resultMap;
            }
            if(code==1004){
                resultMap.put("code", -3);
                resultMap.put("message", result.get("message"));
                resultMap.put("data", result.get("data"));
                return resultMap;
            }
            result= zyjsService.execute(tokenUser.getUserIdCode(),inpatientNo,admissTimes,dismissFlag,zjdzDatetime);
            if(result==null){
                resultMap.put("code", -1);
                resultMap.put("message", "出院结算出错，请稍后重试");
                return resultMap;
            }
            code=(Integer) result.get("code");
            if(code==200){
                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;
        }
    }




    /**
     * 获取出院医嘱与系统时间的间隔天数
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/getIntervalDayForLeaveHis", method = {RequestMethod.GET})
    public Map<String, Object> getIntervalDayForLeaveHis(@RequestParam("inpatientNo") String inpatientNo,@RequestParam("admissTimes") Integer admissTimes) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(inpatientNo)) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院号不能为空");
                return resultMap;
            }
            if (admissTimes == null) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院次数不能为空");
                return resultMap;
            }

            String yzDate= yzActOrderService.queryLeaveOrderDate(inpatientNo,admissTimes);
            if(StringUtils.isBlank(yzDate)){
                resultMap.put("code", -1);
                resultMap.put("message", "当前病人没有出院医嘱，无法进行出院结算！");
                return resultMap;
            }
            if(DateUtil.differentDaysByMillisecond(DateUtil.pase(yzDate,"yyyy-MM-dd"),new Date())>=7){
                resultMap.put("code", 0);
                resultMap.put("message", "当前病人出院医嘱日期与系统时间超过7天，是否继续办理出院结算？");
                resultMap.put("data", yzDate);
                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());
            return resultMap;
        }
    }






    /**
     * 出院结算新
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/executeNew", method = {RequestMethod.GET})
    public Map<String, Object> executeNew(@RequestParam("inpatientNo") String inpatientNo,@RequestParam("admissTimes") Integer admissTimes,@RequestParam("dismissFlag") Integer dismissFlag,@RequestParam("zjdzDatetime") String zjdzDatetime, HttpServletRequest httpServletRequest) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(inpatientNo)) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院号不能为空");
                return resultMap;
            }
            if (admissTimes == null) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院次数不能为空");
                return resultMap;
            }

            List<Map<String, Object>> list= newZyjsService.getActOrders(inpatientNo,admissTimes);
            if(list==null){
                resultMap.put("code", -1);
                resultMap.put("message", "查询出错，请稍后重试");
                return resultMap;
            }
            if(list.size()>0){
                resultMap.put("code", -2);
                resultMap.put("message", "查询异常状态医嘱列表信息成功");
                resultMap.put("data", list);
                return resultMap;
            }
            if (dismissFlag == null) {
                resultMap.put("code", -1);
                resultMap.put("message", "结算标志不能为空");
                return resultMap;
            }
            if (DISMISSFLAG_ZJDZ==dismissFlag && StringUtils.isBlank(zjdzDatetime)) {
                resultMap.put("code", -1);
                resultMap.put("message", "中间断账时间不能为空");
                return resultMap;
            }
            User tokenUser = TokenUtil.getUser(httpServletRequest);
            Map<String, Object> result= zyjsService.verification(tokenUser.getUserIdCode(),inpatientNo,admissTimes,dismissFlag,zjdzDatetime);
            if(result==null){
                resultMap.put("code", -1);
                resultMap.put("message", "费用计算出错，请稍后重试");
                return resultMap;
            }
            Integer code=(Integer) result.get("code");
            if(code==2001){
                resultMap.put("code", -1);
                resultMap.put("message", result.get("message"));
                return resultMap;
            }
            if(code==1004){
                resultMap.put("code", -3);
                resultMap.put("message", result.get("message"));
                resultMap.put("data", result.get("data"));
                return resultMap;
            }
            result= zyjsService.execute(tokenUser.getUserIdCode(),inpatientNo,admissTimes,dismissFlag,zjdzDatetime);
            if(result==null){
                resultMap.put("code", -1);
                resultMap.put("message", "出院结算出错，请稍后重试");
                return resultMap;
            }
            code=(Integer) result.get("code");
            if(code==200){
                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;
        }
    }




    /**
     * 取消出院结算
     *
     * @return
     */
    @UserLoginToken
    @RequestMapping(value = "/cancelTheSettlement", method = {RequestMethod.GET})
    public Map<String, Object> cancelTheSettlement(@RequestParam("inpatientNo") String inpatientNo,@RequestParam("admissTimes") Integer admissTimes) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            if (StringUtils.isBlank(inpatientNo)) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院号不能为空");
                return resultMap;
            }
            if (admissTimes == null) {
                resultMap.put("code", -1);
                resultMap.put("message", "住院次数不能为空");
                return resultMap;
            }
            newZyjsService.cancelTheSettlement(inpatientNo,admissTimes);
            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());
            return resultMap;
        }
    }



}
