package com.yihu.wlyy.web.doctor.sign;

import java.text.SimpleDateFormat;
import java.util.*;

import com.yihu.wlyy.util.IdCardUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import com.yihu.wlyy.entity.patient.Patient;
import com.yihu.wlyy.service.app.account.DoctorInfoService;
import com.yihu.wlyy.service.app.account.PatientInfoService;
import com.yihu.wlyy.service.app.sign.SignWebService;
import com.yihu.wlyy.util.CommonUtil;
import com.yihu.wlyy.util.DateUtil;
import com.yihu.wlyy.web.BaseController;

/**
 * 医生端:签约管理控制类
 *
 * @author AndyTsai
 */

@RestController
@RequestMapping(value = "/doctor/sign", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@Api(description = "医生端-签约管理")
public class DoctorSignController extends BaseController {

    //	@Autowired
//	private SignContractService signContractService;
    @Autowired
    private PatientInfoService patientInfoService;
    @Autowired
    private SignWebService signWebService;

    @Autowired
    private DoctorInfoService infoService;
    @Autowired
    StringRedisTemplate redisTemplate;

    /**
     * 三师签约列表查询
     *
     * @param type     类型：1已签约，2未过期
     * @param id
     * @param pagesize
     * @return
     */
//	@RequestMapping(value = "list")
//	@ResponseBody
//	public String list( int type,  long id,  int pagesize, @RequestParam(required=false) String patientName) {
//		try {
//			Page<Object> page = signContractService.findByDoctor(type, getUID(), id, pagesize,patientName);
//			JSONArray array = new JSONArray();
//			if (page != null) {
//				for (Object obj : page) {
//					Object[] temp = (Object[]) obj;
//					if (temp == null ) {
//						continue;
//					}
//					JSONObject json = new JSONObject();
//					json.put("id", temp[0]);
//					
//					// 患者姓名
//					json.put("name", temp[1]);
//					// 患者头像
//					json.put("photo", temp[2]);
//					// 省名称
//					json.put("provinceName", temp[3]);
//					// 城市名称
//					json.put("cityName", temp[4]);
//					// 区县名称
//					json.put("townName", temp[5]);
//					// 详细地址
//					json.put("address", temp[6]);
//					// 签约日期
//					json.put("qyrq", DateUtil.dateToStrShort((Date) temp[7]));
//					//患者标识
//					json.put("code", temp[8]);
//					//患者联系方式
//					json.put("mobile", temp[9]);
//					array.put(json);
//				}
//			}
//			return write(200, "查询成功！", "list", array);
//		} catch (Exception e) {
//			error(e);
//			return error(-1, "查询失败！");
//		}
//	}
    @RequestMapping(value = "list")
    @ResponseBody
    public String list(int type, long id, int pagesize, @RequestParam(required = false) String patientName) {
        try {
            String doctor = getUID();
            Page<Object> page = infoService.findPatientByDoctorSign(doctor, id, pagesize, patientName);
            JSONArray array = new JSONArray();
            Map<Object,Object> exitMap = new HashMap<>();
            if (page != null) {
                for (Object obj : page) {
                    Object[] temp = (Object[]) obj;
                    if (temp == null) {
                        continue;
                    }
                    if(exitMap.get(temp[9])!=null){//防止患者既有三师签约也有家庭签约导致数据重复
                        continue;
                    }
                    JSONObject json = new JSONObject();
                    json.put("id", temp[1]);

                    // 患者姓名
                    json.put("name", temp[2]);
                    // 患者头像
                    json.put("photo", temp[3]);
                    // 省名称
                    json.put("provinceName", temp[4]);
                    // 城市名称
                    json.put("cityName", temp[5]);
                    // 区县名称
                    json.put("townName", temp[6]);
                    // 详细地址
                    json.put("address", temp[7]);
                    // 签约日期
                    json.put("qyrq", DateUtil.dateToStrShort((Date) temp[8]));
                    //患者标识
                    json.put("code", temp[9]);
                    //患者联系方式
                    json.put("mobile", temp[10]);
                    array.put(json);
                    exitMap.put(temp[9],temp);
                }
            }
            return write(200, "查询成功！", "list", array);
        } catch (Exception e) {
            error(e);
            return error(-1, "查询失败！");
        }
    }


    /**
     * 患者信息查询
     *
     * @param patient 患者标识
     * @return
     */
    @RequestMapping(value = "patient")
    @ResponseBody
    public String patient(String patient) {
        try {
            Patient temp = patientInfoService.findByCode(patient);
            if (temp != null) {
                JSONObject json = new JSONObject();
                // 设置患者姓名
                json.put("name", temp.getName());
                // 设置患者头像
                json.put("photo", CommonUtil.getPhoneUrl(temp.getPhoto()));
                // 设置患者年龄
                json.put("age", DateUtil.getAgeByBirthday(temp.getBirthday()));
                // 设置患者性别
                json.put("sex", temp.getSex());
                // 设置手机号码
                //CommonUtil.getMobileEncode(temp.getMobile())
                json.put("mobile", temp.getMobile());
                // 设置身份证号
                json.put("idcard", CommonUtil.getIdcardEncode(temp.getIdcard()));
                // 设置社保卡号
                json.put("ssc", temp.getSsc());
                // 设置省名称
                json.put("province", temp.getProvinceName());
                // 设置市名称
                json.put("city", temp.getCityName());
                // 设置区县名称
                json.put("area", temp.getTownName());
                // 设置街道
                json.put("street", temp.getStreet());
                // 设置街道名称
                json.put("streetName", temp.getStreetName());
                // 设置地址
                json.put("address", temp.getAddress());
                return write(200, "患者信息查询成功！", "data", json);
            } else {
                return error(-1, "患者信息查询失败！");
            }
        } catch (Exception e) {
            error(e);
            return invalidUserException(e, -1, "患者信息查询失败！");
        }
    }

    /**
     * 获取签约患者信息
     *
     * @param status     签约状态 1:待签约 2 待解约 3 已签约  4已经解约  5未缴费
     * @param doctorType 医生类别 健管 3  全科 2
     * @return
     */
    @RequestMapping("/sign_info")
    public String getSignInfoByDoctor(
            int status,
            int doctorType,
            int page,
            int pageSize) {
        try {
            page = page > 0 ? page -1 : 0;
            List<Map<String, Object>> listSign = signWebService.getSignWebByDoctor(getUID(), status, page, pageSize);

            JSONObject data = new JSONObject();
            List<JSONObject> jsonArray = new ArrayList<>();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            if (listSign != null) {
                for (Map<String, Object> temp : listSign) {
                    if (temp == null) {
                        continue;
                    }
                    JSONObject json = new JSONObject();
                    json.put("code", temp.get("code"));
                    json.put("doctorCode", temp.get("doctor"));
                    json.put("patientCode", temp.get("patient"));
                    json.put("patientName", temp.get("name"));
                    json.put("age", IdCardUtil.getAgeForIdcard(String.valueOf(temp.get("idcard"))));
                    json.put("provinceName", temp.get("provinceName"));
                    json.put("cityName", temp.get("cityName"));
                    json.put("townName", temp.get("townName"));
                    json.put("address", temp.get("address"));
                    json.put("photo", temp.get("photo"));
                    json.put("status", temp.get("status"));
                    json.put("openid", temp.get("openid"));
                    String statusName = "";
                    switch (Integer.parseInt(temp.get("status").toString())) {
                        case 0:
                            statusName = "待签约";
                            break;
                        case 1:
                            statusName = "已签约";
                            break;
                        case 2:
                            statusName = "待解约";
                            break;
                        case -3:
                        case -4:
                            statusName = "已解约";
                            break;
                    }
                    json.put("statusName", statusName);
                    json.put("id", temp.get("id"));
                    json.put("applyDate", DateUtil.dateToStrLong((Date) temp.get("applyDate")));
                    json.put("releaseSpeak", temp.get("reason"));
                    json.put("streetName", temp.get("streetName"));
                    json.put("sex", temp.get("sex"));
                    if (status == 5) {
                        boolean epTime = false;
                        try {
                            epTime = redisTemplate.opsForSet().isMember("expenses:remind:set", temp.get("patient"));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        if (!epTime) {
                            json.put("expensesRemindStatus", 0);
                        } else {
                            json.put("expensesRemindStatus", 1);
                        }
                    }
                    if (status == 3) {
                        boolean epTime = false;
                        try {
                            epTime = redisTemplate.opsForSet().isMember("wechat:focus:remind:set", temp.get("patient"));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        if (!epTime) {
                            json.put("wechatFocusRemind", 0);
                        } else {
                            json.put("wechatFocusRemind", 1);
                        }
                    }
                    jsonArray.add(json);
                }
            }

            if (status == 5) {
                jsonArray.sort(new Comparator<JSONObject>() {
                    @Override
                    public int compare(JSONObject o1, JSONObject o2) {
                        if (o1.getInt("expensesRemindStatus") > o2.getInt("expensesRemindStatus")) {
                            return 1;
                        } else if (o1.getInt("expensesRemindStatus") < o2.getInt("expensesRemindStatus")) {
                            return -1;
                        } else if (o1.getInt("expensesRemindStatus") == o2.getInt("expensesRemindStatus")) {
                            return 0;
                        } else {
                            return 0;
                        }
                    }
                });
            }

            data.put("list", jsonArray);
//            data.put("totalPage", totalPage);
//            data.put("page", page);
            return write(200, "查询成功！", "data", data);
        } catch (Exception ex) {
            ex.printStackTrace();
            return error(-1, "系统错误,请联系管理员!");
        }
    }

    /**
     * 查询今天是否全部提醒关注
     *
     * @return
     */
    @RequestMapping(value = "/is_remind_focus_all")
    @ApiOperation(value = "今天是否已全部提醒关注")
    public String isRemindFocusAllToday(){
        try{
            return write(200,"查询成功","data",signWebService.isRemindFocusAll(getUID()));
        }catch (Exception e){
            return error(-1,"查询失败");
        }
    }

    /**
     * 查询今天是否全部提醒关注
     *
     * @return
     */
    @RequestMapping(value = "/is_remind_expenses_all")
    @ApiOperation(value = "今天是否已全部提醒缴费")
    public String isRemindFExpensesAllToday(){
        try{
            return write(200,"查询成功","data",signWebService.isRemindExpensesAll(getUID()));
        }catch (Exception e){
            e.printStackTrace();
            return error(-1,"查询失败");
        }
    }
}
