//
//  NXWhiteboardCommand.h
//  NXKit
//
//  Created by 徐家骏 on 2020/7/1.
//  Copyright © 2020 徐家骏. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "NXWhiteboardElement.h"

//NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(int, NXWhiteboardCommandType)
{
    NXWhiteboardCommandTypeElementCreate     = 1,  //创建对象
    NXWhiteboardCommandTypeElementEditing    = 2,  //改变对象的位置，大小，属性等。
    NXWhiteboardCommandTypeElementErase      = 3,  //删除对象
//    NXWhiteboardCommandTypeElementCombine    = 4,  //组合对象 //这两个不用，同一在edit里面
//    NXWhiteboardCommandTypeElementDecombine  = 5,  //拆分对象
    NXWhiteboardCommandTypeGroupElements     = 6,  //备课文件
    
    NXWhiteboardCommandTypeWhiteboardOperation = 10, //针对白板本身的操作，如移动，缩放等。这个也不必撤销
    
    NXWhiteboardCommandTypeUndo              = 20,  //撤销上个命令，这三个命令的作用对象指不包括这三个自己的其他命令。
    NXWhiteboardCommandTypeRedo              = 21,  //重做上个命令
    NXWhiteboardCommandTypeReset             = 99,  //清空所有命令
    
    NXWhiteboardCommandTypeSyncQuery         = 110, //询问谁可以sync
    NXWhiteboardCommandTypeSyncQueryReply    = 111, //答复询问，收到的第一个发request
    NXWhiteboardCommandTypeSyncRequest       = 112, //同步请求
    NXWhiteboardCommandTypeSyncReply         = 113, //同步数据答复
};

@interface NXWhiteboardCommand : NSObject<NSCoding>

@property (nonatomic, strong)  NSMutableDictionary  *dict;
@property (nonatomic, strong)  NSData               *data;

@property (nonatomic)    NXWhiteboardCommandType    command;
@property (nonatomic)    NXWhiteboardElementType    etype;
@property (nonatomic)    int                         wbid;
@property (nonatomic)    int                         eid;
@property (nonatomic)    int64_t                     uid; //用户id，这个在接收到的时候根据from自己设置，发送的时候也不用设置
@property (nonatomic)    int64_t                     timestamp; //创建时间

    ///0:创建中；1:创建结束；-1:取消；-2：清除所有笔画；-3:清除发送方的所有笔画。对于多个消息合并成一个操作的，比如画线条，移动图像，这个标识最终结束
@property (nonatomic)    int                         eoe;
@property (nonatomic)    CGRect                      rect;
@property (nonatomic)    CGAffineTransform           transform;

//@property (nonatomic)    BOOL                        needPaired;
@property (nonatomic)    int                         undoable;
@property (nonatomic)    int64_t                     pairedTimestamp; //需要配对的command的创建时间
@property (nonatomic, strong) NXWhiteboardCommand  *pairedCommand; //在undo/redo的堆栈里，有些编辑指令需要touchBegin和touchEnd两个指令同时操作

- (instancetype)init;
- (instancetype)initWithData:(NSData *)data;
- (NSData *)toData;
- (NSString *)toString;

@end

//NS_ASSUME_NONNULL_END
