package com.rj.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.rj.controller.TextModelController;
import com.rj.entity.ImageModel;

import java.util.Map;

/**
 * 图像模型服务接口
 * 
 * 提供图像模型相关的业务逻辑接口，包括：
 * - 图像模型记录的增删改查操作
 * - 根据不同条件查询图像模型记录
 * - 图像模型数据的业务处理逻辑
 * 
 * 继承MyBatis-Plus的IService接口，获得基础的CRUD能力，
 * 同时定义特定的业务方法。
 * 
 * @author 系统生成
 * @date 2025/1/30
 * @version 1.0
 */
public interface IImageModelService extends IService<ImageModel> {
    
    /**
     * 保存图像模型记录
     * 
     * 将图像模型数据保存到数据库中，包括完整的业务逻辑处理。
     * 该方法会进行数据验证、日志记录等操作。
     * 
     * @param imageModel 图像模型记录对象，包含所有必要的字段信息
     * @return 是否保存成功，true表示保存成功，false表示保存失败
     */
    boolean saveImageModel(ImageModel imageModel);
    
    /**
     * 根据UUID查询图像模型记录
     * 
     * 通过唯一标识符查询对应的图像模型记录。
     * UUID是主键，查询结果唯一。
     * 
     * @param uuid 唯一标识符，对应数据库主键
     * @return 图像模型记录，如果未找到则返回null
     */
    ImageModel getByUuid(String uuid);
    
    /**
     * 根据请求ID查询图像模型记录
     * 
     * 通过请求ID查询对应的图像模型记录。
     * 一个请求ID可能对应多条记录，此方法返回最新的一条。
     * 
     * @param requestId 请求ID，用于追踪处理请求
     * @return 图像模型记录，如果未找到则返回null
     */
    ImageModel getByRequestId(String requestId);
    
    /**
     * 根据任务ID查询图像模型记录
     * 
     * 通过任务ID查询对应的图像模型记录。
     * 一个任务ID可能对应多条记录，此方法返回最新的一条。
     * 
     * @param taskId 任务ID，用于追踪异步处理任务
     * @return 图像模型记录，如果未找到则返回null
     */
    ImageModel getByTaskId(String taskId);
    
    /**
     * 根据所属人电话查询图像模型记录
     * 
     * 通过所属人电话查询对应的图像模型记录。
     * 一个电话号码可能对应多条记录，此方法返回最新的一条。
     * 
     * @param ownerPhone 所属人电话，用于查询特定用户的记录
     * @return 图像模型记录，如果未找到则返回null
     */
    ImageModel getByOwnerPhone(String ownerPhone);
    
    /**
     * 去除图像中的中英文字符或常见水印
     * 
     * 处理图像去除水印的业务逻辑，包括：
     * - 图像预处理和参数设置
     * - 调用AI模型进行水印去除
     * - 结果处理和URL生成
     * - 记录保存和状态更新
     * 
     * @param imageModel 图像模型记录对象，包含处理参数和结果信息
     * @return 处理后的图像模型记录，包含结果URL等信息
     */
    ImageModel removeWatermar(ImageModel imageModel);
    
    /**
     * 上传图片素材
     * 
     * 处理图片素材上传的完整业务逻辑，包括：
     * - 文件验证和格式检查（根据阿里云参数要求）
     * - 上传到MinIO存储
     * - 生成永久URL和临时URL
     * - 保存上传记录到数据库
     * 
     * @param file 上传的图片文件
     * @param ownerName 所属人姓名
     * @param ownerPhone 所属人电话
     * @param imageType 图片类型（base_image主体图像 或 ref_image引导图像）
     * @param imageName 图像名称
     * @return 图像模型记录，包含上传结果和URL信息
     */
    ImageModel uploadImageMaterial(org.springframework.web.multipart.MultipartFile file, 
                                   String ownerName, String ownerPhone, String imageType, String imageName);

    /**
     * 上传引导图像
     * 
     * 专门用于上传引导图像的方法，自动转换为带透明背景的RGBA四通道图像
     * 支持常见图像格式（JPG、PNG、GIF、BMP、WEBP），系统会自动转换为RGBA格式
     * 
     * @param file 上传的引导图像文件
     * @param ownerName 所属人姓名
     * @param ownerPhone 所属人电话
     * @param imageName 图像名称
     * @return 图像模型记录，包含上传结果和URL信息
     */
    ImageModel uploadRefImage(org.springframework.web.multipart.MultipartFile file, 
                              String ownerName, String ownerPhone, String imageName);

    /**
     * 图像处理（支持主体图像和引导图像）
     * 
     * 根据阿里云图像参数要求进行图像处理：
     * - base_image_url: 主体图像URL（必选，PNG格式，RGBA四通道，长边不超过2048像素）
     * - ref_image_url: 引导图像URL（可选，JPG/PNG/WEBP格式）
     * 
     * @param baseImageModel 主体图像模型记录
     * @param refImageModel 引导图像模型记录（可选）
     * @param prompt 处理提示词
     * @param functionName 功能名称
     * @return 处理后的图像模型记录
     */
    ImageModel processImageWithRef(ImageModel baseImageModel, ImageModel refImageModel, 
                                  String prompt, String functionName);

    boolean removeByUuid(String uuid);
    
    /**
     * 文本生成图像
     * 
     * 根据文本提示词生成图像，包括：
     * - 调用AI图像生成服务
     * - 处理生成结果
     * - 保存生成记录
     * 
     * @param request 文本生成图像请求参数
     * @return 生成结果，包含图像URL等信息
     */
    Map<String, Object> generateImageByText(TextModelController.ImageProcessingRequest request);
    
    /**
     * 图生图
     * 
     * 根据图片和指令生成新图片，包括：
     * - 验证API Key和参数
     * - 构建请求体
     * - 调用阿里云图生图API
     * - 处理异步响应
     * - 返回任务信息
     * 
     * @param multipartFile 上传的图片文件
     * @param refPrompt 参考提示词
     * @param ownerName 所属人姓名
     * @param ownerPhone 所属人电话
     * @param imageName 图片名称
     * @param model 模型名称，默认为wanx-v1
     * @param parameters 参数字符串（JSON格式）
     * @return 生成结果，包含任务ID等信息
     */
    Map<String, Object> generateImageToImage(org.springframework.web.multipart.MultipartFile multipartFile,
                                           String refPrompt, String ownerName, String ownerPhone, 
                                           String imageName, String model, String parameters);
}
