package com.ics.controller.mobile;


import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.ics.admin.domain.Customer;
import com.ics.admin.domain.Park;
import com.ics.admin.domain.meeting.*;
import com.ics.admin.service.ICustomerService;
import com.ics.admin.service.IIcsCustomerStaffService;
import com.ics.admin.service.IParkService;
import com.ics.admin.service.meeting.*;
import com.ics.common.constant.Constants;
import com.ics.common.core.controller.BaseController;
import com.ics.common.core.domain.IcsCustomerStaff;
import com.ics.common.core.domain.R;
import com.ics.common.utils.MessageUtils;
import com.ics.common.utils.StringUtils;
import com.ics.common.utils.bean.BeanUtils;
import com.ics.system.domain.User;
import com.ics.system.log.publish.PublishFactory;
import com.ics.system.service.IAccessTokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.wf.jwtp.annotation.RequiresPermissions;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;


/**
 * 微信用户直接登录
 *
 * @author jack
 */
@Slf4j
@RestController
public class WxLoginAPIController extends BaseController {


    @Autowired
    private IIcsCustomerStaffService icsCustomerStaffService;

    @Autowired
    private IAccessTokenService tokenService;

    @Autowired
    private WxMaService wxMaService;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private IParkService parkService;

    @Autowired
    private IRoomEquipmentService roomEquipmentService;

    @Autowired
    private IDetailEquipmentService detailEquipmentService;

    @Autowired
    private IUserEquipmentService userEquipmentService;

    @Autowired
    private IEquipmentService equipmentService;

    @Autowired
    private ICustomerService customerService;

    @Autowired
    private IStaffCustomerService staffCustomerService;

    @Autowired
    private IStaffOpenService staffOpenService;


    String smallWxAccessTokenKey = "smallWxAccessToken";
    String smallWxUserPassword = "123456";


    //  微信小程序登录后，新建一个token ，然后在新增LoginUser 这个注解，然后在拦截器中获取token，然后获取用户信息

    @PostMapping("/weixin/login")
    public R login(@RequestBody Map<String, String> paramMap) {
        // 参数
        String jsCode = paramMap.get("jsCode");
        String appId = paramMap.get("appId");
        String appSecret = paramMap.get("appSecret");
        String parkId = paramMap.get("parkId");

        // 必填
        if (org.apache.commons.lang3.StringUtils.isBlank(jsCode)) {
            throw new RuntimeException("请传递jsCode");
        }
        // 小程序登录
        JSONObject sessionObject = SmallWxOkHttp.code2Session(jsCode, appId, appSecret);
        String openid = sessionObject.getString("openid");
        //
        R ajax = R.ok();
        // 校验用户是否存在

        IcsCustomerStaff sysUser = icsCustomerStaffService.selectUserByOpenid(openid);
        if (null != sysUser) {
            if (null != sysUser.getParkId()) {
                Park park = parkService.selectParkById(sysUser.getParkId());
                sysUser.setParkName(park.getName());
            }
            log.info("parkId:{}",parkId);
            List<StaffCustomer> staffCustomers = staffCustomerService.selectStaffCustomerByStaffIdAndParkId(sysUser.getId(), String.valueOf(sysUser.getParkId()));
            if (CollUtil.isEmpty(staffCustomers)) {
                return R.error("外部人员注册，请联系管理员");
            }

            User user = new User();
            PublishFactory.recordLoginInfo(sysUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
            BeanUtils.copyBeanProp(user, sysUser);
            Map<String, Object> token = tokenService.createToken(user);
            ajax.put(Constants.TOKEN, token);
            ajax.put("user", sysUser);
            ajax.put("openid", openid);
            return ajax;
        }else {
            ajax.put("openid", openid);
            return ajax;
        }

    }


    @PostMapping("/changyang_user_login/login")
    public R userLogin(@RequestBody Map<String, String> paramMap) {
        // 参数
        String code = paramMap.get("code");
        String openid = paramMap.get("openid");
        String appId = paramMap.get("appId");
        String appSecret = paramMap.get("appSecret");
        String parkId = paramMap.get("parkId");
        String tenantId = paramMap.get("tenantId");
        // 必填
        if (StringUtils.isBlank(code)) {
            throw new RuntimeException("请传递code");
        }
        if (StringUtils.isBlank(openid)) {
            if (parkId.equals("26")) {
                throw new RuntimeException("外部人员注册，请联系管理员");
            }
            throw new RuntimeException("请传递openid");
        }
        // 获取微信小程序 AccessToken
        String smallWxAccessToken = getSmallWxAccessToken(appId, appSecret);
        // 获取手机号
        JSONObject jsonObj = SmallWxOkHttp.getPhoneNumber(code, openid, smallWxAccessToken);
        JSONObject phoneInfo = jsonObj.getJSONObject("phone_info");
        // 手机号
        String phoneNumber = phoneInfo.getString("phoneNumber");
        IcsCustomerStaff icsCustomerStaff = new IcsCustomerStaff();
        icsCustomerStaff.setMobile(phoneNumber);
        //  需要根据手机号 查询对应的用户。

        IcsCustomerStaff customerStaff1 = icsCustomerStaffService.selectUserByMobile(phoneNumber);
        //如果手机号等于null 就新增用户
        if (null == customerStaff1) {
            Assert.isTrue(false, "外部人员注册，请联系管理员");
            return R.error("外部人员注册，请联系管理员");
        } else {

            List<StaffCustomer> staffCustomers = staffCustomerService.selectStaffCustomerByStaffIdAndParkId(customerStaff1.getId(), parkId);
            if (CollUtil.isEmpty(staffCustomers)) {
                Assert.isTrue(false, "外部人员注册，请联系管理员");
                return R.error("外部人员注册，请联系管理员");
            }


            StaffOpen staffOpen = staffOpenService.selectStaffOpenByOpenId(openid);
            if (null == staffOpen) {
                StaffOpen staffOpen1 = new StaffOpen();
                staffOpen1.setOpenid(openid);
                staffOpen1.setStaffId(customerStaff1.getId());
                staffOpen1.setParkId(Long.valueOf(parkId));
                staffOpen1.setTenantId(Long.valueOf(tenantId));
                staffOpenService.insertStaffOpen(staffOpen1);
            }
            customerStaff1.setOpenid(openid);
            icsCustomerStaffService.updateIcsCustomerStaff(customerStaff1);
            User user = new User();
            PublishFactory.recordLoginInfo(customerStaff1.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
            BeanUtils.copyBeanProp(user, customerStaff1);
            Map<String, Object> token = tokenService.createToken(user);
            R ajax = R.ok();
            ajax.put(Constants.TOKEN, token);
            ajax.put("user", user);
            ajax.put("openid", openid);
            return ajax;
        }
    }


    /**
     * 郑州授权登录
     *
     * @param paramMap
     * @return
     */
    @PostMapping("/social_user_login/login")
    public R social(@RequestBody Map<String, String> paramMap) {
        try {
            // 参数
            String code = paramMap.get("code");
            String openid = paramMap.get("openid");
            String appId = paramMap.get("appId");
            String appSecret = paramMap.get("appSecret");
            String parkId = paramMap.get("parkId");
            String tenantId = paramMap.get("tenantId");
            // 必填
            if (StringUtils.isBlank(code)) {
                throw new RuntimeException("请传递code");
            }
            if (StringUtils.isBlank(openid)) {
                throw new RuntimeException("请传递openid");
            }
            // 获取微信小程序 AccessToken
            String smallWxAccessToken = getSmallWxAccessToken(appId, appSecret);
            // 获取手机号
            JSONObject jsonObj = SmallWxOkHttp.getPhoneNumber(code, openid, smallWxAccessToken);
            JSONObject phoneInfo = jsonObj.getJSONObject("phone_info");
            // 手机号
            String phoneNumber = phoneInfo.getString("phoneNumber");
            IcsCustomerStaff icsCustomerStaff = new IcsCustomerStaff();
            icsCustomerStaff.setMobile(phoneNumber);
            IcsCustomerStaff customerStaff = icsCustomerStaffService.selectUserByMobile(phoneNumber);
            if (customerStaff != null) {
                if (customerStaff.getParkId() != null) {
                    Park park = parkService.selectParkById(customerStaff.getParkId());
                    customerStaff.setParkName(park.getName());
                }
                List<StaffCustomer> staffCustomers = staffCustomerService.selectStaffCustomerByStaffIdAndParkId(customerStaff.getId(), String.valueOf(customerStaff.getParkId()));
                if (CollUtil.isEmpty(staffCustomers)) {
                    return R.error("外部人员注册，请联系管理员");
                }

                User user = new User();
                PublishFactory.recordLoginInfo(customerStaff.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
                BeanUtils.copyBeanProp(user, customerStaff);
                Map<String, Object> token = tokenService.createToken(user);
                R ajax = R.ok();
                ajax.put(Constants.TOKEN, token);
                ajax.put("user", user);
                ajax.put("openid", openid);
                return ajax;
            } else {
                // 新增用户信息

                icsCustomerStaff.setUsername(phoneNumber);
                icsCustomerStaff.setGender("0");
                icsCustomerStaff.setStatus("0");
                icsCustomerStaff.setParkId(27L);
                icsCustomerStaff.setOpenid(openid);
                int i = icsCustomerStaffService.insertIcsCustomerStaff(icsCustomerStaff);

                List<StaffCustomer> staffCustomers = staffCustomerService.selectStaffCustomerByStaffIdAndParkId(icsCustomerStaff.getId(), String.valueOf(icsCustomerStaff.getParkId()));
                if (CollUtil.isEmpty(staffCustomers)) {
                    return R.error("外部人员注册，请联系管理员");
                }

                Map<String, Object> token = tokenService.createStaffToken(icsCustomerStaff);
                R ajax = R.ok();
                ajax.put(Constants.TOKEN, token);
                ajax.put("user", icsCustomerStaff);
                ajax.put("openid", openid);
                return ajax;
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return R.error("获取微信用户数据失败");
        }

    }

    /**
     * 获取微信小程序AccessToken
     */
    public String getSmallWxAccessToken(String appId, String appSecret) {
        // 从缓存获取微信小程序 AccessToken
        String smallWxAccessToken = redisTemplate.opsForValue().get(smallWxAccessTokenKey);
        if (StringUtils.isBlank(smallWxAccessToken)) {
            smallWxAccessToken = SmallWxOkHttp.getAccessToken(appId, appSecret);
            redisTemplate.opsForValue().set(appId + smallWxAccessTokenKey, appId + smallWxAccessToken, 7200, TimeUnit.SECONDS);
        }
        return smallWxAccessToken;
    }

    @RequiresPermissions("member:center:view")
    @GetMapping("/wx/getUserInfo")
    public R login(Long userId, Long parkId) {
        try {
            //检查是否是否存在

            IcsCustomerStaff customerStaff = icsCustomerStaffService.selectIcsCustomerStaffById(userId);
            if (null != customerStaff) {
                StaffCustomer staffCustomer = new StaffCustomer();
                staffCustomer.setStaffId(userId);
                List<StaffCustomer> staffCustomers = staffCustomerService.selectStaffCustomerByStaffId(userId);
                if (CollUtil.isNotEmpty(staffCustomers)) {
                    for (StaffCustomer staffCustomer1 : staffCustomers) {
                        Customer customer = customerService.selectCustomerByIdAndParkId(staffCustomer1.getIcsCustomerId(), parkId);
                        if (null != customer) {
                            customerStaff.setCustomerName(customer.getName());
                            customerStaff.setIcsCustomerId(customer.getId());
                            break;
                        }
                    }
                }
                return R.ok().put("data", customerStaff);
            } else {
                return R.error("获取微信用户数据失败");
            }
        } catch (Exception e) {
            return R.error("获取微信用户数据失败");
        }
    }


}
