package cd.casic.module.execute.docker.service;

import cd.casic.framework.commons.pojo.PageResult;
import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo;
import cd.casic.module.execute.docker.dataobject.model.DockerImage;
import cd.casic.module.execute.docker.dataobject.vo.DockerImagePageReqVO;
import com.github.dockerjava.api.command.InspectImageResponse;
import com.github.dockerjava.api.model.Image;
import jakarta.annotation.Nonnull;

import java.util.List;

/**
 * @description: 镜像相关服务
 * @author: mianbin
 * @date: 2025/5/26 14:28
 * @version: 1.0
 */
public interface IImageService {
    /**
     * 获取镜像列表
     *
     * @param clientId 那个客户端
     * @return
     */
    List<Image> list(String clientId);

    /**
     * 通过镜像ID获取镜像
     *
     * @param imageId
     * @return
     */
    InspectImageResponse inspect(String clientId, String imageId);

    /**
     * 重新打tag。这个打tag注意
     * hello-world                        hallo-newworld      74cc54e27dc4   4 months ago    10.1kB
     * hello-world                        hallo-newworld1     74cc54e27dc4   4 months ago    10.1kB
     * hello-world                        latest              74cc54e27dc4   4 months ago    10.1kB
     * 类似与上面这样，但是你删除，docker rmi 74cc54e27dc4 ,那这三个全部gg
     *
     * @param imageId 镜像ID
     * @param newTag  新的镜像Tag
     */
    void tag(@Nonnull String clientId, String imageId, String newTag);

    /**
     * 移除镜像
     *
     * @param imageId 镜像ID
     * @param force
     * @return
     */
    void remove(@Nonnull String clientId, String imageId, Boolean force);

    /**
     * 导出镜像
     *
     * @param imageId 镜像ID
     */
    void export(@Nonnull String clientId, String imageId);


    /**
     * 通过文件路径导入镜像导入镜像
     *
     * @param file 文件路径
     */
    void importByFile(@Nonnull String clientId, String file);

    /**
     * 通过Tar文件导入镜像
     *
     * @param file
     */
    void importByTar(@Nonnull String clientId, String file);

    /**
     * @param imageId
     */
    boolean exist(@Nonnull String clientId, String imageId);

    /**
     * 清理镜像
     */
    void pruneImage(@Nonnull String clientId);

    /**
     * 镜像保存
     *
     * @return
     */
    Boolean save(@Nonnull String clientId, String imageId, String outputPath);

    /**
     * 推送保存，如果你想推送镜像，需要在配置文件中修改镜像仓库
     * 1： 如果你还想修改名字，或者鉴权，在这里修改
     * dockerClient.pushImageCmd(imageId)
     * .withTag("new-tag")
     * .withname("new-name")
     * .withAuthConfig(authConfig).exec();
     * 2：如果做了以上操作，需要新增接口或者自己封装
     *
     * @return
     */
    Boolean pushImage(@Nonnull String clientId, String imageId);

    int localImageUpload(DockerImage dockerImage);

    PageResult<DockerImageDo> getLocalImagePage(DockerImagePageReqVO pageVO);

    Boolean localImagePush(String imageId, String machineId);
}
