package com.persagy.dmp.file.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.persagy.dmp.common.constant.ValidEnum;
import com.persagy.dmp.common.lang.PsDateTime;
import com.persagy.dmp.file.dao.FileMd5Mapper;
import com.persagy.dmp.file.model.FileInfo;
import com.persagy.dmp.file.model.FileMd5;
import com.persagy.dmp.file.model.FileMd5Creator;
import com.persagy.dmp.file.service.FileMd5Service;
import com.persagy.dmp.file.service.FileStorageFactory;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 *
 */
@Service
public class FileMd5ServiceImpl extends ServiceImpl<FileMd5Mapper, FileMd5> implements FileMd5Service {
    /***
     * Description: 插入文件Md5
     * @param fileMd5 : 文件请求信息
     * @return : com.persagy.dmp.file.model.FileMd5
     * @author : lijie
     * @date :2021/10/22 21:41
     * Update By lijie 2021/10/22 21:41
     */
    @Override
    public FileMd5 insertFileMd5(FileMd5 fileMd5) {
        ensureFilePath(fileMd5,fileMd5.getFileName());
        this.save(fileMd5);
        return fileMd5;
    }

    /**
     * 确认文件名称
     * @param vo 文件管理对象
     * @return
     */
    @Override
    public void ensureFilePath(FileMd5 vo, String fileName) {
        // 组装文件路径 - 日期以文件创建日期为准
        FileMd5Creator.buildFilePath(vo,fileName);
        // 是否存在同名
        LambdaQueryWrapper<FileMd5> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(FileMd5::getValid, ValidEnum.TRUE.getType()).
                eq(FileMd5::getFilePath, vo.getFilePath());
        if(StrUtil.isNotBlank(vo.getId())) {
            queryWrapper.ne(FileMd5::getId, vo.getId());
        }
        List<FileMd5> dbVos = this.list(queryWrapper);
        if(CollUtil.isEmpty(dbVos)) {
            return;
        }
        // 存在同名 - 重新命名 +随机数
        String resetFileName = resetFileName(fileName);
        ensureFilePath(vo,resetFileName);
    }

    /***
     * Description: 根据文件md5查询文件信息
     * @param fileMd5 : 文件md5值
     * @return : java.util.List<com.persagy.dmp.file.model.FileInfo>
     * @author : lijie
     * @date :2021/10/9 20:32
     * Update By lijie 2021/10/9 20:32
     */
    @Override
    public FileMd5 queryFileMd5ByFileMd5(String fileMd5) {
        LambdaQueryWrapper<FileMd5> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(FileMd5::getFileMd5,fileMd5);
        queryWrapper.eq(FileMd5::getValid,true);
        return this.getOne(queryWrapper);
    }
    /***
     * Description: 更新文件MD5信息
     * @param fileMd5 : 文件MD5信息
     * @return : com.persagy.dmp.file.model.FileMd5
     * @author : lijie
     * @date :2021/10/22 21:50
     * Update By lijie 2021/10/22 21:50
     */
    @Override
    public FileMd5 updateFileMd5(FileMd5 fileMd5) {
        FileMd5 dbVO = load(fileMd5.getId());
        fileMd5.setCreationTime(dbVO.getCreationTime());
        fileMd5.setModifiedTime(new PsDateTime());
        updateById(fileMd5);
        return fileMd5;
    }
    /***
     * Description: 根据文件id查询文件MD5信息
     * @param id : 主键
     * @return : com.persagy.dmp.file.model.FileMd5
     * @author : lijie
     * @date :2021/10/22 21:50
     * Update By lijie 2021/10/22 21:50
     */
    @Override
    public FileMd5 load(String id) {
        return getById(id);
    }
    /***
     * Description: 逻辑删除文件Md5
     * @param fileMd5 : 文件Md5信息
     * @return : void
     * @author : lijie
     * @date :2021/10/22 22:02
     * Update By lijie 2021/10/22 22:02
     */
    @Override
    public void deleteFileMd5(FileMd5 fileMd5) {
        // 1.更新文件为无效态
        fileMd5.setValid(ValidEnum.FALSE.getType());
        updateFileMd5(fileMd5);
        // 2.删除文件
        FileStorageFactory.getService().delete(fileMd5.getFileBucket(), fileMd5.getFilePath());
    }

    /**
     * 重命名
     * @param oldFileName 原文件名
     * @return 原文件名前缀+"-随机数"+后缀
     */
    private String resetFileName(String oldFileName) {
        return FileUtil.getPrefix(oldFileName) + StrUtil.DASHED +
                RandomUtil.randomInt(100000) + StrUtil.DOT +
                FileUtil.getSuffix(oldFileName);
    }
}




