package com.moka.gdtauto.util;

import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * 图片水印工具类
 * 用于在图片左上角添加文字水印（如剧名）
 *
 * @author moka
 */
@Slf4j
public class ImageWatermarkUtil {

    /**
     * 在图片左上角添加文字水印
     *
     * @param inputImagePath  输入图片路径
     * @param outputImagePath 输出图片路径
     * @param watermarkText   水印文字（如：《绝世龙王》）
     * @throws IOException IO异常
     */
    public static void addWatermark(String inputImagePath, String outputImagePath, String watermarkText) throws IOException {
        addWatermark(inputImagePath, outputImagePath, watermarkText, 40, 50, 50);
    }

    /**
     * 在图片左上角添加文字水印（可自定义位置和字体大小）
     *
     * @param inputImagePath  输入图片路径
     * @param outputImagePath 输出图片路径
     * @param watermarkText   水印文字（如：《绝世龙王》）
     * @param fontSize        字体大小
     * @param x               水印X坐标（从左边距）
     * @param y               水印Y坐标（从顶部距）
     * @throws IOException IO异常
     */
    public static void addWatermark(String inputImagePath, String outputImagePath, 
                                   String watermarkText, int fontSize, int x, int y) throws IOException {
        log.info("开始为图片添加水印, 输入路径: {}, 输出路径: {}, 水印文字: {}", inputImagePath, outputImagePath, watermarkText);
        
        // 读取原始图片
        BufferedImage originalImage = ImageIO.read(new File(inputImagePath));
        
        // 创建Graphics2D对象
        Graphics2D g2d = originalImage.createGraphics();
        
        // 设置抗锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        
        // 设置字体（使用系统默认黑体或宋体）
        Font font = new Font("Microsoft YaHei", Font.BOLD, fontSize);
        g2d.setFont(font);
        
        // 设置颜色和透明度
        g2d.setColor(new Color(255, 255, 255, 230)); // 白色，透明度230
        
        // 添加阴影效果（描边）
        g2d.setStroke(new BasicStroke(2));
        
        // 绘制黑色描边
        g2d.setColor(new Color(0, 0, 0, 180));
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                g2d.drawString(watermarkText, x + i, y + j);
            }
        }
        
        // 绘制白色文字
        g2d.setColor(new Color(255, 255, 255, 230));
        g2d.drawString(watermarkText, x, y);
        
        // 释放资源
        g2d.dispose();
        
        // 保存图片
        File outputFile = new File(outputImagePath);
        File parentDir = outputFile.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            parentDir.mkdirs();
        }
        
        String formatName = getImageFormat(outputImagePath);
        ImageIO.write(originalImage, formatName, outputFile);
        
        log.info("图片水印添加成功，保存到: {}", outputImagePath);
    }

    /**
     * 使用Thumbnailator库添加水印（支持压缩）
     *
     * @param inputImagePath  输入图片路径
     * @param outputImagePath 输出图片路径
     * @param watermarkText   水印文字
     * @param scale           缩放比例（1.0表示不缩放）
     * @throws IOException IO异常
     */
    public static void addWatermarkWithCompression(String inputImagePath, String outputImagePath, 
                                                  String watermarkText, double scale) throws IOException {
        log.info("开始为图片添加水印（压缩模式）, 缩放比例: {}", scale);
        
        // 读取原始图片
        BufferedImage originalImage = ImageIO.read(new File(inputImagePath));
        
        // 添加水印
        Graphics2D g2d = originalImage.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        
        Font font = new Font("Microsoft YaHei", Font.BOLD, 40);
        g2d.setFont(font);
        
        // 黑色描边
        g2d.setColor(new Color(0, 0, 0, 180));
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                g2d.drawString(watermarkText, 50 + i, 50 + j);
            }
        }
        
        // 白色文字
        g2d.setColor(new Color(255, 255, 255, 230));
        g2d.drawString(watermarkText, 50, 50);
        g2d.dispose();
        
        // 使用Thumbnailator压缩并保存
        Thumbnails.of(originalImage)
                .scale(scale)
                .outputQuality(0.9)
                .toFile(outputImagePath);
        
        log.info("图片水印添加成功（已压缩），保存到: {}", outputImagePath);
    }

    /**
     * 在内存中为BufferedImage添加文字水印
     *
     * @param originalImage 原始图片
     * @param watermarkText 水印文字（如：《绝世龙王》）
     * @param fontSize      字体大小
     * @param x             水印X坐标（从左边距）
     * @param y             水印Y坐标（从顶部距）
     * @return 添加水印后的图片
     */
    public static BufferedImage addWatermarkInMemory(BufferedImage originalImage, 
                                                      String watermarkText, int fontSize, int x, int y) {
        log.info("开始在内存中添加水印, 水印文字: {}", watermarkText);
        
        // 创建Graphics2D对象
        Graphics2D g2d = originalImage.createGraphics();
        
        // 设置抗锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        
        // 设置字体（使用系统默认黑体或宋体）
        Font font = new Font("Microsoft YaHei", Font.BOLD, fontSize);
        g2d.setFont(font);
        
        // 设置颜色和透明度
        g2d.setColor(new Color(255, 255, 255, 230)); // 白色，透明度230
        
        // 添加阴影效果（描边）
        g2d.setStroke(new BasicStroke(2));
        
        // 绘制黑色描边
        g2d.setColor(new Color(0, 0, 0, 180));
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                g2d.drawString(watermarkText, x + i, y + j);
            }
        }
        
        // 绘制白色文字
        g2d.setColor(new Color(255, 255, 255, 230));
        g2d.drawString(watermarkText, x, y);
        
        // 释放资源
        g2d.dispose();
        
        log.info("内存水印添加成功");
        return originalImage;
    }

    /**
     * 在内存中为图片字节数组添加文字水印
     *
     * @param imageBytes    原始图片字节数组
     * @param watermarkText 水印文字（如：《绝世龙王》）
     * @param fontSize      字体大小
     * @param x             水印X坐标（从左边距）
     * @param y             水印Y坐标（从顶部距）
     * @return 添加水印后的图片
     * @throws IOException IO异常
     */
    public static BufferedImage addWatermarkInMemory(byte[] imageBytes, 
                                                      String watermarkText, int fontSize, int x, int y) throws IOException {
        log.info("从字节数组加载图片并添加水印");
        
        // 从字节数组读取图片
        try (InputStream inputStream = new ByteArrayInputStream(imageBytes)) {
            BufferedImage originalImage = ImageIO.read(inputStream);
            if (originalImage == null) {
                throw new IOException("无法解析图片数据");
            }
            return addWatermarkInMemory(originalImage, watermarkText, fontSize, x, y);
        }
    }

    /**
     * 获取图片格式
     */
    private static String getImageFormat(String filePath) {
        String extension = filePath.substring(filePath.lastIndexOf(".") + 1).toLowerCase();
        switch (extension) {
            case "jpg":
            case "jpeg":
                return "jpg";
            case "png":
                return "png";
            case "gif":
                return "gif";
            case "bmp":
                return "bmp";
            default:
                return "jpg";
        }
    }
}
