package common.controller;

import common.model.Menu;
import common.model.User;
import common.repository.AuthRepository;
import common.repository.RoleRepository;
import common.repository.RoleTypeRepository;
import common.repository.UserRepository;
import common.service.MenuService;
import common.service.UserService;
import dic.AuthMenuEnmm;
import dic.OperateObjectTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import security.annotation.AuthKey;
import security.annotation.CurrentAccount;
import util.CipherUtil;
import util.ResultModel;
import util.UserLogThread;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * Created by mxq on 2017/12/21.
 */
@Controller
@RequestMapping("system/user")
public class UserController {
    @Autowired
    private UserService userService;

    @Autowired
    UserRepository userRepository;

    @Autowired
    RoleRepository roleRepository;

    @Autowired
    RoleTypeRepository roleTypeRepository;

    @Autowired
    AuthRepository authRepository;

    @RequestMapping(value = "/valid/email", method = RequestMethod.GET)
    @ResponseBody
    public ResultModel validEmail(@RequestParam String email) {
        return ResultModel.OK(userService.validEmail(email));
    }

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_A)
    public ResultModel create(@CurrentAccount User loginAccount, @RequestBody User resource, HttpServletRequest request) {
        if(userService.validEmail(resource.getEmail())){
            userService.create(loginAccount, resource);
            UserLogThread userlog = new UserLogThread(loginAccount.getEmail(), loginAccount.getName(), OperateObjectTypeEnum.INNERUSER.getKey(), resource.getEmail(), "创建系统账号", request,loginAccount.getRole(),"manager");
            userlog.start();
            return ResultModel.OK(true);
        }else{
            return ResultModel.OK(false);
        }
    }

    @RequestMapping(value = "/update", method = RequestMethod.PUT)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_M)
    public ResultModel update(@CurrentAccount User loginAccount, @RequestBody User resource, HttpServletRequest request) {
        UserLogThread userlog = new UserLogThread(loginAccount.getEmail(), loginAccount.getName(), OperateObjectTypeEnum.INNERUSER.getKey(), resource.getEmail(), "修改系统账号", request,loginAccount.getRole(),"manager");
        userlog.start();
        return ResultModel.OK(userService.update(loginAccount, resource));
    }

    @RequestMapping(value = "/find", method = RequestMethod.GET)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_V)
    public ResultModel find(@CurrentAccount User loginAccount) {
        return ResultModel.OK(userService.find(loginAccount));
    }

    @RequestMapping(value = "/find/role", method = RequestMethod.GET)
    @ResponseBody
    public ResultModel findRole(@CurrentAccount User loginAccount) {

        return ResultModel.OK(roleRepository.findAll());
    }

    @RequestMapping(value = "/find/roletype", method = RequestMethod.GET)
    @ResponseBody
    public ResultModel findRoleType(@CurrentAccount User loginAccount) {
        return ResultModel.OK(roleTypeRepository.findAll());
    }

    @RequestMapping(value = "/find/auth", method = RequestMethod.GET)
    @ResponseBody
    public ResultModel findAuth(@CurrentAccount User loginAccount) {
        return ResultModel.OK(authRepository.findByUser(loginAccount.getId()));
    }

    @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_D)
    public ResultModel delete(@CurrentAccount User loginAccount, @PathVariable Long id, HttpServletRequest request) {
        User user = userService.delete(loginAccount, id);
        UserLogThread userlog = new UserLogThread(loginAccount.getEmail(), loginAccount.getName(), OperateObjectTypeEnum.INNERUSER.getKey(), user.getEmail(), "删除系统账号", request,loginAccount.getRole(),"manager");
        userlog.start();
        return ResultModel.OK(user);
    }

    @RequestMapping(value = "/enable/{id}", method = RequestMethod.PUT)
    @ResponseBody
    public ResultModel enable(@CurrentAccount User loginAccount, @PathVariable Long id, HttpServletRequest request) {
        User user = userService.enable(loginAccount, id);
        UserLogThread userlog = new UserLogThread(loginAccount.getEmail(), loginAccount.getName(), OperateObjectTypeEnum.INNERUSER.getKey(), user.getEmail(), "启用系统账号", request,loginAccount.getRole(),"manager");
        userlog.start();
        return ResultModel.OK(user);
    }

    @RequestMapping(value = "/forbiden/{id}", method = RequestMethod.PUT)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_STOP)
    public ResultModel forbiden(@CurrentAccount User loginAccount, @PathVariable Long id, HttpServletRequest request) {
        User user = userService.forbiden(loginAccount, id);
        UserLogThread userlog = new UserLogThread(loginAccount.getEmail(), loginAccount.getName(), OperateObjectTypeEnum.INNERUSER.getKey(), user.getEmail(), "停用系统账号", request,loginAccount.getRole(),"manager");
        userlog.start();
        return ResultModel.OK(user);
    }

    @RequestMapping(value = "/update/name", method = RequestMethod.PUT)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_M)
    public ResultModel updateName(@CurrentAccount User loginAccount, @RequestParam String name, HttpServletRequest request) {
        User login = userRepository.login(name);
        if(null == login){
            User user = userService.updateName(loginAccount, name);
            UserLogThread userlog = new UserLogThread(loginAccount.getEmail(), loginAccount.getName(), OperateObjectTypeEnum.INNERUSER.getKey(), user.getEmail(), "修改系统账号名字", request,loginAccount.getRole(),"manager");
            userlog.start();
            return ResultModel.OK(true);
        }else{
            return ResultModel.OK(false);
        }

    }

    @RequestMapping(value = "/update/password", method = RequestMethod.PUT)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_M)
    public ResultModel updatePwd(@CurrentAccount User loginAccount, @RequestParam String pwd, @RequestParam String oldpwd, HttpServletRequest request) {
        User login = userRepository.login(loginAccount.getEmail(), CipherUtil.generatePassword(oldpwd));
        if(null != login){
            User user = userService.updatePwd(loginAccount, pwd);
            UserLogThread userlog = new UserLogThread(loginAccount.getEmail(), loginAccount.getName(), OperateObjectTypeEnum.INNERUSER.getKey(), user.getEmail(), "修改系统账号密码", request,loginAccount.getRole(),"manager");
            userlog.start();
            return ResultModel.OK(true);
        }else{
            return ResultModel.OK(false);
        }
    }

    //忘记密码时，修改密码
    @RequestMapping(value = "/update/pwd", method = RequestMethod.PUT)
    @ResponseBody
    @AuthKey(AuthMenuEnmm.USERMNG_M)
    public ResultModel updatePwd(@RequestParam String email, @RequestParam String pwd, HttpServletRequest request) {
        UserLogThread userlog = new UserLogThread(email, email, OperateObjectTypeEnum.INNERUSER.getKey(), email, "修改系统账号密码", request,null,"manager");
        userlog.start();
        return ResultModel.OK(userService.updatePwd(email, pwd));
    }

    //忘记密码时，发送验证码
    @RequestMapping(value = "/code", method = RequestMethod.GET)
    @ResponseBody
    public ResultModel sengCode(@RequestParam String email) {

        return ResultModel.OK(userService.sendCode(email));
    }

    //验证码验证
    @RequestMapping(value = "/update/pwd", method = RequestMethod.GET)
    @ResponseBody
    public ResultModel validCode(@RequestParam String email, @RequestParam String code, @RequestParam String pwd) {
        return ResultModel.OK(userService.validCode(email, code, pwd));
    }


    @RequestMapping(value = "/find/{role}", method = RequestMethod.GET)
    @ResponseBody
    public ResultModel findByRole(@PathVariable Long role) {
        return ResultModel.OK(userService.findbyRole(role));
    }


}
