package com.ycwl.basic.image.pipeline.stages;

import com.ycwl.basic.image.pipeline.core.PhotoProcessContext;
import com.ycwl.basic.image.pipeline.enums.ImageType;
import com.ycwl.basic.pipeline.annotation.StageConfig;
import com.ycwl.basic.pipeline.core.AbstractPipelineStage;
import com.ycwl.basic.pipeline.core.StageResult;
import com.ycwl.basic.pipeline.enums.StageOptionalMode;
import com.ycwl.basic.utils.ImageUtils;
import lombok.extern.slf4j.Slf4j;

import java.io.File;

/**
 * 图像质量检测Stage
 * 检测图片质量，如果检测到质量不佳则动态添加ImageEnhanceStage
 *
 * 此Stage展示了如何在运行时动态添加后续Stage的能力
 */
@Slf4j
@StageConfig(
    stageId = "quality_check",
    optionalMode = StageOptionalMode.SUPPORT,
    description = "图像质量检测",
    defaultEnabled = false  // 默认不启用
)
public class ImageQualityCheckStage extends AbstractPipelineStage<PhotoProcessContext> {

    /**
     * 质量阈值：图片尺寸小于此阈值认为质量不佳
     * 例如：小于100KB的图片可能需要增强
     */
    private static final long QUALITY_THRESHOLD_BYTES = 100 * 1024; // 100KB

    /**
     * 分辨率阈值：图片分辨率低于此值认为质量不佳
     */
    private static final int MIN_WIDTH = 800;
    private static final int MIN_HEIGHT = 600;

    @Override
    public String getName() {
        return "ImageQualityCheckStage";
    }

    @Override
    protected boolean shouldExecuteByBusinessLogic(PhotoProcessContext context) {
        // 仅对普通照片执行质量检测
        return context.getImageType() == ImageType.NORMAL_PHOTO;
    }

    @Override
    protected StageResult<PhotoProcessContext> doExecute(PhotoProcessContext context) {
        File currentFile = context.getCurrentFile();
        if (currentFile == null || !currentFile.exists()) {
            return StageResult.failed("当前文件不存在");
        }

        try {
            // 检查文件大小
            long fileSize = currentFile.length();
            log.debug("图像质量检测: 文件大小={}KB, 阈值={}KB",
                    fileSize / 1024,
                    QUALITY_THRESHOLD_BYTES / 1024);

            boolean needsEnhancement = false;
            String reason = "";

            // 检查：文件大小
            if (fileSize < QUALITY_THRESHOLD_BYTES) {
                needsEnhancement = true;
                reason = String.format("文件过小(%dKB < %dKB)",
                        fileSize / 1024,
                        QUALITY_THRESHOLD_BYTES / 1024);
            }

            // TODO: 可以添加更多质量检测维度
            // 例如：使用BufferedImage读取图片获取分辨率
            // 例如：使用OpenCV进行图片质量评估
            // 例如：检查图片的EXIF信息

            // 如果需要增强，动态添加ImageEnhanceStage
            if (needsEnhancement) {
                log.info("检测到图片质量不佳({}), 动态添加ImageEnhanceStage", reason);

                ImageEnhanceStage enhanceStage = new ImageEnhanceStage();

                // 使用successWithNext返回，动态添加后续Stage
                return StageResult.successWithNext(
                        "质量不佳，添加增强Stage: " + reason,
                        enhanceStage
                );
            }

            // 质量良好，无需增强
            log.info("图像质量良好，无需增强: {}KB", fileSize / 1024);
            return StageResult.success("质量良好，无需增强");

        } catch (Exception e) {
            log.error("图像质量检测失败", e);
            // 检测失败时不影响管线，继续执行
            return StageResult.degraded("质量检测失败: " + e.getMessage());
        }
    }

    /**
     * 示例：也可以根据其他条件动态添加不同的Stage
     */
    @SuppressWarnings("unused")
    private StageResult<PhotoProcessContext> checkAndAddMultipleStages(PhotoProcessContext context) {
        // 示例：根据不同条件添加多个Stage

        // 假设检测到需要多个增强操作
        ImageEnhanceStage enhanceStage = new ImageEnhanceStage();
        // 其他Stage...

        // 可以一次性添加多个Stage
        return StageResult.successWithNext(
                "检测到需要多重处理",
                enhanceStage
                // 可以添加更多Stage
        );
    }
}
