package com.miaxis.system.controller.system;

import com.miaxis.common.core.domain.Response;
import com.miaxis.common.core.domain.entity.SysMenu;
import com.miaxis.common.core.domain.entity.SysUser;
import com.miaxis.common.core.domain.model.LoginBody;
import com.miaxis.common.core.domain.model.LoginBodyNoCode;
import com.miaxis.common.core.domain.model.LoginUser;
import com.miaxis.common.enums.StudentLoginTypeEnum;
import com.miaxis.common.utils.SecurityUtils;
import com.miaxis.common.utils.ServletUtils;
import com.miaxis.framework.web.service.SysLoginService;
import com.miaxis.framework.web.service.SysPermissionService;
import com.miaxis.framework.web.service.TokenService;
import com.miaxis.system.dto.common.RouterDTO;
import com.miaxis.system.dto.system.TokenDTO;
import com.miaxis.system.dto.system.UserInfoDTO;
import com.miaxis.system.service.ISysMenuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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 java.util.List;
import java.util.Set;

/**
 * 登录验证
 *
 * @author miaxis
 */
@RestController
@Api(tags={"【系统-登录验证】"})
public class SysLoginController
{
    @Autowired
    private SysLoginService loginService;

    @Autowired
    private ISysMenuService menuService;

    @Autowired
    private SysPermissionService permissionService;

    @Autowired
    private TokenService tokenService;





    /**
     * 登录方法 （含验证码）
     *
     * @param loginBody 登录信息
     * @return 结果
     */
    @PostMapping("/login")
    @ApiOperation("系统-登录方法")
    public Response<TokenDTO> login(@RequestBody LoginBody loginBody)
    {   TokenDTO tokenDTO = new TokenDTO();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                loginBody.getUuid());
        tokenDTO.setToken(token);
        return Response.success(tokenDTO);
    }
    /**
     * 登录方法 （不含验证码）
     *
     * @param loginBodyNoCode 登录信息
     * @return 结果
     */
    @PostMapping("/login/noCode")
    @ApiOperation("登录方法（不含验证码）")
    public Response<TokenDTO> loginNoCode(@RequestBody LoginBodyNoCode loginBodyNoCode)
    {   TokenDTO tokenDTO = new TokenDTO();
        // 生成令牌
        String token = loginService.login(loginBodyNoCode.getUsername(), loginBodyNoCode.getPassword());
        tokenDTO.setToken(token);
        return Response.success(tokenDTO);
    }
//
//    /**
//     * 用户 jscode登录
//     *
//     */
//    @PostMapping("/login/jscode")
//    @ApiOperation("用户jscode登录")
//    public Response<TokenDTO> getInfo(String jscode){
//        String result = wxService.getWxInfo(appid, secret, jscode,"authorization_code");
//        JSONObject jsonString = JSONObject.parseObject(result);
//        WxResult wxResult = JSONObject.toJavaObject(jsonString, WxResult.class);
//        TokenDTO tokenDTO = new TokenDTO();
//        // 生成令牌
//        if (wxResult.getOpenid() != null){
//            // 生成令牌
//            String token = loginService.login(wxResult.getOpenid(),null, StudentLoginTypeEnum.OPENID_LOGIN.getCode());
//            tokenDTO.setToken(token);
//            return Response.success(tokenDTO) ;
//        }
//        else{
//            return Response.error(500,wxResult.getErrmsg());
//        }
//
//    }


    /**
     * 用户 jscode登录
     *
     */
    @PostMapping("/login/jscode-test")
    @ApiOperation("用户jscode登录(测试，固定openid)")
    public Response<TokenDTO> getInfoTest(String jscode){
        TokenDTO tokenDTO = new TokenDTO();
            // 生成令牌
        String token = loginService.login("oO7PJ5CPQJo62kZWA3uiUX2KG2s4",null, StudentLoginTypeEnum.OPENID_LOGIN.getCode());
        tokenDTO.setToken(token);
        return Response.success(tokenDTO) ;


    }


    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    @GetMapping("getInfo")
    @ApiOperation("获取用户信息")
    public Response<UserInfoDTO> getInfo()
    {
        SecurityUtils.getLoginUser();
        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
        UserInfoDTO userInfoDTO = new UserInfoDTO();
        SysUser user = loginUser.getUser();
        if (user != null){
            userInfoDTO.setUser(user);
            // 角色集合
            Set<String> roles = permissionService.getRolePermission(user);
            // 权限集合
            Set<String> permissions = permissionService.getMenuPermission(user);
            userInfoDTO.setRoles(roles);
            userInfoDTO.setPermissions(permissions);
        }
        userInfoDTO.setStudent(loginUser.getStudent());
        return Response.success(userInfoDTO);
    }

    /**
     * 获取路由信息
     *
     * @return 路由信息
     */
    @GetMapping("getRouters")
    @ApiOperation("获取路由信息")
    public Response<List<RouterDTO>> getRouters()
    {
        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
        // 用户信息
        SysUser user = loginUser.getUser();
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());
        return Response.success(menuService.buildMenus(menus));
    }
}
