package com.sqx.modules.app.controller.app;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.IAppleService;
import com.sqx.modules.app.service.UserService;
import com.sqx.modules.app.utils.UserConstantInterface;
import com.sqx.modules.app.utils.WxPhone;
import com.sqx.modules.common.entity.CommonInfo;
import com.sqx.modules.common.service.CommonInfoService;
import com.sqx.modules.message.entity.MessageInfo;
import com.sqx.modules.message.service.MessageService;
import com.sqx.modules.utils.HttpClientUtil;
import com.sqx.modules.utils.MD5Util;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import weixin.popular.api.SnsAPI;
import weixin.popular.bean.sns.SnsToken;

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

/**
 * APP登录授权
 */
@RestController
@RequestMapping("/app/Login")
@Api(value = "APP登录接口", tags = {"APP登录接口"})
@Slf4j
public class AppLoginController {
    @Autowired
    private UserService userService;
    @Autowired
    private IAppleService appleService;
    @Autowired
    private CommonInfoService commonInfoService;
    @Autowired
    private MessageService messageService;

    @ApiOperation("用户端微信小程序登陆")
    @RequestMapping(value = "/wxLogin", method = RequestMethod.GET)
    public Result wxLogin(@ApiParam("小程序code码") String code) {
        return userService.wxLogin(code, 1);
    }


    @ApiOperation("用户端小程序登录新增或修改个人信息")
    @RequestMapping(value = "/insertWxUser", method = RequestMethod.POST)
    public Result insertWxUser(@RequestBody UserEntity userInfo) {
        userInfo.setUserType(1);
        return userService.wxRegister(userInfo);
    }


    @ApiOperation("师傅师傅微信小程序登陆")
    @RequestMapping(value = "/wxRiderLogin", method = RequestMethod.GET)
    public Result wxRiderLogin(@ApiParam("小程序code码") String code) {
        return userService.wxLogin(code, 2);
    }


    @ApiOperation("师傅师傅小程序登录新增或修改个人信息")
    @RequestMapping(value = "/insertWxRiderUser", method = RequestMethod.POST)
    public Result insertWxRiderUser(@RequestBody UserEntity userInfo) {
        userInfo.setUserType(2);
        return userService.wxRegister(userInfo);
    }


    @RequestMapping(value = "/appleLogin", method = RequestMethod.GET)
    @ApiOperation("苹果登陆获取appleUserId")
    public Result loginVerify(@RequestParam("identityToken") String identityToken) {
        try {
            log.info("苹果token：{}", identityToken);
            JSONObject jsonObject = JSON.parseObject(identityToken);
            JSONObject userInfo = jsonObject.getJSONObject("userInfo");
            String identityTokens = userInfo.getString("identityToken");
            return appleService.getAppleUserInfo(identityTokens);
        } catch (Exception e) {
            log.error("苹果token校验失败：{}", identityToken, e);
            return Result.error("苹果账号验证失败，请退出重试！");
        }
    }


    @ApiOperation("苹果登录")
    @RequestMapping(value = "/insertAppleUser", method = RequestMethod.GET)
    public Result insertAppleUser(@RequestParam String appleId) {
        return userService.iosRegister(appleId);
    }

    @RequestMapping(value = "/iosBindMobile", method = RequestMethod.POST)
    @ApiOperation("苹果登录绑定手机号")
    @ResponseBody
    public Result iosBindMobile(@RequestParam String phone, @RequestParam String code, @RequestParam String appleId, @RequestParam String platform, @RequestParam Integer sysPhone) {
        return userService.iosBindMobile(phone, code, appleId, platform, sysPhone);
    }


    @RequestMapping(value = "/wxAppLogin", method = RequestMethod.POST)
    @ApiOperation("微信APP登录")
    @ResponseBody
    public Result wxAppLogin(@RequestParam String wxOpenId, @RequestParam String token) {
        return userService.wxAppLogin(wxOpenId, token);
    }


    @RequestMapping(value = "/wxBindMobile", method = RequestMethod.POST)
    @ApiOperation("微信登录绑定手机号")
    @ResponseBody
    public Result wxBindMobile(@RequestParam String phone, @RequestParam String code, @RequestParam String wxOpenId, @RequestParam String token, @RequestParam String platform, @RequestParam Integer sysPhone) {
        return userService.wxBindMobile(phone, code, wxOpenId, token, platform, sysPhone);
    }

    @GetMapping("/wxOpenIdLogin")
    @ApiOperation("公众号openId登录")
    public Result wxOpenIdLogin(String openId, Integer userType) {
        return userService.wxOpenIdLogin(openId, userType);
    }

    @ApiOperation("用户端openid登录")
    @RequestMapping(value = "/openid/login", method = RequestMethod.GET)
    @ResponseBody
    public Result loginByOpenId(@RequestParam String openId, @RequestParam Integer userType) {
        return userService.loginByOpenId(openId);
    }

    @RequestMapping(value = "/registerCode", method = RequestMethod.POST)
    @ApiOperation("app或h5注册或登录")
    @ResponseBody
    public Result registerCode(String phone, String msg, String platform, Integer sysPhone, String password, Integer userType, String openId, String inviterCode) {
        return userService.registerCode(phone, msg, platform, sysPhone, password, userType, openId, inviterCode);
    }

    @ApiOperation("用户端发送验证码")
    @RequestMapping(value = "/sendMsg/{phone}/{state}", method = RequestMethod.GET)
    @ResponseBody
    public Result sendMsg(@PathVariable String phone, @PathVariable String state) {
        return userService.sendMsg(phone, state);
    }

    @ApiOperation("解密手机号")
    @RequestMapping(value = "/selectPhone", method = RequestMethod.POST)
    public Result getPhoneNumberBeanS5(@RequestBody WxPhone wxPhone) {
        return UserConstantInterface.decryptS5(wxPhone.getDecryptData(), wxPhone.getKey(), wxPhone.getIv());
    }

    @ApiParam("登录app")
    @RequestMapping(value = "/loginApp", method = RequestMethod.POST)
    public Result loginApp(@RequestParam String phone, @RequestParam String password, @RequestParam Integer userType, String accountOpenId) {
        return userService.loginApp(phone, password, userType, accountOpenId);
    }


    @ApiOperation("用户端忘记密码")
    @RequestMapping(value = "/forgetPwd", method = RequestMethod.POST)
    @ResponseBody
    public Result forgetPwd(String pwd, String phone, String msg) {
        return userService.forgetPwd(pwd, phone, msg);
    }


    @GetMapping("/selectCity")
    @ApiOperation("根据经纬度获取城市")
    public Result selectCity(String lat, String lng) {
        if (StringUtils.isNotBlank(lat) && StringUtils.isNotBlank(lng)) {
            String way = commonInfoService.findOne(414).getValue();
            if ("1".equals(way)) {
                List<MessageInfo> list = messageService.list(new QueryWrapper<MessageInfo>().eq("state", 12).eq("is_see", 1).orderByAsc("title"));
                for (MessageInfo messageInfo:list){
                    String url = "https://apis.map.qq.com/ws/geocoder/v1/";
                    Map<String, String> maps = new HashMap<>();
                    maps.put("location", lat + "," + lng);
                    maps.put("key", messageInfo.getContent());
                    String data = HttpClientUtil.doGet(url, maps);
                    JSONObject jsonObject = JSON.parseObject(data);
                    String status = jsonObject.getString("status");
                    if ("0".equals(status)) {
                        JSONObject result = jsonObject.getJSONObject("result");
                        JSONObject adInfo = result.getJSONObject("ad_info");
                        JSONObject jsonObject1 = result.getJSONObject("formatted_addresses");
                        String recommend = jsonObject1.getString("recommend");
                        adInfo.put("address", recommend);
                        if(StringUtils.isNotEmpty(messageInfo.getTitle())){
                            Integer num=Integer.parseInt(messageInfo.getTitle())+1;
                            messageInfo.setTitle(num.toString());
                        }else{
                            messageInfo.setTitle(String.valueOf(1));
                        }
                        messageService.updateById(messageInfo);
                        return Result.success().put("data", adInfo);
                    } else {
                        log.error("转换失败！！！原因:" + jsonObject.getString("message"));
                        messageInfo.setPlatform(jsonObject.getString("message"));
                        messageInfo.setIsSee("2");
                        messageService.updateById(messageInfo);
                    }
                }

                return Result.error("获取定位失败！");
            } else {
                String value = commonInfoService.findOne(415).getValue();
                String url = "http://api.tianditu.gov.cn/geocoder";
                Map<String, String> param = new HashMap<>();
                JSONObject postStr = new JSONObject();
                postStr.put("lon", lng);
                postStr.put("lat", lat);
                postStr.put("ver", "1");
                param.put("postStr", postStr.toJSONString());
                param.put("type", "geocode");
                param.put("tk", value);
                String s = HttpClientUtil.doGet(url, param);
                JSONObject jsonObject = JSONObject.parseObject(s);
                String status = jsonObject.getString("status");
                if ("0".equals(status)) {
                    JSONObject result = jsonObject.getJSONObject("result");
                    JSONObject addressComponent = result.getJSONObject("addressComponent");
                    String province = addressComponent.getString("province");
                    String city = addressComponent.getString("city");
                    if (StringUtils.isEmpty(city)) {
                        if ("新疆维吾尔自治区".equals(province) || "台湾省".equals(province)) {
                            city = addressComponent.getString("county");
                        } else {
                            city = addressComponent.getString("province");
                        }
                    }
                    String county = addressComponent.getString("county");
                    JSONObject jsonObject1 = new JSONObject();
                    jsonObject1.put("province", province);
                    jsonObject1.put("city", city);
                    jsonObject1.put("district", county);
                    jsonObject1.put("address", addressComponent.getString("address"));
                    return Result.success().put("data", jsonObject1);
                } else {
                    return Result.error("获取定位失败！");
                }

            }
        } else {
            return Result.error("位置信息获取失败");
        }
    }

    @GetMapping("/getOpenId")
    @ApiOperation("公众号根据code换取openId")
    public Result getOpenId(String code) {
        try {

            CommonInfo one = commonInfoService.findOne(5);
            CommonInfo two = commonInfoService.findOne(21);
            SnsToken snsToken = SnsAPI.oauth2AccessToken(one.getValue(), two.getValue(), code);
            String openid = snsToken.getOpenid();
            return Result.success().put("data", openid);
        } catch (Exception e) {
            throw new RuntimeException("GET_OPENID_FAIL");
        }

    }

    @GetMapping("/getRiderOpenId")
    @ApiOperation("公众号根据code换取openId")
    public Result getRiderOpenId(String code) {
        try {
            CommonInfo one = commonInfoService.findOne(262);
            CommonInfo two = commonInfoService.findOne(263);
            SnsToken snsToken = SnsAPI.oauth2AccessToken(one.getValue(), two.getValue(), code);
            String openid = snsToken.getOpenid();
            return Result.success().put("data", openid);
        } catch (Exception e) {
            throw new RuntimeException("GET_OPENID_FAIL");
        }

    }


    @GetMapping("/bindOpenId")
    @ApiOperation("用户绑定公众号openId")
    public Result bindOpenId(Long userId, String openId) {
        UserEntity userEntity = new UserEntity();
        userEntity.setUserId(userId);
        userEntity.setOpenId(openId);
        userService.updateById(userEntity);
        return Result.success();
    }


}
