package com.ruoyi.web.controller.backstage;


import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;

import com.github.pagehelper.PageInfo;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.domain.UserInfo;
import com.ruoyi.system.domain.dto.BackstageUserDto;
import com.ruoyi.system.domain.vo.UserManagerVo;
import com.ruoyi.system.service.*;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import static com.ruoyi.common.utils.PageUtils.startPage;
//import com.ruoyi.common.utils.StringUtils;
//import com.ruoyi.common.utils.poi.ExcelUtil;


@RestController
@RequestMapping("/system/user")
public class SysBackUserController extends BaseController {

    @Autowired
    private ISysUserService userService;

    @Autowired
    private ISysRoleService roleService;

    @Autowired
    private ISysDeptService deptService;

    @Autowired
    private ISysPostService postService;

    @Autowired
    private IUserInfoService userInfoService;

    /*
    * 新版获取后台用户列表
    * */
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/backlist")
    public TableDataInfo backlist(SysUser user)
    {
        startPage();
        List<UserManagerVo> list = userService.getBackstageUserList(user);
        return getDataTable(list);
    }

     /*
    * 新版根据id获取用户账号信息
    * */
    @PreAuthorize("@ss.hasPermi('system:user:query')")
    @GetMapping("/back/{userId}")
    public AjaxResult getBackUserInfo(@PathVariable("userId") Long userId)
    {

        UserManagerVo userManagerVo = userService.getBackstageUserById(userId);
        return AjaxResult.success(userManagerVo);
    }

    /*
    * 新版新增用户
    * */

    @PreAuthorize("@ss.hasPermi('system:user:add')")
    @Transactional
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping("/createBackstageUser")
    public AjaxResult createBackstageUser(@RequestBody BackstageUserDto backstageUserDto){

            String nickName = backstageUserDto.getNickName();
            String phone = backstageUserDto.getPhonenumber();
            String realName = backstageUserDto.getRealName();
            String status = backstageUserDto.getStatus();
            // 用户角色
            String userRole = backstageUserDto.getUserRole();

            // 默认密码
            String password = "dafs81sd#j#@hkf*";

            // 默认密码
//            if(password == null){
//                password = "ihuqweffasfdafd#saafdaafd#64dsk";
//            }

            //先验证手机号是否已经注册
            int i = userService.checkUserPhone(phone);
            if (i > 0) {
                return AjaxResult.error("该手机号已经注册");
            }

//        System.out.println(nickName+","+phone+","+realName+","+status+","+userRole+","+password);

            SysUser sysUser = new SysUser();
            sysUser.setNickName(nickName);
            sysUser.setPhonenumber(phone);
            sysUser.setStatus(status);
            sysUser.setUserType("0000000001");
            sysUser.setUserName(phone);
            sysUser.setAvatar(RuoYiConfig.getDomain()+"/profile/avatar/avatar_default.jpg");
            sysUser.setPassword(SecurityUtils.encryptPassword(password));

            UserInfo userInfo = new UserInfo();





            int back = userService.insertUser(sysUser);

            if (back > 0){
                System.out.println(nickName+","+phone+","+realName+","+status+","+userRole);

                // 查询数据库中的用户账号信息
                SysUser newSysUser = userService.selectUserByUserName(phone);
                Long userId = newSysUser.getUserId();

                //---------------------------- 新建用户个人信息--------------------------------------------
                userInfo.setUserId(userId);
                userInfo.setRealName(realName);
                userInfo.setPhonenumber(phone);
                userInfo.setBackGround(RuoYiConfig.getDomain()+"/profile/background/background_default.jpg");
                // 获取当前时间的毫秒值
                long currentTimeMillis = System.currentTimeMillis();
                // 利用毫秒值构造Date对象
                Date currentDate = new Date(currentTimeMillis);
                userInfo.setUpdateTime(currentDate);

                //设置上一次计算时间大约为10天前
                Date calculationTime = new Date(currentTimeMillis-1000000000);
                userInfo.setCalculationTime(calculationTime);

                int infoFlag = userInfoService.insertUserInfo(userInfo);
                if (infoFlag == 0) {
                    return AjaxResult.error("个人信息注册失败,请联系系统管理人员");
                }
                //-------------------------------新建用户个人信息结束----------------------------------------

                //---------------------------------给新用户分配角色------------------------------------------
                SysRole role = new SysRole();
                role.setRoleName(userRole);

                List<SysRole> roles = roleService.selectRoleList(role);
                if (roles.size() == 0) {
                    return AjaxResult.error("该角色不存在,请联系管理员");
                }
                // 这里默认一个角色名对应一个角色
                SysRole sysRole = roles.get(0);

                // 角色id
                Long roleId = sysRole.getRoleId();


                //写入用户角色表
                int roleFlag = roleService.insertSysUserRole(userId,roleId);

                if (roleFlag == 0) {
                    return AjaxResult.error("用户角色分配失败,请联系管理员");
                }

                //---------------------------------给新用户分配角色结束--------------------------------------





                return AjaxResult.success("新建用户成功");
            }

            return AjaxResult.error("新建用户失败, 请联系管理员");
    }

    /*
    * 新版修改用户
    * */
    @PreAuthorize("@ss.hasPermi('system:user:edit')")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @Transactional
    @PutMapping("/updateBackstageUser")
    public AjaxResult updateBackstageUser(@RequestBody BackstageUserDto backstageUserDto){

        Long userId = backstageUserDto.getUserId();
        String userRole = backstageUserDto.getUserRole();
        String userStatus = backstageUserDto.getStatus();

        //---------------------------------------修改用户角色-------------------------------------------------
        // 根据角色名查角色id
        Long roleId = roleService.selectRoleIdByRoleName(userRole);

        System.out.println("角色id: "+ roleId);

        // 先查一下该用户是否已经有角色
        SysUserRole sysUserRole = roleService.getSysUserRole(userId);

        if (sysUserRole == null){

            System.out.println("该用户没有角色, 在修改时添加角色");
            // 新增用户角色
            int roleFlag = roleService.insertSysUserRole(userId, roleId);
            if (roleFlag == 0){
                return AjaxResult.error("修改用户角色失败,请联系管理员1");
            }
        }
        else{
            System.out.println("该用户已经有角色, 在修改时修改角色");
            roleService.updateUserRole(userId, roleId);
        }



        // 貌似角色不修改默认返回的就是0??
//        if(roleFlag == 0){
//            return AjaxResult.error("修改用户角色失败,请联系管理员0");
//        }
        //--------------------------------------修改用户角色结束----------------------------------------------

        //修改用户状态
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userId);
        sysUser.setStatus(userStatus);


        // 若是不修改返回也是0啊
//        if (statusFlag == 0){
//            return AjaxResult.error("修改用户状态失败,请联系管理员1");
//        }

        return AjaxResult.success("修改用户账号信息成功");
    }

    /*
    * 新版删除用户
    * */
    @PreAuthorize("@ss.hasPermi('system:user:remove')")
    @Log(title = "系统管理--人员管理--删除后台用户", businessType = BusinessType.DELETE)
    // 删除后台用户
    @DeleteMapping("/deleteUser/{userId}")
    public AjaxResult deleteBackstageUser(@PathVariable Long[] userId){

        //删除多个用户
        Long authId = SecurityUtils.getUserId();
        if (ArrayUtils.contains(userId, authId))
        {
            return AjaxResult.error("当前用户不能删除");
        }

        // 这里删除用户是直接把 del_flag置为2啊.
        return toAjax(userService.deleteUserByIds(userId));



        //删除单个用户
//        int back = userService.deleteUserById(userId);
//        if(back > 0){
//            return AjaxResult.success("删除用户成功");
//        }
//        return AjaxResult.error("删除用户失败");

    }



//    private TableDataInfo getDataTable(List<?> list)
//    {
//        TableDataInfo rspData = new TableDataInfo();
//        rspData.setCode(HttpStatus.SUCCESS);
//        rspData.setMsg("查询成功");
//        rspData.setRows(list);
//        rspData.setTotal(new PageInfo(list).getTotal());
//        return rspData;
//    }

}
