//
//  KBAuthManager.h
//  主 App 与键盘扩展共享使用
//
//  通过 Keychain Sharing 统一管理用户登录态（access/refresh token）。
//  线程安全；在保存/清空时同时发送进程内通知与 Darwin 跨进程通知，
//  以便键盘扩展正运行在其他 App 时也能及时感知变更。
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/// Darwin 跨进程通知名称：当令牌更新或清除时发送，用于提示 App/扩展刷新缓存。
extern NSString * const kKBDarwinAuthChanged;

/// 进程内通知（NSNotificationCenter）：令牌更新或清除时发送。
extern NSNotificationName const KBAuthChangedNotification;

/// 简单的会话容器；可按需扩展字段。
@interface KBAuthSession : NSObject <NSSecureCoding>
@property (nonatomic, copy, nullable) NSString *accessToken;
@property (nonatomic, copy, nullable) NSString *refreshToken;
@property (nonatomic, strong, nullable) NSDate *expiryDate;     // 可选：过期时间
@property (nonatomic, copy, nullable) NSString *userIdentifier; // 可选：如“用 Apple 登录”的 userIdentifier
@end

/// 基于“共享钥匙串”的鉴权管理器（使用 Keychain Sharing 访问组）。
@interface KBAuthManager : NSObject

+ (instancetype)shared;

/// 当前会话（内存缓存），在加载/保存/清除后更新。
@property (atomic, strong, readonly, nullable) KBAuthSession *current;

/// 是否已登录：存在 accessToken 且未明显过期（未设置过期时间则只要有 token 即视为已登录）。
- (BOOL)isLoggedIn;

/// 从钥匙串加载到内存；通常首次访问时会自动加载。
- (void)reloadFromKeychain;

/// 保存令牌到“共享钥匙串”并通知观察者。
- (BOOL)saveAccessToken:(NSString *)accessToken
          refreshToken:(nullable NSString *)refreshToken
            expiryDate:(nullable NSDate *)expiryDate
        userIdentifier:(nullable NSString *)userIdentifier;

/// 从钥匙串与内存中清除令牌，并通知观察者。
- (void)signOut;

/// 便捷方法：若存在有效令牌，返回 `Authorization` 请求头；否则返回空字典。
- (NSDictionary<NSString *, NSString *> *)authorizationHeader;

@end

NS_ASSUME_NONNULL_END
