package com.njcn.gather.icd.mapping.infrastructure.parser;

import com.njcn.gather.icd.mapping.pojo.bo.icd.IcdDocument;
import com.njcn.gather.icd.mapping.infrastructure.parser.generated.SCL;
import org.springframework.stereotype.Component;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import java.io.ByteArrayInputStream;

/**
 * SCL 解析适配器。
 *
 * 负责把 ICD XML 反序列化为 SCL 根对象，再交给读取器转换为内部模型。
 */
@Component
public class SclParserAdapter {

    /** JAXB generated 模型读取器，负责转成内部 ICD 领域模型。 */
    private final SclGeneratedModelReader modelReader = new SclGeneratedModelReader();

    /**
     * 解析 ICD/SCL XML 字节内容。
     */
    public IcdDocument parse(byte[] content, String fileName) {
        if (content == null || content.length == 0) {
            throw new IllegalArgumentException("ICD 文件内容不能为空");
        }
        try {
            JAXBContext context = JAXBContext.newInstance(SCL.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Object raw = unmarshaller.unmarshal(new ByteArrayInputStream(content));
            SCL scl = resolveSclRoot(raw);
            return modelReader.read(scl, fileName);
        } catch (Exception ex) {
            throw new IllegalArgumentException("ICD 解析失败：" + ex.getMessage(), ex);
        }
    }

    /**
     * 兼容 JAXB 直接返回 SCL 或 JAXBElement<SCL> 两种根对象形式。
     */
    private SCL resolveSclRoot(Object raw) {
        if (raw instanceof SCL) {
            return (SCL) raw;
        }
        if (raw instanceof JAXBElement) {
            Object value = ((JAXBElement<?>) raw).getValue();
            if (value instanceof SCL) {
                return (SCL) value;
            }
        }
        throw new IllegalArgumentException("ICD 根节点不是 SCL");
    }
}
