export interface ConfigData {
  version: string;
  owner: string;
  discountVerifierPubkey: string;
  pledgeRate: string;
  feeSettle: string;
  feeRefund: string;
  feeWallet: string;
  currentTokenIndex: string;
}

export interface TokenConfigData {
  index: string;
  settleTime: string;
  settleDuration: string;
  status: string;
  settleRate: string;
  token: string | null;
}

export interface OfferData {
  tokenId: string;
  exToken: string;
  exTokenStore: string;
  offerType: string;
  status: string;
  amount: string;
  value: string;
  filledAmount: string;
  collateral: string;
  fullMatch: boolean;
  owner: string;
}

export interface OrderData {
  tokenId: string;
  offerId: string;
  exToken: string;
  exTokenStore: string;
  status: string;
  amount: string;
  value: string;
  collateral: string;
  buyer: string;
  seller: string;
}

export enum PreMarketError {
  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 {
  Admin = 1,
  Operator = 2,
}

export interface SettleDiscount {
  orderId: string;
  sellerDiscount: number;
  buyerDiscount: number;
  signature: number[];
}
export enum EventType {
  ConfigUpdatedEvent = "ConfigUpdatedEvent",
  RoleAddedEvent = "RoleAddedEvent",
  RoleRemovedEvent = "RoleRemovedEvent",
  ExTokenAddedEvent = "ExTokenAddedEvent",
  ExTokenRemovedEvent = "ExTokenRemovedEvent",
  NewTokenEvent = "NewTokenEvent",
  NewOfferEvent = "NewOfferEvent",
  NewOrderEvent = "NewOrderEvent",
  SettleFilledEvent = "SettleFilledEvent",
  SettleCancelledEvent = "SettleCancelledEvent",
  CancelOfferEvent = "CancelOfferEvent",
  CloseOfferEvent = "CloseOfferEvent",
  ForceCancelOrderEvent = "ForceCancelOrderEvent",
  UpdateTokenSettleDurationEvent = "UpdateTokenSettleDurationEvent",
  TokenToSettlePhaseEvent = "TokenToSettlePhaseEvent",
  TokenForceCancelSettlePhaseEvent = "TokenForceCancelSettlePhaseEvent",
  TokenStatusToggledEvent = "TokenStatusToggledEvent",
  TokenCancelledEvent = "TokenCancelledEvent",
}

export interface ConfigUpdatedEvent {
  event_name: string;
  sender: string;
  discount_verifier_pubkey: string;
  pledge_rate: string;
  fee_settle: string;
  fee_refund: 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 ExTokenAddedEvent {
  event_name: string;
  sender: string;
  token: string;
  block_height: number;
  transaction_version: number;
}

export interface ExTokenRemovedEvent {
  event_name: string;
  sender: string;
  token: string;
  block_height: number;
  transaction_version: number;
}

export interface NewTokenEvent {
  event_name: string;
  token_id: string;
  token_index: string;
  settle_duration: string;
  block_height: number;
  transaction_version: number;
}

export interface NewOfferEvent {
  event_name: string;
  offer_id: string;
  offer_type: number;
  token_id: string;
  token_index: string;
  amount: string;
  value: string;
  collateral: string;
  full_match: boolean;
  doer: string;
  ex_token: string;
  block_height: number;
  transaction_version: number;
}

export interface NewOrderEvent {
  event_name: string;
  order_id: string;
  offer_id: string;
  amount: string;
  seller: string;
  buyer: string;
  block_height: number;
  transaction_version: number;
}

export interface SettleFilledEvent {
  event_name: string;
  order_id: string;
  value: string;
  fee: string;
  doer: string;
  block_height: number;
  transaction_version: number;
}

export interface SettleCancelledEvent {
  event_name: string;
  order_id: string;
  value: string;
  fee: string;
  doer: string;
  block_height: number;
  transaction_version: number;
}

export interface CancelOfferEvent {
  event_name: string;
  offer_id: string;
  refund_value: string;
  refund_fee: string;
  doer: string;
  block_height: number;
  transaction_version: number;
}

export interface CloseOfferEvent {
  event_name: string;
  offer_id: string;
  refund_amount: string;
  block_height: number;
  transaction_version: number;
}

export interface ForceCancelOrderEvent {
  event_name: string;
  order_id: string;
  doer: string;
  block_height: number;
  transaction_version: number;
}

export interface UpdateTokenSettleDurationEvent {
  event_name: string;
  token_id: string;
  token_index: string;
  old_value: string;
  new_value: string;
  block_height: number;
  transaction_version: number;
}

export interface TokenToSettlePhaseEvent {
  event_name: string;
  token_id: string;
  token_index: string;
  token: string;
  settle_rate: string;
  settle_time: string;
  block_height: number;
  transaction_version: number;
}

export interface TokenForceCancelSettlePhaseEvent {
  event_name: string;
  token_id: string;
  token_index: string;
  status: number;
  block_height: number;
  transaction_version: number;
}

export interface TokenStatusToggledEvent {
  event_name: string;
  token_id: string;
  token_index: string;
  old_status: number;
  new_status: number;
  block_height: number;
  transaction_version: number;
}

export interface TokenCancelledEvent {
  event_name: string;
  token_id: string;
  token_index: 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
  | ExTokenAddedEvent
  | NewTokenEvent 
  | NewOfferEvent
  | NewOrderEvent
  | CancelOfferEvent
  | CloseOfferEvent
  | ForceCancelOrderEvent
  | UpdateTokenSettleDurationEvent
  | TokenToSettlePhaseEvent
  | TokenForceCancelSettlePhaseEvent 
  | TokenStatusToggledEvent
)[];


