package com.njcn.gather.icd.service.support;

import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.gather.icd.pojo.enums.IcdResponseEnum;
import com.njcn.gather.icd.pojo.po.PqIcdPath;
import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@Component
public class IcdArchiveBuilder {

    public byte[] build(PqIcdPath item) {
        if (item == null || item.getIcd() == null || item.getIcd().length == 0) {
            throw new BusinessException(IcdResponseEnum.ICD_FILE_NOT_FOUND);
        }
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
             ZipOutputStream zos = new ZipOutputStream(bos, StandardCharsets.UTF_8)) {
            writeTextEntry(zos, item.getName() + ".json", item.getJsonStr());
            writeTextEntry(zos, item.getName() + ".xml", item.getXmlStr());
            writeBinaryEntry(zos, item.getName() + ".icd", item.getIcd());
            zos.finish();
            return bos.toByteArray();
        } catch (IOException ex) {
            throw new BusinessException(IcdResponseEnum.ICD_EXPORT_FAILED);
        }
    }

    /**
     * 向ZIP流中写入文本条目
     *
     * @param zos   ZIP输出流
     * @param name  条目名称（文件路径）
     * @param value 文本内容，如果为null则写入空字节数组
     * @throws IOException 写入异常
     */
    private void writeTextEntry(ZipOutputStream zos, String name, String value) throws IOException {
        // 将文本转换为UTF-8编码的字节数组，null值转换为空数组
        writeBinaryEntry(zos, name, value == null ? new byte[0] : value.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 向ZIP流中写入二进制条目
     *
     * @param zos  ZIP输出流
     * @param name 条目名称（文件路径）
     * @param data 二进制数据
     * @throws IOException 写入异常
     */
    private void writeBinaryEntry(ZipOutputStream zos, String name, byte[] data) throws IOException {
        // 创建新的ZIP条目并设置文件名
        zos.putNextEntry(new ZipEntry(name));
        // 写入二进制数据
        zos.write(data);
        // 关闭当前条目，准备写入下一个条目
        zos.closeEntry();
    }
}
