// cmd/main/main.mbt
//
// 命令行入口:读 .flac 文件 → 解码 → 输出 WAV。

///|
/// 解码 + 写 WAV;FlacError 在此折叠为可读错误消息。
fn decode_and_write(data : Bytes, output : String) -> Unit {
  try {
    let file = @moonflac.decode(data)
    let frames = if file.channels.length() > 0 {
      file.channels[0].length()
    } else {
      0
    }
    println(
      "采样率: \{file.info.sample_rate} Hz, 声道: \{file.info.channels}, 位深: \{file.info.bits_per_sample}, 样本: \{frames}",
    )
    let wav = @moonflac.wav_encode(
      file.channels,
      file.info.bits_per_sample,
      file.info.sample_rate,
    )
    @fs.write_bytes_to_file(output, wav)
    println("已写入: \{output}")
  } catch {
    e => println("解码失败: \{e}")
  }
}

///|
fn main {
  let args = @env.args()
  // 各后端 argv 形状不同:wasm-gc/native 是 [程序, 输入, 输出],
  // js 是 [node, 脚本.js, 输入, 输出]——跳过程序路径后取参数。
  let mut base = 1
  if base < args.length() && args[base].has_suffix(".js") {
    base += 1
  }
  if base >= args.length() {
    println("用法: moon run cmd/main --  [output.wav]")
    return
  }
  let input = args[base]
  let output = if base + 1 < args.length() {
    args[base + 1]
  } else {
    "\{input}.wav"
  }
  try {
    let data = @fs.read_file_to_bytes(input)
    decode_and_write(data, output)
  } catch {
    @fs.IOError::IOError(msg) => println("I/O 错误: \{msg}")
  }
}