package com.ema.admin.modules.system.service.impl;

import com.ema.admin.modules.system.converter.SysFileConverter;
import com.ema.admin.modules.system.entity.SysFile;
import com.ema.admin.modules.system.service.SysFileService;
import com.ema.common.exceptions.MyAssert;
import lombok.SneakyThrows;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.recorder.FileRecorder;
import org.dromara.x.file.storage.core.upload.FilePartInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 文件信息记录器
 * @author lijian
 */
@Service
public class SysFileRecorderServiceImpl implements FileRecorder {

    @Resource
    private SysFileService sysFileService;
    @Resource
    private SysFileConverter sysFileConverter;
    
    /**
     * 保存文件信息到数据库
     */
    @SneakyThrows
    @Override
    public boolean save(FileInfo info) {
        SysFile sysFile = sysFileConverter.toSysFile(info);
        boolean save = sysFileService.save(sysFile);
        MyAssert.isTrue(save, "文件信息保存失败");
        info.setId(sysFile.getId());
        return save;
    }

    /**
     * 更新文件记录，可以根据文件 ID 或 URL 来更新文件记录，
     * 主要用在手动分片上传文件-完成上传，作用是更新文件信息
     */
    @SneakyThrows
    @Override
    public void update(FileInfo info) {
        SysFile sysFile = sysFileConverter.toSysFile(info);
        sysFileService.updateById(sysFile);
    }

    /**
     * 根据 url 查询文件信息
     */
    @SneakyThrows
    @Override
    public FileInfo getByUrl(String url) {
        SysFile sysFile = sysFileService.queryChain().eq(SysFile::getUrl, url).one();
        return sysFileConverter.toFileInfo(sysFile);
    }

    /**
     * 根据 url 删除文件信息
     */
    @Override
    public boolean delete(String url) {
        sysFileService.remove(sysFileService.queryChain().eq(SysFile::getUrl, url));
        return true;
    }

    /**
     * 保存文件分片信息
     * @param filePartInfo 文件分片信息
     */
    @Override
    public void saveFilePart(FilePartInfo filePartInfo) {

    }

    /**
     * 删除文件分片信息
     */
    @Override
    public void deleteFilePartByUploadId(String uploadId) {

    }

}
