package com.xinelu.applet.controller.appletlogin;

import com.xinelu.applet.dto.appletlogin.AppointmentInfoDTO;
import com.xinelu.applet.dto.appletlogin.StationItemInfoDTO;
import com.xinelu.applet.service.appletlogin.AppletLoginService;
import com.xinelu.common.annotation.MobileRequestAuthorization;
import com.xinelu.common.annotation.RepeatSubmit;
import com.xinelu.common.core.controller.BaseController;
import com.xinelu.common.core.domain.AjaxResult;
import com.xinelu.common.custominterface.Insert;
import com.xinelu.common.custominterface.Query;
import com.xinelu.common.exception.ServiceException;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Objects;

/**
 * @Description 微信小程序登录注册控制器
 * @Author 纪寒
 * @Date 2022-09-02 10:53:35
 * @Version 1.0
 */
@RestController
@RequestMapping("/nurseApplet/login")
public class AppletLoginController extends BaseController {

    @Resource
    private AppletLoginService appletLoginService;

    /**
     * 根据登录凭证获取用户的登录信息
     *
     * @param loginCode 登录凭证
     * @param phoneCode 获取手机号登录凭证
     * @return 微信用户登录信息
     */
    @MobileRequestAuthorization
    @GetMapping("/getWeChatUserInfo")
    public AjaxResult appletLogin(@RequestParam("loginCode") String loginCode, @Param("phoneCode") String phoneCode) {
        if (StringUtils.isBlank(loginCode)) {
            return AjaxResult.error("登录凭证编码不能为空！");
        }
        if (StringUtils.isBlank(phoneCode)) {
            return AjaxResult.error("获取手机号凭证不存在");
        }
        return appletLoginService.appletLogin(loginCode, phoneCode);
    }

    /**
     * 根据用户Id获取用户的登录信息
     *
     * @param patientId 用户Id
     * @return 被护理人信息
     */
    @MobileRequestAuthorization
    @GetMapping("/getPatientInfo")
    public AjaxResult getPatientInfoByPatientId(Long patientId) {
        if (Objects.isNull(patientId)) {
            return AjaxResult.error("用户信息不能为空！");
        }
        return appletLoginService.getPatientInfoByPatientId(patientId);
    }

    /**
     * 根据护理站id和护理站项目id查询对应的护理项目信息及项目海报(护理项目详情app小程序公用，0203修改)
     *
     * @param itemInfoDTO 输入参数
     * @return 护理站项目信息集合
     */
    @GetMapping("/getStationItemInfo")
    public AjaxResult getStationItemAndConsumableInfo(@Validated(Query.class) StationItemInfoDTO itemInfoDTO) {
        if (Objects.isNull(itemInfoDTO)) {
            return AjaxResult.error("护理站信息不能为空！");
        }
        return appletLoginService.getStationItemAndConsumableInfo(itemInfoDTO);
    }

    /**
     * 预约提交方法（微信小程序和手机App共用）
     *
     * @param dto 输入参数
     * @return 预约结果
     */
    @MobileRequestAuthorization
    @RepeatSubmit
    @PostMapping("/appointment")
    public AjaxResult nurseAppointment(@Validated(Insert.class) @RequestBody AppointmentInfoDTO dto, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            throw new ServiceException(bindingResult.getAllErrors().get(0).getDefaultMessage());
        }
        if (Objects.isNull(dto)) {
            return AjaxResult.error("预约信息不能为空！");
        }
        if (Objects.nonNull(dto.getTotalPrice()) && dto.getTotalPrice().compareTo(BigDecimal.ZERO) <= 0) {
            return AjaxResult.error("订单金额不能为负数，请输入正确的订单金额！");
        }
        return appletLoginService.nurseAppointment(dto);
    }

    /**
     * 根据openid判断当前用户信息是否存在，微信小程序登录页使用
     *
     * @param openId 微信用户的openid
     * @return 护理人列表集合， 标识，LOGIN：已登录，NOT_LOGIN：未登录
     */
    @GetMapping("/existPatientInfo")
    public AjaxResult existPatientInfo(String openId) {
        if (StringUtils.isBlank(openId)) {
            return AjaxResult.error("会员用户微信唯一标识不存在！");
        }
        return appletLoginService.existPatientInfo(openId);
    }

    /**
     * 查询省级区域信息信息（小程序app修改用户地址信息查询）
     *
     * @return 省级区域信息集合
     */
    @GetMapping("/getProvinceInfo")
    public AjaxResult getProvinceAreaInfo() {
        return appletLoginService.getProvinceAreaInfo();
    }

    /**
     * 根据父级区域编码查询下级区域（小程序app修改用户地址信息查询）
     *
     * @param areaCode 父级区域编码
     * @return 所属下级区域信息集合
     */
    @GetMapping("/getSubordinateInfo")
    public AjaxResult getSubordinateAreaInfo(String areaCode) {
        if (StringUtils.isBlank(areaCode)) {
            return AjaxResult.error("上级区域编码不能为空");
        }
        return appletLoginService.getSubordinateAreaInfo(areaCode);
    }


}
