//
//  KBNetworkManager.h
//  CustomKeyboard
//
//  轻量网络层封装（扩展安全）。支持 GET/POST(JSON)。
//  注意：键盘扩展需要"允许完全访问"后才可联网，
//  建议由宿主控制器在确认后调用 `setEnabled:YES` 再发起请求。
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

extern NSErrorDomain const KBNetworkErrorDomain;
typedef NS_ERROR_ENUM(KBNetworkErrorDomain, KBNetworkError) {
    KBNetworkErrorDisabled = 1,   // 未启用网络（例如未开启完全访问）
    KBNetworkErrorInvalidURL = 2,
    KBNetworkErrorInvalidResponse = 3,
    KBNetworkErrorDecodeFailed = 4,
};

/// 简单的 JSON 回调：json 为 NSDictionary/NSArray 或者在非 JSON 情况下返回 NSData
typedef void(^KBNetworkCompletion)(id _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error);

@interface KBNetworkManager : NSObject

/// 单例
+ (instancetype)shared;

/// 是否允许网络（默认为 NO，宿主在合适时机置 YES）
@property (atomic, assign, getter=isEnabled) BOOL enabled;

/// 可选的基础域名，例如 https://api.example.com
@property (nonatomic, strong, nullable) NSURL *baseURL;

/// 全局默认请求头（每次请求会与局部 headers 合并，局部优先）
@property (nonatomic, copy) NSDictionary<NSString *, NSString *> *defaultHeaders;

/// 超时时间（默认 10s）
@property (nonatomic, assign) NSTimeInterval timeout;

/// GET 请求，parameters 会拼到 URL 上
- (nullable NSURLSessionDataTask *)GET:(NSString *)path
                             parameters:(nullable NSDictionary *)parameters
                                headers:(nullable NSDictionary<NSString *, NSString *> *)headers
                              completion:(KBNetworkCompletion)completion;

/// POST JSON 请求，jsonBody 会以 application/json 发送
- (nullable NSURLSessionDataTask *)POST:(NSString *)path
                               jsonBody:(nullable id)jsonBody
                                headers:(nullable NSDictionary<NSString *, NSString *> *)headers
                              completion:(KBNetworkCompletion)completion;

@end

NS_ASSUME_NONNULL_END

