package com.example.civilizedcity.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.civilizedcity.common.BaseController;
import com.example.civilizedcity.common.Constants;
import com.example.civilizedcity.common.ResponseBean;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.example.civilizedcity.common.StringUtils;
import com.example.civilizedcity.entity.SysResource;
import com.example.civilizedcity.entity.SysRole;
import com.example.civilizedcity.service.*;
import com.example.civilizedcity.vo.ChangePassword;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.example.civilizedcity.entity.SysUser;

/**
 * 用户表;(sys_user)表控制层
 *
 * @author : http://njyunzhi.com
 * @date : 2022-12-12
 */
@Api(tags = "用户表对象功能接口")
@RestController
@RequestMapping("/")
public class SysUserController extends BaseController {

    @Autowired
    SysRoleService sysRoleService;

    @Autowired
    SysResourceService sysResourceService;

    @Autowired
    SysUserDutyService sysUserDutyService;

    @Autowired
    SysLoginService sysLoginService;

    @Autowired
    SysOrgService sysOrgService;

    /**
     * 通过ID查询单条数据
     *
     * @param userId 主键
     * @return 实例对象
     */
    @ApiOperation("通过ID查询单条数据")
    @GetMapping("/sysUser/{id}")
    public ResponseBean queryById(@ApiParam("对象ID") @PathVariable String id) throws Exception {
        SysUser sysUser = sysUserService.getById(id);
        if (null == sysUser || sysUser.getStatus() == Constants.STATUS_DELETE) {
            return ResponseBean.error("用户不存在");
        }

        return ResponseBean.success(getPermissions(sysUser));
    }

    /**
     * 查询当前人员
     *
     * @param
     * @return 实例对象
     */
    @ApiOperation("查询当前人员")
    @GetMapping("/sysUser/current")
    public ResponseBean current() throws Exception {
        SysUser sysUser = currentUser();
        return ResponseBean.success(getPermissions(sysUser));
    }

    private SysUser getPermissions(SysUser sysUser) {
        List<SysRole> rolesList = sysRoleService.getByUser(sysUser.getUserId());
        List<SysResource> resourcesList = sysResourceService.getByUser(sysUser.getUserId());
        List<String> dutyList = sysUserDutyService.getListByUser(sysUser.getUserId());

        sysUser.setRolesList(rolesList);
        sysUser.setResourcesList(resourcesList);
        sysUser.setDutyList(dutyList);
        sysUser.setOrg(sysOrgService.getById(sysUser.getOrgId()));

        return sysUser;
    }

    /**
     * 分页查询
     *
     * @param pageNum  当前页码
     * @param pageSize 每页条数
     * @return 查询结果
     */
    @ApiOperation("分页查询")
    @GetMapping("/sysUser")
    public ResponseBean list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                             @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
                             @ApiParam("姓名") @RequestParam(value = "name", required = false) String name,
                             @ApiParam("机构") @RequestParam(value = "orgId", required = false) String orgId,
                             @ApiParam("手机号") @RequestParam(value = "phone", required = false) String phone) throws Exception {

        IPage<SysUser> pg = new Page<>(pageNum, pageSize);
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(!StringUtils.isEmpty(name), "name", name);
        queryWrapper.eq(!StringUtils.isEmpty(orgId), "org_id", orgId);
        queryWrapper.like(!StringUtils.isEmpty(phone), "phone", phone);
        queryWrapper.eq("is_user", 1);
        queryWrapper.gt("status", Constants.STATUS_DELETE);
        queryWrapper.ne("user_id", Constants.ROOT_ID);
        queryWrapper.orderByDesc("create_date");
        IPage<SysUser> result = sysUserService.page(pg, queryWrapper);

        return ResponseBean.success(result);
    }

    /**
     * 小程序端分页查询
     *
     * @param pageNum  当前页码
     * @param pageSize 每页条数
     * @return 查询结果
     */
    @ApiOperation("小程序端分页查询")
    @GetMapping("/ma/sysUser")
    public ResponseBean maList(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                             @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) throws Exception {

        IPage<SysUser> pg = new Page<>(pageNum, pageSize);
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("org_id", currentUser().getOrgId());
        queryWrapper.eq("is_from_wx", 1);
        queryWrapper.gt("status", Constants.STATUS_DELETE);
        queryWrapper.orderByDesc("create_date");
        IPage<SysUser> result = sysUserService.page(pg, queryWrapper);

        List<SysUser> list = result.getRecords();
        if (null != list || list.size() > 0) {
            for (SysUser sysUser : list) {
                sysUser.setDutyList(sysUserDutyService.getListByUser(sysUser.getUserId()));
            }
        }

        return ResponseBean.success(result);
    }

    /**
     * 新增数据
     *
     * @param sysUser 实例对象
     * @return 实例对象
     */
    @ApiOperation("新增数据")
    @PostMapping("/sysUser")
    public ResponseBean add(@ApiParam("对象实体") @RequestBody SysUser sysUser) throws Exception {
        if (null == sysUser.getOrgId()) {
            sysUser.setOrgId(currentUser().getOrgId());
        }

        sysUserService.mergeData(sysUser);
        return ResponseBean.success(sysUser);
    }


    /**
     * 小程序端新增数据
     *
     * @param sysUser 实例对象
     * @return 实例对象
     */
    @ApiOperation("小程序端新增数据")
    @PostMapping("/ma/sysUser")
    public ResponseBean addMa(@ApiParam("对象实体") @RequestBody SysUser sysUser) throws Exception {
        if (StringUtils.isEmpty(sysUser.getPhone())) {
            return ResponseBean.error("请填写手机号");
        }
        if (StringUtils.isEmpty(sysUser.getName())) {
            return ResponseBean.error("请填写名称");
        }

        SysUser user = currentUser();

        SysUser origin = sysUserService.getByPhone(sysUser.getPhone(), user.getOrgId());
        if (null != origin) {
            if (StringUtils.isNotEmpty(sysUser.getUserId()) && !sysUser.getUserId().equals(origin.getUserId())) {
                return ResponseBean.error("当前人员已存在");
            }

            sysUser.setUserId(origin.getUserId());
            if (null != sysUser.getStatus() && Constants.STATUS_DELETE == sysUser.getStatus()) {
                // 如果这个人被删除了, 则重置为正常状态
                sysUser.setStatus(Constants.STATUS_NORMAL);
            }
        }

        sysUserService.createMaUser(sysUser, user);
        return ResponseBean.success(sysUser);
    }

    /**
     * 更新数据
     *
     * @param id 实例ID
     * @return 实例对象
     */
    @ApiOperation("更新数据")
    @PutMapping("/sysUser/{id}/status")
    public ResponseBean edit(@ApiParam("对象ID") @PathVariable String id,
                             @ApiParam("页码") @RequestParam(value = "status") Integer status) throws Exception {

        SysUser sysUser = sysUserService.getById(id);
        sysUser.setStatus(status);

        sysUserService.updateById(sysUser);
        return ResponseBean.success(sysUser);
    }

//    /**
//     * 更新数据
//     *
//     * @param sysUser 实例对象
//     * @return 实例对象
//     */
//    @ApiOperation("更新数据")
//    @PutMapping("/sysUser/{id}")
//    public ResponseBean edit(@ApiParam("对象实体") @RequestBody SysUser sysUser,
//                            @ApiParam("对象ID") @PathVariable String id ) throws Exception {
//        sysUserService.updateById(sysUser);
//        return ResponseBean.success(sysUser);
//    }


    @PutMapping("/ma/sysUser/change-password")
    @ApiOperation(value="小程序端修改密码", notes = "修改密码", httpMethod = "PUT", response = ResponseBean.class)
    public ResponseBean changePassword(@ApiParam("修改密码参数") @RequestBody ChangePassword param) throws Exception {
        if (StringUtils.isEmpty(param.getOriginPassword()) || StringUtils.isEmpty(param.getNewPassword())) {
            return ResponseBean.error("原始密码或新密码不能为空", ResponseBean.ERROR_ILLEGAL_PARAMS);
        }

        SysUser user = currentUser();

        boolean isOk = sysUserService.changePassword(user, param);
        if (!isOk) {
            ResponseBean.error("修改失败, 请重试", ResponseBean.ERROR_UNAVAILABLE);
        }

        return ResponseBean.success("密码修改成功");
    }

    /**
     * 通过主键删除数据
     *
     * @param userId 主键
     * @return 是否成功
     */
    @ApiOperation("通过主键删除数据")
    @DeleteMapping("/sysUser/{id}")
    public ResponseBean deleteById(@ApiParam("对象ID") @PathVariable String id) {
        sysUserService.removeLogicById(id);
        return ResponseBean.success("success");
    }

    /**
     * 小程序端通过主键删除数据
     *
     * @param userId 主键
     * @return 是否成功
     */
    @ApiOperation("小程序端通过主键删除数据")
    @DeleteMapping("/ma/sysUser/{id}")
    public ResponseBean deleteMaById(@ApiParam("对象ID") @PathVariable String id) throws Exception {

        SysUser user = sysUserService.getById(id);
        if (null == user || Constants.STATUS_DELETE == user.getStatus()) {
            return ResponseBean.error("人员不存在");
        }

        SysUser sysUser = currentUser();
        if (!sysUser.getOrgId().equals(user.getOrgId())) {
            return ResponseBean.error("暂无权限");
        }

        // 删除登录信息
        sysLoginService.removeByUser(sysUser.getUserId());

        sysUserService.removeLogicById(id);
        return ResponseBean.success("success");
    }
}