//
//  NXLoginManagerProtocol.h
//  NXSdwan
//
//  Created by 徐家骏 on 2019/6/17.
//  Copyright © 2019 徐家骏. All rights reserved.
//

#ifndef NXLoginManagerProtocol_h
#define NXLoginManagerProtocol_h

#import <Foundation/Foundation.h>
#import <NXSdwan/NXAccount.h>
#import <NXSdwan/NXKickInfo.h>

/**
 *  登录服务相关Block
 *
 *  @param error 执行结果,如果成功error为nil
 */
typedef void(^NXLoginHandler)(NSError * __nullable error);

/**
 *  登录步骤枚举
 */
typedef NS_ENUM(int, NXLoginStep)
{
    /**
     *  登录
     */
    NXLoginStepLogining = 1,
    /**
     *  登录成功
     */
    NXLoginStepLoginOK,

    /**
     *  开始同步
     */
    NXLoginStepSyncing,
    /**
     *  同步完成
     */
    NXLoginStepSyncOK,
    /**

     */
    NXLoginStepAutoLogining,
    /**

     */
    NXLoginStepAutoLoginOk,
};


/**
 *  登录相关回调
 */
@protocol NXLoginManagerDelegate <NSObject>

@optional
/**
 *  被踢(服务器/其他端)回调
 *
 *  @param kickInfo        被踢原因
 */
- (void)onKick:(nullable NXKickInfo *)kickInfo;


/**
 *  登录回调
 *
 *  @param step 登录步骤
 *  @discussion 这个回调主要用于客户端UI的刷新
 */
- (void)onLogin:(NXLoginStep)step;

/**
 *  自动登录失败回调
 *
 *  @param error 失败原因
 *  @discussion 自动重连不需要上层开发关心，但是如果发生一些需要上层开发处理的错误，SDK 会通过这个方法回调
 *              用户需要处理的情况包括：AppKey 未被设置，参数错误，密码错误，多端登录冲突，账号被封禁，操作过于频繁等
 */
- (void)onLoginFailed:(nullable NSError *)error;

///**
// *  多端登录发生变化
// */
//- (void)onMultiLoginClientsChanged;


- (void)onLogout;

@end


/**
 *  登录协议
 */
@protocol NXLoginManager <NSObject>

@property(nonatomic, assign) int64_t lastVuid;
//这个是为了NXDemo能够测试，需删掉
//- (void)login_demo:(nonnull NSString *)account
//        token:(nonnull NSString *)token
//   completion:(nonnull NXLoginHandler)completion;
//
//- (void)logout_demo:(nonnull NXLoginHandler)completion;


/**
 *  登录
 *
 *  @param account    帐号
 *  @param rid        客户端绑定账号时用的rid
 *  @param completion 完成回调
 */
- (void)login:(int64_t)account
          rid:(int64_t)rid
accountSecret:(nonnull NSString *)accountSecret
   parameters:(nullable NSDictionary *)parameters
   completion:(nullable NXLoginHandler)completion;

///**
// @discussion token过期后刷新token
// */
//- (void)updateTokenCompletion:(NXLoginHandler)completion;
/**
 *  登出
 *
 *  @param completion 完成回调
 *  @discussion 用户在登出是需要调用这个接口进行 SDK 相关数据的清理,如果网络错误导致服务器没有收到登出请求, 将返回失败。
 *
 */
- (void)logout:(nullable NXLoginHandler)completion;

/**
 *  强制登出
 *
 *  @param completion 完成回调
 *  @param forceMode 如果是YES, 如用户登出时发生网络错误导致服务器没有收到登出请求，客户端仍可以登出(切换界面，清理数据等)，但会出现推送信息仍旧会发到当前手机的问题。返回信息里还是会带网络访问错误.
 *  @discussion 用户在登出是需要调用这个接口进行 SDK 相关数据的清理,回调 Block 中的 error 只是指明和服务器的交互流程中可能出现的错误。
 */
- (void)logout:(nullable NXLoginHandler)completion forceMode:(BOOL)forceMode;

/**
 日志自动上传，默认间隔10分钟，需要设定autoUploadLog为YES。
 
 @param interval 时间间隔，单位：分钟, 范围1～60分钟。
 
 @return 设置结果
 */
- (BOOL)updateLogInterval:(int) interval;

/**
 SDK日志上传控制，默认不上传，上传时会压缩文件，需要用到压缩库
 */
@property (nonatomic) BOOL allowUploadLog;

/**
 SDK日志存储控制，默认不存储
 */
@property (nonatomic) BOOL allowAutoSave;

///**
// *  踢人
// *
// *  @param client     当前登录的其他客户端
// *  @param completion 完成回调
// */
//- (void)kickOtherClient:(NXLoginClient *)client
//             completion:(nullable NXLoginHandler)completion;

/**
 *  返回当前登录帐号
 *
 *  @return 当前登录帐号,如果没有登录成功,这个地方会返回空字符串""
 */
- (int64_t)currentAccount;


- (nullable NXAccount *)activeAccount;

/**
 *  当前登录状态
 *
 *  @return 当前登录状态
 */
- (BOOL)hasLogin;

/**
 *  登录指定uid，如果有上一个uid，则置为离线状态。
 *  @param uid 登录uid
 *  @return 如果登录账号的信息不存在会返回NO。
 */
- (BOOL)switchAccount:(int64_t)uid;

/**
 *  添加登录委托
 *
 *  @param delegate 登录委托
 */
- (void)addDelegate:(nonnull id<NXLoginManagerDelegate>)delegate;

/**
 *  移除登录委托
 *
 *  @param delegate 登录委托
 */
- (void)removeDelegate:(nonnull id<NXLoginManagerDelegate>)delegate;

/**
 上传SDK log
 */
- (void)uploadLog:(void(^)(BOOL success))resultBlock;

@end

#endif /* NXLoginManagerProtocol_h */
