package com.kcim.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kcim.common.util.PageUtils;
import com.kcim.common.util.Result;
import com.kcim.dao.mapper.UserMapper;
import com.kcim.dao.model.User;
import com.kcim.dao.model.dto.LoginDTO;
import com.kcim.dao.model.dto.UserDto;
import com.kcim.vo.LoginVO;
import com.kcim.vo.UserVO;
import com.kcim.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * @author 11290
 */
@Slf4j
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    /**
     * 登录接口
     *
     * @param loginDTO {@link LoginDTO} 登录相关参数
     * @return
     */
    @Override
    public LoginVO login(LoginDTO loginDTO) {
        return null;
    }

    /**
     * 查询查询用户的数据信息
     *
     * @param page
     * @param pageSize
     * @param hospId
     * @param name
     * @return
     */
    @Override
    public PageUtils queryList(Integer page, Integer pageSize, Long hospId, String name) {
        return null;
    }

    /**
     * 根据用户的姓名查询用户
     *
     * @param name
     * @return
     */
    @Override
    public List<UserVO> getByUserName(String name) {
        return null;
    }

    /**
     * 保存用户信息
     *
     * @param userDto
     */
    @Override
    public void saveUser(UserDto userDto) {

    }

    /**
     * 删除用户
     *
     * @param userDto
     */
    @Override
    public void updateByUser(UserDto userDto) {

    }

    /**
     * 导入用户操作
     *
     * @param list 读取的列表
     */
    @Override
    public Result importUser(List<List<Object>> list) {
        return null;
    }

    /**
     * 退出登录
     *
     * @param user
     */
    @Override
    public void logout(User user) {

    }

    /**
     * 通过用户id和医院id获取用户的名称，如果不存在，返回""
     *
     * @param createUserId id
     * @param hospId       医院id
     * @return 用户名称，如果不存在返回空字符串
     */
    @Override
    public String getUsernameByIdAndHospId(Long createUserId, Long hospId) {
        return null;
    }

    /**
     * 批量删除用户集合
     *
     * @param asList idList
     */
    @Override
    public void deleteByIds(List<Integer> asList) {

    }
//
//    private JwtUtil jwtUtil;
//
//    private HospitalService hosptailService;
//
//    private final RedisUtil redisUtil;
//
//    private Map<String, Integer> map = new ConcurrentHashMap<>();
//
//    public UserServiceImpl(JwtUtil jwtUtil, HospitalService hosptailService, RedisUtil redisUtil) {
//        this.jwtUtil = jwtUtil;
//        this.hosptailService = hosptailService;
//        this.redisUtil = redisUtil;
//    }
//
//
//    /**
//     * 登录具体逻辑
//     *
//     * @param loginDTO {@link LoginDTO} 登录相关参数
//     * @return
//     */
//    @Override
//    public LoginVO login(LoginDTO loginDTO) {
//        String hospSign = loginDTO.getHospSign();
//        Long id = loginDTO.getId();
//        if (Objects.isNull(id)) {
//            Hospital hospital = hosptailService.getBySign(hospSign);
//            id = hospital.getId();
//        }
//        // 院区情况
//        User one = this.getOne(
//                new LambdaQueryWrapper<User>()
//                        .eq(User::getAccount, loginDTO.getAccount())
//                        .eq(User::getHospId, id)
//                        .last("limit 1")
//        );
//        if (Objects.isNull(one)) {
//            throw new CostException("用户不存在");
//        }
//        if (!SecureUtil.md5(loginDTO.getPassword()).equals(one.getPassword())) {
//            throw new CostException("密码错误");
//        }
//
//        String token = jwtUtil.createToken(one.getId());
//        // 保存到redis 有效期一天
//        redisUtil.set(one.getId() + "", token, 60 * 60 * 24);
//        return LoginVO.builder().token(token).name(one.getName()).userid(one.getId()).build();
//    }
//
//    /**
//     * 查询查询用户的数据信息
//     *
//     * @param page
//     * @param pageSize
//     * @param hospId
//     * @return
//     */
//    @Override
//    public PageUtils queryList(Integer page, Integer pageSize, Long hospId, String name) {
//        Page<User> userPage = new Page<>(page, pageSize);
//        Page<User> pages = this.page(userPage,
//                new QueryWrapper<User>().lambda().
//                        eq(User::getHospId, hospId)
//                        .like(!StringUtils.isEmpty(name), User::getName, name)
//                        .orderByDesc(User::getCreateTime));
//        List<User> records = pages.getRecords();
//        List<UserVO> userVOS = BeanUtil.convertList(records, UserVO.class);
//        PageUtils pageUtils = new PageUtils(pages);
//        pageUtils.setList(userVOS);
//        return pageUtils;
//    }
//
//    /**
//     * 根据用户的姓名查询用户
//     *
//     * @param name
//     * @return
//     */
//    @Override
//    public List<UserVO> getByUserName(String name) {
//        List<User> users = baseMapper.selectList(new QueryWrapper<User>().lambda().like(!StringUtils.isEmpty(name), User::getName, name));
//        List<UserVO> userVOS = BeanUtil.convertList(users, UserVO.class);
//        return userVOS;
//    }
//
//    /**
//     * 保存用户信息
//     *
//     * @param userDto
//     */
//    @Override
//    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
//    public void saveUser(UserDto userDto) {
//        User user = (User) SecurityUtils.getSubject().getPrincipal();
//        // 医院的Id
//        Long hospId = user.getHospId();
//
//        User userRequest = BeanUtil.convertObj(userDto, User.class);
//        if (StringUtils.isEmpty(userDto.getPassword())) {
//            throw new CostException("密码不能为空");
//        }
//        userRequest.setPassword(SecureUtil.md5(userDto.getPassword()));
//        userRequest.setHospId(hospId);
//        userRequest.setCreateTime(System.currentTimeMillis());
//        baseMapper.insert(userRequest);
//    }
//
//    /**
//     * 修改用户
//     *
//     * @param userDto
//     */
//    @Override
//
//    public void updateByUser(UserDto userDto) {
//        User userOne = (User) SecurityUtils.getSubject().getPrincipal();
//        User user = baseMapper.selectOne(new QueryWrapper<User>().lambda().like(
//                !StringUtils.isEmpty(userDto.getId()), User::getId, userDto.getId()));
//        if (Objects.isNull(user)) {
//            throw new CostException("用户不存在");
//        }
//        baseMapper.deleteById(user.getId());
//        User userRequest = BeanUtil.convertObj(userDto, User.class);
//        userRequest.setId(null);
//        userRequest.setHospitalStatus(userDto.getHospitalStatus());
//        userRequest.setCreateTime(System.currentTimeMillis());
//        userRequest.setHospId(userOne.getHospId());
//        if (!StringUtils.isEmpty(userDto.getPassword())) {
//            String newPassWord = SecureUtil.md5(userDto.getPassword());
//            userRequest.setPassword(newPassWord);
//        }else {
//            userRequest.setPassword(user.getPassword());
//        }
//        baseMapper.insert(userRequest);
//    }
//
//    /**
//     * 导入用户
//     *
//     * @param list        上传的文件读取的内容
//     * @param currentUser 当前登录用户
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
//    public Result importUser(List<List<Object>> list, User currentUser) {
//        // TODO: 2021/7/26 校验excel格式是否正确
//        for (int i = list.size() - 1; i >= 0; i--) {
//            if (i == 0 || i == 1 || i == 2 || i == 3) {
//                list.remove(list.get(i));
//            }
//        }
//        log.info("读取的数据为：{}", list);
//        List<User> users = new ArrayList<>();
//        List<String> errRowNums = new ArrayList<>();
//        for (int i = 0; i < list.size(); i++) {
//            List<Object> data = list.get(i);
//            log.info("得到用户输入的数据为：{}", data);
//            User user = new User();
//            user.setHospId(currentUser.getHospId());
//            user.setCreateTime(System.currentTimeMillis());
//            int size = data.size();
//            if (size != 5) {
//                // 补充读取的null问题
//                if (size == 4) {
//                    data.add(StrUtil.EMPTY);
//                }
//                for (int j = 0; j < 5; j++) {
//                    if (Objects.isNull(data.get(j))) {
//                        data.set(j, StrUtil.EMPTY);
//                    }
//                }
//            }
//            for (int j = 0; j < 5; j++) {
//                String str = String.valueOf(data.get(j));
//                log.info("得到的字符串{}", str);
//                if (StrUtil.isBlank(str)) {
//                    errRowNums.add("" + (i + 5));
//                }
//
//                if (j == 0) {
//                    Hospital hospital = hosptailService.getByName(str);
//                    user.setHospId(hospital.getId());
//                } else if (j == 1) {
//                    user.setName(str);
//                } else if (j == 2) {
//                    user.setAccount(str);
//                } else if (j == 3) {
//                    user.setPassword(SecureUtil.md5(str));
//                } else {
//                    user.setMobilePhoneNum(str);
//                }
//            }
//            users.add(user);
//        }
//        if (CollUtil.isNotEmpty(errRowNums)) {
//            String collect = errRowNums.stream().collect(Collectors.joining(StrUtil.COMMA));
//            throw new CostException(500, "第" + collect + "行数据异常");
//        }
//        // 校验users
//        List<User> realUsers = new ArrayList<>();
//        users.forEach(i -> {
//            User one = getOne(
//                    new QueryWrapper<User>().lambda()
//                            .eq(User::getAccount, i.getAccount())
//                            .eq(User::getHospId, i.getHospId())
//            );
//            if (Objects.nonNull(one)) {
//                realUsers.add(one);
//            }
//        });
//        users = users.stream().filter(i -> !realUsers.stream().map(User::getAccount).collect(Collectors.toList()).contains(i.getAccount())).collect(Collectors.toList());
//        this.saveBatch(users);
//        return Result.build(200, "有" + realUsers.size() + "条数据已存在，未被导入", null);
//    }
//
////    /**
////     * 校验是否是本院下人员,并且返回对应的院区id
////     * @param hospId
////     * @param str
////     * @return
////     */
////    private Integer getByNameAndCheck(Long hospId, String str) {
////        Integer thisHospAreaId = this.hosptailService.getByNameAndCheck(hospId, str);
////        return thisHospAreaId;
////    }
//
//    /**
//     * 退出登录
//     *
//     * @param user
//     */
//    @Override
//    public void logout(User user) {
//        redisUtil.del(user.getId() + "");
//    }
//
//    /**
//     * 通过用户id和医院id获取用户的名称，
//     *
//     * @param createUserId id
//     * @param hospId       医院id
//     * @return 如果不存在，返回"" （使用redis 缓存避免过多的查询）
//     */
//    @Override
//    public String getUsernameByIdAndHospId(Long createUserId, Long hospId) {
//        User one = this.getOne(
//                new LambdaQueryWrapper<User>()
//                        .select(User::getName)
//                        .eq(User::getId, createUserId)
//                        .eq(User::getHospId, hospId)
//                        .last("limit 1")
//        );
//        if (Objects.isNull(one)) {
//            return "";
//        }
//        return one.getName();
//    }
//
//    /**
//     * 批量删除用户集合
//     *
//     * @param asList idList
//     */
//    @Override
//    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
//    public void deleteByIds(List<Integer> asList) {
//        this.removeByIds(asList);
//    }
}