package net.yyc.common.core.util;

import lombok.experimental.UtilityClass;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.IOException;
import java.net.URI;

/**
 * {@code Base64Utils}
 * <p>
 * base64工具类
 *
 * @author Hengchen.Sun
 * @version 1.0.0
 * @date 2022/03/08 14:42
 */
@UtilityClass
public class Base64Utils {

    /**
     * 把图片转换为 Base64 编码的字符串
     * 图片的格式为 data:image/png;base64,iVBORw0KGgoAAAA...
     *
     * @param imagePath 图片的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeImage(String imagePath) throws IOException {

        String suffix = FilenameUtils.getExtension(imagePath).toLowerCase();
        byte[] content = FileUtils.readFileToByteArray(new File(imagePath));
        return String.format("data:image/%s;base64,%s", suffix, Base64.encodeBase64String(content));
    }

    /**
     * 把图片转换为 Base64 编码的字符串
     * 图片的格式为 data:image/png;base64,iVBORw0KGgoAAAA...
     *
     * @param uri 图片的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeImageWithPrefix(URI uri) throws IOException {

        String suffix = FilenameUtils.getExtension(uri.toString()).toLowerCase();
        byte[] content = IOUtils.toByteArray(uri);
        return String.format("data:image/%s;base64,%s", suffix, encodeImage(uri));
    }

    /**
     * 把图片转换为 Base64 编码的字符串
     * 图片的格式为 iVBORw0KGgoAAAA...
     *
     * @param uri 图片的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeImage(URI uri) throws IOException {

        byte[] content = IOUtils.toByteArray(uri);
        return  Base64.encodeBase64String(content);
    }


    /**
     * 把视频转换为 Base64 编码的字符串
     * 图片的格式为 data:video/mp4;base64,iVBORw0KGgoAAAA...
     *
     * @param videoPath 视频的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeVideo(String videoPath) throws IOException {

        String suffix = FilenameUtils.getExtension(videoPath).toLowerCase();
        byte[] content = FileUtils.readFileToByteArray(new File(videoPath));
        return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
    }

    /**
     * 把视频转换为 Base64 编码的字符串
     * 图片的格式为 data:video/mp4;base64,iVBORw0KGgoAAAA...
     *
     * @param file 视频
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeVideo(File file) throws IOException {

        String suffix = FilenameUtils.getExtension(file.getAbsolutePath()).toLowerCase();
        byte[] content = FileUtils.readFileToByteArray(file);
        return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
    }

    /**
     * 把视频转换为 Base64 编码的字符串
     * 图片的格式含前缀为 data:video/mp4;base64,iVBORw0KGgoAAAA...
     * 图片的格式不含前缀为 iVBORw0KGgoAAAA...
     *
     * @param file          视频
     * @param containPrefix 是否包含前缀
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeVideo(File file, Boolean containPrefix) throws IOException {
        byte[] content = FileUtils.readFileToByteArray(file);

        if (containPrefix) {
            String suffix = FilenameUtils.getExtension(file.getAbsolutePath()).toLowerCase();
            return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));

        }

        return Base64.encodeBase64String(content);
    }

    /**
     * 把视频转换为 Base64 编码的字符串
     * 图片的格式为 data:video/mp4;base64,iVBORw0KGgoAAAA...
     *
     * @param uri 视频的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeVideo(URI uri) throws IOException {

        String suffix = FilenameUtils.getExtension(uri.toString()).toLowerCase();
        byte[] content = IOUtils.toByteArray(uri);
        return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
    }

    /**
     * 把视频转换为 Base64 编码的字符串
     * 图片的格式包含前缀为 data:video/mp4;base64,iVBORw0KGgoAAAA...
     * 图片的格式不含前缀为 iVBORw0KGgoAAAA...
     *
     * @param uri 视频的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodeVideo(URI uri, Boolean containPrefix) throws IOException {

        byte[] content = IOUtils.toByteArray(uri);

        if (containPrefix) {
            String suffix = FilenameUtils.getExtension(uri.toString()).toLowerCase();
            return String.format("data:video/%s;base64,%s", suffix, Base64.encodeBase64String(content));
        }

        return Base64.encodeBase64String(content);
    }

    /**
     * 把pdf转换为 Base64 编码的字符串
     * 格式为 data:application/pdf;base64,iVBORw0KGgoAAAA...
     *
     * @param pdfPath pdf的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodePDFWithPrefix(String pdfPath) throws IOException {

        return String.format("data:application/pdf;base64,%s", encodePDF(pdfPath));
    }

    /**
     * 把pdf转换为 Base64 编码的字符串
     * 格式为 iVBORw0KGgoAAAA...
     *
     * @param pdfPath pdf的路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodePDF(String pdfPath) throws IOException {

        byte[] content = FileUtils.readFileToByteArray(new File(pdfPath));
        return Base64.encodeBase64String(content);
    }

    /**
     * 把pdf转换为 Base64 编码的字符串
     * 格式为 data:application/pdf;base64,iVBORw0KGgoAAAA...
     *
     * @param uri pdf路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodePDFWhithPrefix(URI uri) throws IOException {

        return String.format("data:application/pdf;base64,%s", encodePDF(uri));
    }

    /**
     * 把pdf转换为 Base64 编码的字符串
     * 格式为 iVBORw0KGgoAAAA...
     *
     * @param uri pdf路径
     * @return 返回图片的 Base64 编码的字符串
     * @throws IOException 异常
     */
    public static String encodePDF(URI uri) throws IOException {

        byte[] content = IOUtils.toByteArray(uri);
        return Base64.encodeBase64String(content);
    }


}
