package com.wms_main.service.controller.serviceImpl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wms_main.constant.AppConstant;
import com.wms_main.dao.ITSysUserService;
import com.wms_main.model.dto.query.UserQuery;
import com.wms_main.model.dto.query.UserUpdateRequest;
import com.wms_main.model.dto.response.wms.BaseWmsApiResponse;
import com.wms_main.model.dto.response.wms.WmsApiResponse;
import com.wms_main.model.po.TSysRole;
import com.wms_main.model.po.TSysUser;
import com.wms_main.model.vo.wms.PageVo;
import com.wms_main.model.vo.wms.UserVo;
import com.wms_main.repository.utils.StringUtils;
import com.wms_main.service.controller.IUserControllerService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
@Slf4j
@RequiredArgsConstructor
public class UserControllerServiceImpl implements IUserControllerService {
    private final ITSysUserService sysUserService;// 用户服务
    @Override
    public WmsApiResponse<PageVo<UserVo>> getUserList(UserQuery userQuery) {
        // 参数校验（可选）
        if (userQuery == null) {
            return WmsApiResponse.error("查询参数不能为空", null);
        }

        // 直接执行用户分页查询，不考虑角色过滤
        Page<TSysUser> page = userQuery.toMpPage();

        LambdaQueryWrapper<TSysUser> queryWrapper = new LambdaQueryWrapper<>();
        // 根据roleId进行条件过滤
        if ("0".equals(userQuery.getRoleId())) {
            // roleId为0时显示所有用户，不添加过滤条件
            queryWrapper.orderByAsc(TSysUser::getRoleId);
        } else if ("2".equals(userQuery.getRoleId())) {
            // roleId为2时只显示该角色的用户
            queryWrapper.eq(TSysUser::getUserName, userQuery.getUserName());
        } else {
            // 其他情况也显示所有用户（可根据需求调整）
            queryWrapper.orderByAsc(TSysUser::getRoleId);
        }
        Page<TSysUser> usersPage = sysUserService.page(page, queryWrapper);

        if (usersPage == null) {
            return WmsApiResponse.error("获取用户列表发生异常", null);
        }
        // 返回结果
        return WmsApiResponse.success("获取用户列表成功", PageVo.of(usersPage, UserVo::ofPo));
    }


    /**
     * 添加用户信息---实现
     *
     * @param userUpdateRequest 新增用户信息请求
     * @return 添加结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public BaseWmsApiResponse addUserInfo(UserUpdateRequest userUpdateRequest) {
        // 参数校验
        if (userUpdateRequest == null ||
                StringUtils.isEmpty(userUpdateRequest.getLoginAccountUpdate()) ||
                StringUtils.isEmpty(userUpdateRequest.getLoginPasswordUpdate())) {
            return BaseWmsApiResponse.error("请求参数不完整，必须包含登录账号和密码。");
        }

        if (!Objects.equals(userUpdateRequest.getRoleIdOp(), "0")){
            return BaseWmsApiResponse.error("您没有权限添加用户。");
        }

        // 查询用户是否已存在
        boolean ifExist = sysUserService.exists(new LambdaQueryWrapper<TSysUser>()
                .eq(TSysUser::getLoginAccount, userUpdateRequest.getLoginAccountUpdate()));

        if (ifExist) {
            return BaseWmsApiResponse.error("用户已存在，请勿重复添加。");
        }

        // 检查用户名是否已存在
        boolean userNameExists = sysUserService.exists(new LambdaQueryWrapper<TSysUser>()
                .eq(TSysUser::getUserName, userUpdateRequest.getUserNameUpdate()));

        if (userNameExists) {
            return BaseWmsApiResponse.error("用户名已存在，请使用其他用户名。");
        }

        // 添加新用户
        TSysUser newUser = new TSysUser();
        newUser.setLoginAccount(userUpdateRequest.getLoginAccountUpdate());
        newUser.setLoginPassword(StringUtils.encryptPassword(userUpdateRequest.getLoginPasswordUpdate()));
        newUser.setUserName(userUpdateRequest.getUserNameUpdate());
        newUser.setRoleId("2");
        newUser.setAddUser(userUpdateRequest.getUserName());
        newUser.setAddTime(LocalDateTime.now());

        boolean addResult = sysUserService.save(newUser);

        return addResult ? BaseWmsApiResponse.success("添加用户信息成功") : BaseWmsApiResponse.error("添加用户信息失败");
    }



    /**
     * 删除用户信息---实现
     *
     * @param userUpdateRequest 删除用户信息请求
     * @return 删除结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public BaseWmsApiResponse deleteUserInfo(UserUpdateRequest userUpdateRequest) {
        if (userUpdateRequest == null || StringUtils.isEmpty(userUpdateRequest.getRoleIdOp())) {
            return BaseWmsApiResponse.error("请求以及操作人员的角色必须输入。");
        }
        // 查询被更新人员的角色
        TSysUser needDeleteUser = sysUserService.getById(userUpdateRequest.getLoginAccountUpdate());
        if (needDeleteUser == null) {
            return BaseWmsApiResponse.error("无法删除查询不到的用户。");
        }
        if (!Objects.equals(userUpdateRequest.getRoleIdOp(), "0")) {
            return BaseWmsApiResponse.error("您没有权限删除用户。");
        }
        // 删除对应用户
        boolean deleteResult = sysUserService.removeById(userUpdateRequest.getLoginAccountUpdate());
        return deleteResult ? BaseWmsApiResponse.success("删除用户成功。") : BaseWmsApiResponse.error("删除用户失败。");
    }



    /**
     * 修改用户密码---实现
     *
     * @param userUpdateRequest 密码修改参数
     * @return 修改结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public BaseWmsApiResponse changePassword(UserUpdateRequest userUpdateRequest) {
        // 参数校验
        if (userUpdateRequest == null ||
                StringUtils.isEmpty(userUpdateRequest.getLoginAccountUpdate()) ||
                StringUtils.isEmpty(userUpdateRequest.getOldPassword()) ||
                StringUtils.isEmpty(userUpdateRequest.getNewPassword())) {
            return BaseWmsApiResponse.error("请求参数不完整，必须包含账号、旧密码和新密码。");
        }

        // 查询用户是否存在
        TSysUser user = sysUserService.getOne(new LambdaQueryWrapper<TSysUser>()
                .eq(TSysUser::getLoginAccount, userUpdateRequest.getLoginAccountUpdate()));

        if (user == null) {
            return BaseWmsApiResponse.error("用户不存在。");
        }

        // 验证旧密码是否正确
        if (!StringUtils.verifyPassword(userUpdateRequest.getOldPassword(), user.getLoginPassword())) {
            return BaseWmsApiResponse.error("旧密码错误。");
        }

        // 更新密码
        user.setLoginPassword(StringUtils.encryptPassword(userUpdateRequest.getNewPassword()));
        user.setLastUpdateTime(LocalDateTime.now());
        user.setLastUpdateUser(userUpdateRequest.getUserName());

        boolean updateResult = sysUserService.updateById(user);

        return updateResult ? BaseWmsApiResponse.success("密码修改成功") : BaseWmsApiResponse.error("密码修改失败");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public BaseWmsApiResponse setUserPermission(UserUpdateRequest userUpdateRequest) {
        // 参数校验
        if (userUpdateRequest == null ||
                StringUtils.isEmpty(userUpdateRequest.getLoginAccountUpdate())) {
            return BaseWmsApiResponse.error("请求参数不完整，必须包含登录账号和权限信息。");
        }

        // 查询用户是否存在
        TSysUser user = sysUserService.getById(userUpdateRequest.getLoginAccountUpdate());
        if (user == null) {
            return BaseWmsApiResponse.error("用户不存在。");
        }

        // 更新用户权限
        user.setUserPermission(userUpdateRequest.getUserPermission());
        user.setLastUpdateTime(LocalDateTime.now());
        user.setLastUpdateUser(userUpdateRequest.getUserName());

        boolean updateResult = sysUserService.updateById(user);

        return updateResult ?
                BaseWmsApiResponse.success("用户权限设置成功") :
                BaseWmsApiResponse.error("用户权限设置失败");
    }

    @Override
    public BaseWmsApiResponse getUserPermission(UserUpdateRequest userUpdateRequest) {
        // 参数校验
        if (userUpdateRequest == null ||
                StringUtils.isEmpty(userUpdateRequest.getLoginAccountUpdate())) {
            return BaseWmsApiResponse.error("请求参数不完整，必须包含登录账号。");
        }

        // 查询用户信息
        TSysUser user = sysUserService.getById(userUpdateRequest.getLoginAccountUpdate());
        if (user == null) {
            return BaseWmsApiResponse.error("用户不存在。");
        }

        // 返回用户权限信息
        return BaseWmsApiResponse.success(user.getUserPermission());
    }




    /**
     * 修改用户信息---实现
     *
     * @param userUpdateRequest 修改用户信息请求
     * @return 修改结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public BaseWmsApiResponse updateUserInfo(UserUpdateRequest userUpdateRequest) {
        // 参数校验
        if (userUpdateRequest == null ||
                StringUtils.isEmpty(userUpdateRequest.getLoginAccountUpdate()) ||
                StringUtils.isEmpty(userUpdateRequest.getUserNameUpdate())) {
            return BaseWmsApiResponse.error("请求参数不完整，必须包含登录账号和用户名。");
        }

        // 查询被更新人员
        TSysUser needUpdateUser = sysUserService.getById(userUpdateRequest.getLoginAccountUpdate());
        if (needUpdateUser == null) {
            return BaseWmsApiResponse.error("无法找到该用户。");
        }

        // 检查用户名是否已存在
        boolean userNameExists = sysUserService.exists(new LambdaQueryWrapper<TSysUser>()
                .eq(TSysUser::getUserName, userUpdateRequest.getUserNameUpdate()));

        if (userNameExists) {
            return BaseWmsApiResponse.error("用户名已存在，请使用其他用户名。");
        }

        // 更新用户名
        needUpdateUser.setUserName(userUpdateRequest.getUserNameUpdate());
        needUpdateUser.setLastUpdateUser(userUpdateRequest.getUserName());
        needUpdateUser.setLastUpdateTime(LocalDateTime.now());

        boolean updateResult = sysUserService.updateById(needUpdateUser);
        return updateResult ? BaseWmsApiResponse.success("修改用户信息成功") : BaseWmsApiResponse.error("修改用户信息失败");
    }


}
