package com.ai.da.service;

import com.ai.da.common.enums.CreditsEventsEnum;
import com.ai.da.mapper.primary.entity.CollectionSort;
import com.ai.da.mapper.primary.entity.Generate;
import com.ai.da.mapper.primary.entity.GenerateDetail;
import com.ai.da.mapper.primary.entity.PoseTransformation;
import com.ai.da.model.dto.*;
import com.ai.da.model.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;

import java.io.IOException;
import java.util.List;
import java.util.Map;

public interface GenerateService extends IService<Generate> {

    GenerateCaptionVO generateCaption(Long sketchElementId);

    void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO);

    void processGenerateResult(String taskId, String url, String category);

    void processToProductImageResult(String taskId, String url, String category);

    void updateToProductTaskStatus(String taskId, String status);

    GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO);

    Boolean generateDislike(Long generateDetailId, String timeZone);

    void updateLikeStatusBatch(List<Long> generateDetailIdList, Byte hasLike, Long libraryId, String timeZone);

    List<GenerateDetail> selectBatchByLibraryId(List<Long> libraryId);

//    GenerateCollectionVO getGenerateResult(String uniqueId);

    List<GenerateResultVO> getGenerateResultList(List<String> taskIdList);

    PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO);

    Long getRankPosition(String uniqueId);

    void cancelGenerate(Long userId, List<String> uniqueId, String timeZone, String type);

    void processRelightResult(String taskId, String url, String category);

    List<Map<String, Object>> getCountByUserAndTime(String startTime, String endTime, List<Long> accountIdList);

    GenerateResultVO imageToSketch(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, Long projectId);

    String imageToSketchAsync(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, Long projectId);

    GenerateResultVO modifySketch(GenerateModifyDTO generateModifyDTO);

    ToProductImageResultVO poseTransform(PoseTransformDTO poseTransformDTO);

    void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl);

    void processPTFailSituation(String taskId);

    void sendSysMsgForPT(PoseTransformation poseTransformation);

    List<PoseTransformationVO> getPoseTransformationResult(List<String> taskIdList, Long projectId, Boolean like);

    void updatePoseTransferStatus(String taskId, String status, PoseTransformation poseTransformation);

    CollectionSort disOrLikePose(Long transformedId, String likeOrDislike, Long projectId, Long sortLikeParentId);

    String modifyModelProportion(ModifyModelProportionDTO proportionDTO);

    GenerateResultVO sketchReconstructionGenerate(SketchReconstructionDTO sketchReconstructionDTO);

    SketchReconstructionVO getSketchReconstruction(Long projectId);

    List<Map<String, String>> getAllPose();

    void processPoseTransformResultBatch(String taskId, String gifUrl, String videoUrl, String imageUrl, String progress);

    void processPoseTransformResultBatch(String taskId, String progress);

    void deleteGeneratedPose(Long projectId, Long id);

    String createAsyncTask(GenerateThroughImageTextDTO generateThroughImageTextDTO);

    GenerateResultVO getAsyncTaskResult(String taskId);

    String animateAnyone(PoseTransformDTO poseTransformDTO, Long accountId);

    String getVideoTemplateId(String videoPath);

    PoseTransformationVO getAnimateResult(String taskId);

    String reimagineFreePik(String path, String prompt, String style) throws IOException;

    String getImageDescription(String imagePath);

    String flux(CreditsEventsEnum func, String prompt, String imagePath, boolean childStyle);

    String getFluxResult(String taskId, String objectName);

    byte[] downloadVideoOrImage(String url);

    String createGoogleAsyncTask(GenerateThroughImageTextDTO generateDTO, String useModel, String prompt);

    String toProductAsyncTask(String imagePath, String useModel, String prompt);
}
