// Copyright 2025-present 650 Industries. All rights reserved.

#import <Foundation/Foundation.h>

// Enum mirroring worklets::Serializable::ValueType for Swift exposure
typedef NS_ENUM(NSInteger, EXSerializableValueType) {
  EXSerializableValueTypeUndefined = 0,
  EXSerializableValueTypeNull = 1,
  EXSerializableValueTypeBoolean = 2,
  EXSerializableValueTypeNumber = 3,
  EXSerializableValueTypeBigInt = 4,
  EXSerializableValueTypeString = 5,
  EXSerializableValueTypeObject = 6,
  EXSerializableValueTypeArray = 7,
  EXSerializableValueTypeMap = 8,
  EXSerializableValueTypeSet = 9,
  EXSerializableValueTypeWorklet = 10,
  EXSerializableValueTypeRemoteFunction = 11,
  EXSerializableValueTypeHandle = 12,
  EXSerializableValueTypeHostObject = 13,
  EXSerializableValueTypeHostFunction = 14,
  EXSerializableValueTypeArrayBuffer = 15,
  EXSerializableValueTypeTurboModuleLike = 16,
  EXSerializableValueTypeImport = 17,
  EXSerializableValueTypeSynchronizable = 18,
  EXSerializableValueTypeCustom = 19,
} NS_SWIFT_NAME(SerializableValueType);

NS_SWIFT_NAME(JavaScriptSerializable)
@interface EXJavaScriptSerializable : NSObject

@property (nonatomic, readonly) EXSerializableValueType valueType;

// Opaque handle wrapping a `shared_ptr<worklets::Serializable>`, owned by the
// adapter pod. Nil when the adapter isn't linked.
@property (nonatomic, strong, readonly, nullable) id handle;

- (nonnull instancetype)initWithHandle:(nullable id)handle
                             valueType:(EXSerializableValueType)valueType;

@end
