package tech.easyflow.skill.imports;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tech.easyflow.common.web.exceptions.BusinessException;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * 已完整构建并校验的 Skill 导出临时产物。
 */
public final class SkillExportArtifact implements AutoCloseable {

    private static final Logger LOG = LoggerFactory.getLogger(SkillExportArtifact.class);

    private final Path path;
    private final String fileName;
    private final String mediaType;

    /**
     * 创建导出产物。
     *
     * @param path 临时文件
     * @param fileName 下载文件名
     * @param mediaType 媒体类型
     */
    public SkillExportArtifact(Path path, String fileName, String mediaType) {
        this.path = path;
        this.fileName = fileName;
        this.mediaType = mediaType;
    }

    /**
     * 获取下载文件名。
     *
     * @return 文件名
     */
    public String getFileName() {
        return fileName;
    }

    /**
     * 获取媒体类型。
     *
     * @return 媒体类型
     */
    public String getMediaType() {
        return mediaType;
    }

    /**
     * 将已完成产物传输到响应流。
     *
     * @param outputStream 输出流
     */
    public void transferTo(OutputStream outputStream) {
        try (java.io.InputStream input = Files.newInputStream(path)) {
            input.transferTo(outputStream);
            outputStream.flush();
        } catch (IOException exception) {
            LOG.error("输出 Skill 导出文件失败，path={}", path, exception);
            throw new BusinessException(500, 500, "输出 Skill 导出文件失败", exception);
        }
    }

    /**
     * 清理临时产物。
     */
    @Override
    public void close() {
        try {
            Files.deleteIfExists(path);
        } catch (IOException exception) {
            LOG.warn("清理 Skill 导出临时产物失败，path={}", path, exception);
        }
    }
}
