package com.gz.service.system.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.gz.config.FileUploadConfig;
import com.gz.core.exception.BusinessException;
import com.gz.core.exception.CustomExceptionEnum;
import com.gz.dto.system.FileDTO;
import com.gz.mapper.system.FileMapper;
import com.gz.rvo.system.FileUploadRVO;
import com.gz.service.system.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * @author LiuchangLan
 * @date 2021/2/28 13:27
 */
@Slf4j
@Service
public class FileServiceImpl implements FileService {

    @Resource
    private FileMapper fileMapper;

    @Override
    public FileDTO upload(MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            throw new BusinessException(CustomExceptionEnum.File_NOT_EXISTS);
        }
        // 上传文件名称
        String fileName = file.getOriginalFilename();
        log.info("上传附件:[{}]", fileName);
        // 当前时间
        Date date = DateUtil.date();
        // 相对路径
        String serverRelativePath = "/" + DateUtil.year(date) + "/" + (DateUtil.month(date) + 1) + "/" + DateUtil.dayOfMonth(date) + "/";
        // 绝对路径
        String serverPath = FileUploadConfig.FILE_ROOT_DIRECTORY + serverRelativePath;
        // 判断路径是否存在
        File serverPathObj = new File(serverPath);
        // 判断路径是否存在
        if (!serverPathObj.exists()) {
            log.info("路径:[{}]不存在，创建路径", serverPath);
            serverPathObj.mkdirs();
        }
        // 文件类型（带点）
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        // 存储在服务器上的文件名
        String serverFileName = IdUtil.simpleUUID().toUpperCase() + fileType;
        // 服务器上文件的路径
        String serverFilePath = serverPath + serverFileName;
        // 创建文件
        File dest = new File(serverFilePath);
        // 上传
        file.transferTo(dest);

        FileDTO fileDTO = new FileDTO();
        fileDTO.setFileName(serverFileName);
        fileDTO.setFileSize(file.getSize());
        fileDTO.setOriginalFileName(fileName);
        fileDTO.setServerFilePath(serverRelativePath + serverFileName);

        fileMapper.insertSelective(fileDTO);
        log.info("文件上传完成,原文件名[{}],服务器地址[{}],现在文件名[{}]", fileName, serverFilePath, serverFileName);
        return fileDTO;
    }
}
