package com.railway.web.controller.system;

import com.railway.common.annotation.Log;
import com.railway.common.core.controller.BaseController;
import com.railway.common.core.domain.AjaxResult;
import com.railway.common.core.domain.entity.SysRole;
import com.railway.common.core.domain.entity.SysUser;
import com.railway.common.core.domain.model.LoginUser;
import com.railway.common.enums.BusinessType;
import com.railway.common.utils.SecurityUtils;
import com.railway.common.utils.StringUtils;
import com.railway.framework.web.service.TokenService;
import com.railway.system.service.ISysFileService;
import com.railway.system.service.ISysRoleService;
import com.railway.system.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 个人信息 业务处理
 *
 * @author railway
 */
@Api(tags = "系统管理 - 个人信息")
@RestController
@RequestMapping("/system/user/profile")
public class SysProfileController extends BaseController {

  private final ISysUserService userService;
  private final ISysRoleService roleService;
  private final TokenService tokenService;
  private final ISysFileService sysFileService;

  public SysProfileController(ISysUserService userService,
      ISysRoleService roleService, TokenService tokenService,
      ISysFileService sysFileService) {
    this.userService = userService;
    this.roleService = roleService;
    this.tokenService = tokenService;
    this.sysFileService = sysFileService;
  }

  /**
   * 个人信息
   */
  @ApiOperation(value = "获取个人信息", response = AjaxResult.class)
  @GetMapping
  public AjaxResult profile() {
    LoginUser loginUser = getLoginUser();
    SysUser user = loginUser.getUser();
    List<Long> roleIds = roleService.selectRoleListByUserId(user.getUserId());
    user.setRoleIds(roleIds.toArray(new Long[0]));
    List<SysRole> roles = roleService.selectRolesByUserId(user.getUserId());
    user.setRoles(roles);
    AjaxResult ajax = AjaxResult.success(user);
    ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
    ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
    return ajax;
  }

  /**
   * 修改用户
   */
  @ApiOperation(value = "修改用户", response = AjaxResult.class)
  @Log(title = "个人信息", businessType = BusinessType.UPDATE)
  @PutMapping
  public AjaxResult updateProfile(@RequestBody SysUser user) {
    AjaxResult result = userService.checkUserUnique(user);
    if (StringUtils.isNotNull(result)) {
      return result;
    }
    LoginUser loginUser = getLoginUser();
    SysUser sysUser = loginUser.getUser();
    user.setUserId(sysUser.getUserId());
    user.setPassword(null);
    if (userService.updateUserProfile(user) > 0) {
      // 更新缓存用户信息
      sysUser.setNickName(user.getNickName());
      sysUser.setPhone(user.getPhone());
      sysUser.setEmail(user.getEmail());
      sysUser.setSex(user.getSex());
      tokenService.setLoginUser(loginUser);
      return AjaxResult.success();
    }
    return AjaxResult.error("修改个人信息异常，请联系管理员");
  }

  /**
   * 重置密码
   */
  @ApiOperation(value = "修改密码", response = AjaxResult.class)
  @Log(title = "个人信息", businessType = BusinessType.UPDATE)
  @PutMapping("/updatePwd")
  public AjaxResult updatePwd(String oldPassword, String newPassword) {
    LoginUser loginUser = getLoginUser();
    String userName = loginUser.getUsername();
    String password = loginUser.getPassword();
    if (!SecurityUtils.matchesPassword(oldPassword, password)) {
      return AjaxResult.error("修改密码失败，旧密码错误");
    }
    if (SecurityUtils.matchesPassword(newPassword, password)) {
      return AjaxResult.error("新密码不能与旧密码相同");
    }
    if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) {
      // 更新缓存用户密码
      loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));
      tokenService.setLoginUser(loginUser);
      return AjaxResult.success();
    }
    return AjaxResult.error("修改密码异常，请联系管理员");
  }

  /**
   * 头像上传
   */
  @ApiOperation(value = "头像上传", response = AjaxResult.class)
  @Log(title = "用户头像", businessType = BusinessType.UPDATE)
  @PostMapping("/avatar")
  public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception {
    if (!file.isEmpty()) {
      LoginUser loginUser = getLoginUser();
      String avatar = sysFileService.uploadFile(file);
      if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) {
        AjaxResult ajax = AjaxResult.success();
        ajax.put("imgUrl", avatar);
        // 更新缓存用户头像
        loginUser.getUser().setAvatar(avatar);
        tokenService.setLoginUser(loginUser);
        return ajax;
      }
    }
    return AjaxResult.error("上传图片异常，请联系管理员");
  }
}
