package com.jojubanking.boot.module.system.service.authgz;

import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpStoreService;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jojubanking.boot.framework.common.enums.CommonStatusEnum;
import com.jojubanking.boot.framework.common.enums.UserTypeEnum;
import com.jojubanking.boot.framework.common.util.monitor.TracerUtils;
import com.jojubanking.boot.framework.common.util.servlet.ServletUtils;
import com.jojubanking.boot.framework.common.util.validation.ValidationUtils;
import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO;
import com.jojubanking.boot.module.system.api.oauth2.OAuth2TokenApi;
import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO;
import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO;
import com.jojubanking.boot.module.system.api.sms.SmsCodeApi;
import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO;
import com.jojubanking.boot.module.system.controller.admin.auth.vo.*;
import com.jojubanking.boot.module.system.controller.admin.auth.vo.*;
import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthLoginRespVO;
import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthSocialLoginReqVO;
import com.jojubanking.boot.module.system.convert.auth.AuthConvert;
import com.jojubanking.boot.module.system.convert.auth.AuthGzConvert;
import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO;
import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO;
import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum;
import com.jojubanking.boot.module.system.enums.logger.LoginResultEnum;
import com.jojubanking.boot.module.system.enums.oauth2.OAuth2ClientConstants;
import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum;
import com.jojubanking.boot.module.system.service.common.CaptchaService;
import com.jojubanking.boot.module.system.service.logger.LoginLogService;
import com.jojubanking.boot.module.system.service.member.MemberService;
import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService;
import com.jojubanking.boot.module.system.service.social.SocialUserService;
import com.jojubanking.boot.module.system.service.user.AdminUserService;
import com.google.common.annotations.VisibleForTesting;
import com.jojubanking.boot.module.system.service.userinfo.UserInfoService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo;
import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo;
import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.validation.Validator;
import java.util.List;
import java.util.Objects;

import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.jojubanking.boot.framework.common.util.servlet.ServletUtils.getClientIP;
import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*;

/**
 * @ClassName: GzAuthServiceImpl
 * @Description:
 * @Author T.W
 * @Date 2023/3/14
 * @Version 1.0
 */
@Service
@Slf4j
public class GzAuthServiceImpl implements GzAuthService{

    @Resource
    private OAuth2TokenApi oauth2TokenApi;
    @Resource
    private UserInfoService userService;

    //joju微信APPID
    //public static final String WX_APP_ID="wx7a0981df44f66897";

    public static final String WX_APP_ID="wx429a10e7e3bcdfad";

    //joju微信AppSecret
    //public static final String WX_SECRET="4c329fa399103dd27edd84617c620e8e";
    public static final String WX_SECRET="8ec92f632bcf449b2cfb4673ecce8789";

    @Override
    public AppAuthLoginRespVO socialLogin(AppAuthSocialLoginReqVO reqVO) {

        //通过微信api 获取用户信息

//        WxMpStoreService wxMpStoreService;
//
//        WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
//        wxMpConfigStorage.setAppId(WX_APP_ID);//你的公众号id
//        wxMpConfigStorage.setSecret(WX_SECRET);//你的公众号密匙
//        WxMpServiceImpl wxMpService = new WxMpServiceImpl();
//        wxMpService.setWxMpConfigStorage(wxMpConfigStorage);
//
//        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null;
//        try {
//            wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(reqVO.getCode());
//        } catch (WxErrorException e) {
//            e.printStackTrace();
//        }
//
//        // 3.进一步获取用户信息
//        String openId = wxMpOAuth2AccessToken.getOpenId();
//        log.info("openid="+openId);
//
//        // 拿到用户的基本信息
//        WxMpUser wxMpUser=null;
//        try {
//            wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
//            log.info(wxMpUser.toString());
//
//        } catch (WxErrorException e) {
//            e.printStackTrace();
//        }

        String mobile = "13857185597";
        String userIp = "127.0.0.1";
        String openid = "123456789";

        // 校验账号是否存在
        UserInfoDO user = userService.getUserByMobile(mobile);
        if (user == null) {
            //createLoginLog(null, mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
//            throw exception(AUTH_LOGIN_BAD_CREDENTIALS);
            //注册用户
            // 获得获得注册用户
            user = userService.createUserIfAbsent(mobile, userIp);
        }

        // 创建 Token 令牌，记录登录日志
        return createTokenAfterLoginSuccess(user, LoginLogTypeEnum.LOGIN_SOCIAL);
    }

    @Override
    public AppAuthLoginRespVO refreshToken(String refreshToken) {
        OAuth2AccessTokenRespDTO accessTokenDO = oauth2TokenApi.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT);
        return AuthGzConvert.INSTANCE.convert(accessTokenDO);
    }

    private AppAuthLoginRespVO createTokenAfterLoginSuccess(UserInfoDO user, LoginLogTypeEnum logType) {
        // 插入登陆日志
//        createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS);

        // 创建访问令牌
        Integer type = 2;
        OAuth2AccessTokenCreateReqDTO req = new OAuth2AccessTokenCreateReqDTO();
        req.setUserId(Long.valueOf(1));
        req.setUserType(type);
        req.setClientId(OAuth2ClientConstants.CLIENT_ID_DEFAULT);
        OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(req);

//        OAuth2AccessTokenRespDTO accessTokenDO = oauth2TokenApi.createAccessToken(Long.valueOf(1), Integer.valueOf(2), OAuth2ClientConstants.CLIENT_ID_DEFAULT, null);
        // 构建返回结果
        return AuthGzConvert.INSTANCE.convert(accessTokenRespDTO);
    }

//    @Override
//    public void logout(String token, Integer logType) {
//        // 删除访问令牌
//        OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(token);
//        if (accessTokenDO == null) {
//            return;
//        }
//        // 删除成功，则记录登出日志
//        createLogoutLog(accessTokenDO.getUserId(), accessTokenDO.getUserType(), logType);
//    }
//
//    private void createLogoutLog(Long userId, Integer userType, Integer logType) {
//        LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
//        reqDTO.setLogType(logType);
//        reqDTO.setTraceId(TracerUtils.getTraceId());
//        reqDTO.setUserId(userId);
//        reqDTO.setUserType(userType);
//        if (ObjectUtil.equal(getUserType().getValue(), userType)) {
//            reqDTO.setUsername(getUsername(userId));
//        } else {
//            reqDTO.setUsername(memberService.getMemberUserMobile(userId));
//        }
//        reqDTO.setUserAgent(ServletUtils.getUserAgent());
//        reqDTO.setUserIp(ServletUtils.getClientIP());
//        reqDTO.setResult(LoginResultEnum.SUCCESS.getResult());
//        loginLogService.createLoginLog(reqDTO);
//    }
}
