package com.ruoyi.service.impl;

import java.util.*;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.domain.vo.PhotoStorageVO;
import com.ruoyi.framework.websocket.WebSocketUsers;
import com.ruoyi.service.UserPhotoStorageService;
import com.ruoyi.web.request.UserPhotoStorageCreateRequest;
import com.ruoyi.web.request.UserPhotoStorageListRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.mapper.UserPhotoStorageMapper;
import com.ruoyi.domain.UserPhotoStorage;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户照片存储Service业务层处理
 *
 * @author gxk
 * @date 2024-01-29
 */
@Service
@Transactional
public class UserPhotoStorageServiceImpl extends ServiceImpl<UserPhotoStorageMapper, UserPhotoStorage> implements UserPhotoStorageService
{
    @Autowired
    private UserPhotoStorageMapper userPhotoStorageMapper;

    /**
     * 查询用户照片存储列表
     *
     * @param request 用户照片存储
     * @return 用户照片存储
     */
    @Override
    public List<PhotoStorageVO> selectUserPhotoStorageList(UserPhotoStorageListRequest request)
    {
        List<UserPhotoStorage> userPhotoStorages = userPhotoStorageMapper.selectUserPhotoStorageList(request);
        // 创建一个VOList,用于返回数据
        List<PhotoStorageVO> photoStorageVOList = new ArrayList<>();
        // 创建一个hashMap,用于存储分类图片
        HashMap<String, List<UserPhotoStorage>> photoStorageMap = new HashMap<>();
        // 遍历userPhotoStorages,往photoStorageMap里添加数据
        for (UserPhotoStorage photoStorage : userPhotoStorages) {
            // 计算出当前图片对象的创建时间: yyyy-MM-dd
            String createTime = DateUtils.dateTime(photoStorage.getCreateTime());
            // Map里存在则取出value然后添加新的对象;则直接添加新的key-value
            if (!photoStorageMap.containsKey(createTime)) {
                List<UserPhotoStorage> photoStorageList = new ArrayList<>();
                photoStorageList.add(photoStorage);
                photoStorageMap.put(createTime, photoStorageList);
            } else {
                photoStorageMap.get(createTime).add(photoStorage);
            }
        }
        // 遍历photoStorageMap,将value赋值给photoStorageVOList
        for (Map.Entry<String, List<UserPhotoStorage>> entry : photoStorageMap.entrySet()) {
            // entry.getValue()以时间降序排列
            entry.getValue().sort(Comparator.comparing(UserPhotoStorage::getCreateTime).reversed());
            PhotoStorageVO photoStorageVO = PhotoStorageVO.builder()
                    .createTime(entry.getKey())
                    .userPhotoStorageList(entry.getValue()).build();
            photoStorageVOList.add(photoStorageVO);
        }
        // photoStorageVOList以创建时间降序排列
        photoStorageVOList.sort(Comparator.comparing(PhotoStorageVO::getCreateTime).reversed());
        return photoStorageVOList;
    }

    /**
     * 新增用户照片存储
     *
     * @param request 用户照片存储
     * @return 结果
     */
    @Override
    public int insertUserPhotoStorage(UserPhotoStorageCreateRequest request)
    {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        UserPhotoStorage userPhotoStorage = UserPhotoStorage.builder()
                .userId(loginUser.getUserId())
                .username(loginUser.getUsername())
                .path(request.getPath())
                .createTime(DateUtils.getNowDate())
                .build();
        WebSocketUsers.sendMessageToUserByUserId(loginUser.getUserId(), request.getPath());
        return userPhotoStorageMapper.insert(userPhotoStorage);
    }

    /**
     * 修改用户照片存储
     *
     * @param userPhotoStorage 用户照片存储
     * @return 结果
     */
    @Override
    public int updateUserPhotoStorage(UserPhotoStorage userPhotoStorage)
    {
        return userPhotoStorageMapper.updateUserPhotoStorage(userPhotoStorage);
    }

}