package com.xmomen.module.core.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import com.xmomen.module.account.model.CreateUser;
import com.xmomen.module.account.service.UserService;
import com.xmomen.module.user.entity.SysUsers;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.xmomen.module.core.web.controller.dto.RegisterDto;


@Controller
public class CoreController {

    // 定义一个日志对象
    private static Logger logger = LoggerFactory.getLogger(CoreController.class);

    // 定义一个请求映射，当访问根路径时，重定向到index.html页面
    @RequestMapping(value = "/")
    public String index(){
        return "redirect:/index.html";
    }

    // 定义一个请求映射，当访问/login路径时，判断用户是否已经认证，如果已经认证，则重定向到根路径，否则返回登录页面
    @RequestMapping(value = "/login")
    public String login(HttpServletRequest request, Model model){
        if(SecurityUtils.getSubject().isAuthenticated()){
            return "redirect:/";
        }
        // 获取登录失败的异常类名
        String exceptionClassName = (String)request.getAttribute("shiroLoginFailure");
        String error = null;
        // 根据异常类名判断错误信息
        if(UnknownAccountException.class.getName().equals(exceptionClassName)) {
            error = "用户名/密码错误";
        } else if(IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
            error = "用户名/密码错误";
        } else if(exceptionClassName != null) {
            error = "其他错误：" + exceptionClassName;
        }
        // 将错误信息添加到模型中
        model.addAttribute("error", error);
        return "login";
    }

    // 自动注入UserService对象
    @Autowired
    UserService userService;

    // 定义一个请求映射，当访问/register路径时，判断请求方法是否为POST，如果不是，则返回注册页面，如果是，则进行注册操作
    @RequestMapping(value = "/register")
    public String register(@ModelAttribute @Valid RegisterDto registerDto,
                           BindingResult bindingResult,
                           HttpServletRequest request,
                           Model model) {
        // 判断请求方法是否为POST
        if (!WebUtils.toHttp(request).getMethod().equalsIgnoreCase("POST")){
            return "register";
        }
        // 判断表单验证结果是否有错误
        if(!bindingResult.hasErrors()){
            // 创建一个CreateUser对象，并将表单数据赋值给该对象
            CreateUser user = new CreateUser();
            user.setUsername(registerDto.getUsername());
            user.setPassword(registerDto.getPassword());
            // 调用UserService的createUser方法进行注册操作
            SysUsers sysUsers = userService.createUser(user);
            // 判断注册结果是否成功
            if(sysUsers.getId() != null && sysUsers.getId() > 0 ){
                return "login";
            }else{
                // 如果注册失败，则记录错误日志，并将错误信息添加到模型中
                logger.error("注册成功后返回的主键为空（或主键等于或小于0）");
                model.addAttribute("error", "注册用户失败");
                return "register";
            }
        }else{
            // 如果表单验证有错误，则将错误信息添加到模型中
            model.addAttribute("error", bindingResult.getFieldError().getDefaultMessage());
            return "register";
        }
    }

}
