export interface ConfigData {
  version: string;
  owner: string;
  feePercent: string;
  feeWallet: string;
}

export interface OtcOfferData {
  orderId: string;
  isBuyer: boolean;
  owner: string;
  exToken: string;
  value: string;
  deadline: string;
  status: string;
}

export enum OTCPreMarketError {
  NotUpgrade = 1,
  Unauthorized = 2,
  InvalidRole = 3,
  InvalidTokenState = 4,
  InvalidOfferType = 5,
  InvalidAmount = 6,
  InvalidValue = 7,
  InvalidCoinType = 8,
  InvalidOfferState = 9,
  InsufficientAllocation = 10,
  FullMatchRequired = 11,
  InvalidTokenId = 12,
  InvalidSettleDuration = 13,
  InvalidOrderState = 14,
  InvalidTableKey = 15,
  InvalidSignature = 16,
}

export enum TokenStatus {
  Active = 1,
  Inactive = 2,
  Settle = 3,
  Cancelled = 4,
}

export enum TokenCategory {
  Point = 1,
  PreMarket = 2,
}

export enum OfferType {
  Buy = 1,
  Sell = 2,
}

export enum OfferStatus {
  Open = 1,
  Filled = 2,
  Cancelled = 3,
}

export enum OrderStatus {
  Open = 1,
  SettleFilled = 2,
  SettleCancelled = 3,
  Cancelled = 4,
}

export enum Role {
  NoRole = 0,
  Admin = 1,
  Operator = 2,
}

export enum EventType {
  ConfigUpdatedEvent = "ConfigUpdatedEvent",
  RoleAddedEvent = "RoleAddedEvent", 
  RoleRemovedEvent = "RoleRemovedEvent",
  OtcOfferCreatedEvent = "OtcOfferCreatedEvent",
  OtcOfferFilledEvent = "OtcOfferFilledEvent",
  OtcOfferUpdatedEvent = "OtcOfferUpdatedEvent",
  OtcOfferCancelledEvent = "OtcOfferCancelledEvent"
}

export interface ConfigUpdatedEvent {
  event_name: string;
  sender: string;
  fee_percent: string;
  fee_wallet: string;
  block_height: number;
  transaction_version: number;
}

export interface RoleAddedEvent {
  event_name: string;
  sender: string;
  user: string;
  role: number;
  block_height: number;
  transaction_version: number;
}

export interface RoleRemovedEvent {
  event_name: string;
  sender: string;
  user: string;
  role: number;
  block_height: number;
  transaction_version: number;
}

export interface OtcOfferCreatedEvent {
  event_name: string;
  offer_id: string;
  order_id: string;
  token_id: string;
  owner: string;
  ex_token: string;
  value: string;
  deadline: string;
  is_buyer: boolean;
  status: number;
  block_height: number;
  transaction_version: number;
}

export interface OtcOfferFilledEvent {
  event_name: string;
  offer_id: string;
  buyer: string;
  value: string;
  status: number;
  block_height: number;
  transaction_version: number;
}

export interface OtcOfferUpdatedEvent {
  event_name: string;
  offer_id: string;
  buyer: string;
  new_price: string;
  new_deadline: string;
  status: number;
  block_height: number;
  transaction_version: number;
}

export interface OtcOfferCancelledEvent {
  event_name: string;
  offer_id: string;
  status: number;
  block_height: number;
  transaction_version: number;
}

export interface EventWrapper {
  event_name: string;
  data: string;
  block_height: number;
  transaction_version: number;
}

export type EventResults = (
  | ConfigUpdatedEvent
  | RoleAddedEvent
  | RoleRemovedEvent
  | OtcOfferCreatedEvent
  | OtcOfferFilledEvent
  | OtcOfferUpdatedEvent
  | OtcOfferCancelledEvent
)[];


