///|
/// ofd-invoice CLI 入口
/// 用法: ofd-invoice  [-i N]
fn main {
  let argv = @sys.get_cli_args()
  let args = if argv.length() > 1 { argv[1:].to_array() } else { [] }
  match run(args) {
    Ok(json) => println(json)
    Err(msg) => {
      println(msg)
      @sys.exit(1)
    }
  }
}

///|
/// 解析参数 → 读取文件 → 解包 → 解析 → 提取发票 → JSON
fn run(argv : Array[String]) -> Result[String, String] {
  let config = parse_config(argv[:]) catch {
    e =>
      return Err(
        "参数错误: " + e.to_string() + "\n" + command().render_help(),
      )
  }
  let data = @fs.read_file_to_bytes(config.file) catch {
    _ => return Err("无法读取文件: " + config.file)
  }
  let port = @adaptor.MooncakeOfdPort::from_bytes(data) catch {
    e => return Err("OFD 解包失败: " + e.to_string())
  }
  let reader = match @reader.OfdReader::open(port) {
    Ok(r) => r
    Err(e) => return Err("OFD 解析失败: " + e.to_string())
  }
  match @invoice.extract_invoice(reader) {
    Ok(inv) => Ok(@invoice.invoice_to_json(inv))
    Err(e) => Err("发票提取失败: " + e.to_string())
  }
}