/// Vosk 插件的基础异常类
class VoskWakewordException implements Exception {
  final String? message;
  VoskWakewordException([this.message]);

  @override
  String toString() => '$runtimeType: $message';
}

/// 当原生代码无法分配内存时抛出
class VoskWakewordMemoryException extends VoskWakewordException {
  VoskWakewordMemoryException(super.message);
}

/// 当模型文件或IO操作失败时抛出
class VoskWakewordIOException extends VoskWakewordException {
  VoskWakewordIOException(super.message);
}

/// 当传入无效参数时抛出
class VoskWakewordInvalidArgumentException extends VoskWakewordException {
  VoskWakewordInvalidArgumentException(super.message);
}

/// 当状态不正确（例如，未初始化就调用start）时抛出
class VoskWakewordInvalidStateException extends VoskWakewordException {
  VoskWakewordInvalidStateException(super.message);
}

/// 当发生未预期的运行时错误时抛出
class VoskWakewordRuntimeException extends VoskWakewordException {
  VoskWakewordRuntimeException(super.message);
}

/// 将原生端返回的错误码转换为对应的 Exception
Exception voskStatusToException(String code, String? message) {
  switch (code) {
    case 'VoskWakewordMemoryException':
      return VoskWakewordMemoryException(message);
    case 'VoskWakewordIOException':
      return VoskWakewordIOException(message);
    case 'VoskWakewordInvalidArgumentException':
      return VoskWakewordInvalidArgumentException(message);
    case 'VoskWakewordInvalidStateException':
      return VoskWakewordInvalidStateException(message);
    case 'VoskWakewordRuntimeException':
      return VoskWakewordRuntimeException(message);
    default:
      return VoskWakewordException("Unexpected error: $code, message: $message");
  }
}