// tsn_abi.h - TSN 编译器 DLL 接口
// 用于 loader 直接调用 ts-native 编译 TypeScript

#ifndef TSN_ABI_H
#define TSN_ABI_H

#include <stdint.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

// === 符号条目 ===
typedef struct {
    uint8_t  section;      // 0=.text, 1=.data, 2=.rdata, 255=external
    uint32_t offset;       // 在节区内的偏移
    char     name[64];     // 符号名称（null 结尾）
} TsnSymbol;

// === 重定位条目 ===
typedef struct {
    uint8_t  section;      // 节区索引
    uint32_t offset;       // 需要重定位的位置
    uint8_t  type_;        // 0=REL32, 1=ADDR64
    uint8_t  _padding;     // 对齐填充
    char     target_name[64]; // 目标符号名称（字符串形式）
} TsnRelocation;

// === 编译结果 ===
typedef struct {
    // 代码节区
    uint8_t*  code_ptr;
    uint32_t  code_len;

    // 数据节区
    uint8_t*  data_ptr;
    uint32_t  data_len;

    // 只读数据节区
    uint8_t*  rdata_ptr;
    uint32_t  rdata_len;

    // 符号表
    TsnSymbol* symbols;
    uint32_t   symbol_count;

    // 重定位表
    TsnRelocation* relocations;
    uint32_t       reloc_count;

    // 错误信息（如果有）
    char*     error_msg;
    uint32_t  error_line;      // 错误行号（0=未知）
    uint32_t  error_col;       // 错误列号（0=未知）
    char*     error_context;   // 错误上下文（最后60字符）

    // 内部使用：Rust 分配的内存上下文，用于释放
    void*     _context;
} TsnCompileResult;

// === DLL 导出函数 ===

/// 编译 TypeScript 源代码为 TSN 模块
/// @param source - TypeScript 源代码字符串（UTF-8，null 结尾）
/// @return 编译结果，调用者需要使用 tsn_free_result 释放
__declspec(dllexport) TsnCompileResult* tsn_compile(const char* source);

/// 编译 TypeScript 源代码为标准 COFF .obj 字节流
/// @param source - TypeScript 源代码字符串
/// @param out_len - 输出 COFF 数据长度（写入）
/// @return 指向 COFF 字节流的指针，需要用 tsn_free_coff 释放
__declspec(dllexport) uint8_t* tsn_compile_coff(const char* source, uint32_t* out_len);

/// 释放编译结果
/// @param result - tsn_compile 返回的指针
__declspec(dllexport) void tsn_free_result(TsnCompileResult* result);

/// 释放 COFF 字节流
/// @param ptr - tsn_compile_coff 返回的指针
/// @param len - COFF 数据长度
__declspec(dllexport) void tsn_free_coff(uint8_t* ptr, uint32_t len);

/// 获取版本信息
__declspec(dllexport) const char* tsn_version(void);

#ifdef __cplusplus
}
#endif

#endif // TSN_ABI_H
