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

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

//NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(int, YCKWhiteboardCommandType)
{
    YCKWhiteboardCommandTypeElementCreate     = 1,  //创建对象
    YCKWhiteboardCommandTypeElementEditing    = 2,  //改变对象的位置，大小，属性等。
    YCKWhiteboardCommandTypeElementErase      = 3,  //删除对象
//    YCKWhiteboardCommandTypeElementCombine    = 4,  //组合对象 //这两个不用，同一在edit里面
//    YCKWhiteboardCommandTypeElementDecombine  = 5,  //拆分对象
    YCKWhiteboardCommandTypeGroupElements     = 6,  //备课文件
    
    YCKWhiteboardCommandTypeWhiteboardOperation = 10, //针对白板本身的操作，如移动，缩放等。这个也不必撤销
    
    YCKWhiteboardCommandTypeUndo              = 20,  //撤销上个命令，这三个命令的作用对象指不包括这三个自己的其他命令。
    YCKWhiteboardCommandTypeRedo              = 21,  //重做上个命令
    YCKWhiteboardCommandTypeReset             = 99,  //清空所有命令
    
    YCKWhiteboardCommandTypeSyncQuery         = 110, //询问谁可以sync
    YCKWhiteboardCommandTypeSyncQueryReply    = 111, //答复询问，收到的第一个发request
    YCKWhiteboardCommandTypeSyncRequest       = 112, //同步请求
    YCKWhiteboardCommandTypeSyncReply         = 113, //同步数据答复
};

@interface YCKWhiteboardCommand : NSObject<NSCoding>

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

@property (nonatomic)    YCKWhiteboardCommandType    command;
@property (nonatomic)    YCKWhiteboardElementType    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) YCKWhiteboardCommand  *pairedCommand; //在undo/redo的堆栈里，有些编辑指令需要touchBegin和touchEnd两个指令同时操作

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

@end

//NS_ASSUME_NONNULL_END
