package com.ruoyi.system.service;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.img.Img;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.ByteBuffer;
import java.util.Calendar;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.ruoyi.common.utils.IdUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * <pre>
 * - 本地文件保存服务
 * Author : J.L.Zhou
 * E-Mail : 2233875735@qq.com
 * Tel : 151 1104 7708
 * Date : 2021-6-1 11:48:16
 * Version : 1.0
 * Copyright 2021 jlzhou.top Inc. All rights reserved.
 * Warning: this content is only for internal circulation of the company.
 *          It is forbidden to divulge it or use it for other commercial purposes.
 * </pre>
 */
public interface FileService {



	/**
	 * - 保存文件,文件名随机
	 *
	 * @param in
	 * @param filename - 原文件名
	 * @param pre      - 存放路径前缀
	 * @return - 保存的文件URL
	 * @throws 400-499
	 */
	default String save(InputStream in, String filename, String pre) {
		return save(in, filename, pre, true);
	}

	/**
	 *
	 * @param in
	 * @param filename   - 原文件名
	 * @param pre        - 存放路径前缀
	 * @param randomName - 是否随机文件名
	 * @return
	 * @throws 400-499
	 */
	default String save(InputStream in, String filename, String pre, boolean randomName) {
		if (StrUtil.isNotBlank(pre) && !pre.matches("^[\\w\\/]+$")) {
			throw new RuntimeException("存放路径前缀只能有单词字符组成");
		}
		try {
			if (in == null || in.available() == 0) {
				throw new RuntimeException("读取上传文件长度错误");
			}
		} catch (IOException e) {
			throw new RuntimeException("读取上传文件长度错误", e);
		}
		if (StrUtil.isEmpty(filename)) {
			throw new RuntimeException("文件名为空");
		}
		filename = filename.replace(" ", "");
		String name = (StrUtil.isNotBlank(pre)?(pre+"/"):"")
				+ generateURI("{yyyy}/{MM}/{dd}/{id36}" + (randomName ? ".{ext}" : "/{filename}.{ext}"), filename);

		return save(in, name);

	}

	String save(InputStream in, String filename);

	/**
	 * - 删除文件
	 *
	 * @param file 文件的URL
	 */
	void delete(String file);

    /**
     * 获取保存的文件对象
     * @param file
     * @return
     */
    File getFile(String file);

	/**
	 * <pre>
	 * - 根据存放规则和文件名生成存放的URI
	 * - 支持
	 * 	- {yyyy}/{MM}/{dd}/{HH}/{mm}/{ss} 年月日时分秒
	 * 	- {UUID} 32位的唯一标志
	 * 	- {id} int类型的唯一id,防止重复建议+年月日路径
	 * 	- {id16} int类型的唯一id16进制表示,防止重复建议+年月日路径
	 * 	- {id36} int类型的唯一id36进制表示,防止重复建议+年月日路径
	 * 	- {filename} 文件基础名称
	 * 	- {ext} 扩展名
	 * </pre>
	 *
	 * @param rule
	 * @param filename
	 * @return
	 */
	default String generateURI(String rule, String filename) {
    return SpringUtils.getBean(ISysOssService.class).generateURI(rule, filename);
	}



}
