/**
 * This file was generated by kysely-codegen.
 * Please do not edit it manually.
 */

import type { ColumnType } from 'kysely'

export type AuthTokenType = 'reset_password' | 'reset_twofa'

export type CashUnit =
  | 'cashbox'
  | 'cassette1'
  | 'cassette2'
  | 'cassette3'
  | 'cassette4'
  | 'recycler1'
  | 'recycler2'
  | 'recycler3'
  | 'recycler4'
  | 'recycler5'
  | 'recycler6'

export type CashUnitOperationType =
  | 'cash-box-empty'
  | 'cash-box-refill'
  | 'cash-cassette-1-count-change'
  | 'cash-cassette-1-empty'
  | 'cash-cassette-1-refill'
  | 'cash-cassette-2-count-change'
  | 'cash-cassette-2-empty'
  | 'cash-cassette-2-refill'
  | 'cash-cassette-3-count-change'
  | 'cash-cassette-3-empty'
  | 'cash-cassette-3-refill'
  | 'cash-cassette-4-count-change'
  | 'cash-cassette-4-empty'
  | 'cash-cassette-4-refill'
  | 'cash-recycler-1-count-change'
  | 'cash-recycler-1-empty'
  | 'cash-recycler-1-refill'
  | 'cash-recycler-2-count-change'
  | 'cash-recycler-2-empty'
  | 'cash-recycler-2-refill'
  | 'cash-recycler-3-count-change'
  | 'cash-recycler-3-empty'
  | 'cash-recycler-3-refill'
  | 'cash-recycler-4-count-change'
  | 'cash-recycler-4-empty'
  | 'cash-recycler-4-refill'
  | 'cash-recycler-5-count-change'
  | 'cash-recycler-5-empty'
  | 'cash-recycler-5-refill'
  | 'cash-recycler-6-count-change'
  | 'cash-recycler-6-empty'
  | 'cash-recycler-6-refill'

export type ComplianceType =
  | 'authorized'
  | 'front_camera'
  | 'hard_limit'
  | 'id_card_data'
  | 'id_card_photo'
  | 'sanctions'
  | 'sms'
  | 'us_ssn'

export type DiscountSource = 'individualDiscount' | 'promoCode'

export type ExternalComplianceStatus =
  | 'APPROVED'
  | 'PENDING'
  | 'REJECTED'
  | 'RETRY'

export type Generated<T> =
  T extends ColumnType<infer S, infer I, infer U>
    ? ColumnType<S, I | undefined, U>
    : ColumnType<T, T | undefined, T>

export type Int8 = ColumnType<
  string,
  bigint | number | string,
  bigint | number | string
>

export type Json = JsonValue

export type JsonArray = JsonValue[]

export type JsonObject = {
  [x: string]: JsonValue | undefined
}

export type JsonPrimitive = boolean | number | string | null

export type JsonValue = JsonArray | JsonObject | JsonPrimitive

export type NotificationType =
  | 'compliance'
  | 'cryptoBalance'
  | 'error'
  | 'fiatBalance'
  | 'highValueTransaction'
  | 'security'
  | 'transaction'

export type Numeric = ColumnType<string, number | string, number | string>

export type Role = 'superuser' | 'user'

export type SmsNoticeEvent =
  | 'cash_out_dispense_ready'
  | 'sms_code'
  | 'sms_receipt'

export type StatusStage =
  | 'authorized'
  | 'confirmed'
  | 'instant'
  | 'insufficientFunds'
  | 'notSeen'
  | 'published'
  | 'rejected'

export type Timestamp = ColumnType<Date, Date | string, Date | string>

export type TradeType = 'buy' | 'sell'

export type TransactionBatchStatus = 'failed' | 'open' | 'ready' | 'sent'

export type VerificationType = 'automatic' | 'blocked' | 'verified'

export interface AuthTokens {
  expire: Generated<Timestamp>
  token: string
  type: AuthTokenType
  userId: string | null
}

export interface Bills {
  cashboxBatchId: string | null
  cashInFee: Numeric
  cashInTxsId: string
  created: Generated<Timestamp>
  cryptoCode: Generated<string | null>
  destinationUnit: Generated<CashUnit>
  deviceTime: Int8
  fiat: number
  fiatCode: string
  id: string
  legacy: Generated<boolean | null>
}

export interface Blacklist {
  address: string
  blacklistMessageId: Generated<string>
}

export interface BlacklistMessages {
  allowToggle: Generated<boolean>
  content: string
  id: string
  label: string
}

export interface CashInActions {
  action: string
  created: Generated<Timestamp>
  error: string | null
  errorCode: string | null
  id: Generated<number>
  txHash: string | null
  txId: string
}

export interface CashInTxs {
  batched: Generated<boolean>
  batchId: string | null
  batchTime: Timestamp | null
  cashInFee: Numeric
  commissionPercentage: Generated<Numeric | null>
  created: Generated<Timestamp>
  cryptoAtoms: Numeric
  cryptoCode: string
  customerId: Generated<string | null>
  deviceId: string
  discount: number | null
  discountSource: DiscountSource | null
  email: string | null
  error: string | null
  errorCode: string | null
  fee: Int8 | null
  fiat: Numeric
  fiatCode: string
  id: string
  isPaperWallet: Generated<boolean | null>
  minimumTx: number
  operatorCompleted: Generated<boolean>
  phone: string | null
  rawTickerPrice: Generated<Numeric | null>
  send: Generated<boolean>
  sendConfirmed: Generated<boolean>
  sendPending: Generated<boolean>
  sendTime: Timestamp | null
  termsAccepted: Generated<boolean>
  timedout: Generated<boolean>
  toAddress: string
  txCustomerPhotoAt: Timestamp | null
  txCustomerPhotoPath: string | null
  txHash: string | null
  txVersion: number
  walletScore: number | null
}

export interface CashinTxTrades {
  tradeId: Generated<number>
  txId: string
}

export interface CashOutActions {
  action: string
  created: Generated<Timestamp>
  denomination1: number | null
  denomination2: number | null
  denomination3: number | null
  denomination4: number | null
  denominationRecycler1: number | null
  denominationRecycler2: number | null
  denominationRecycler3: number | null
  denominationRecycler4: number | null
  denominationRecycler5: number | null
  denominationRecycler6: number | null
  deviceId: Generated<string>
  deviceTime: Int8 | null
  dispensed1: number | null
  dispensed2: number | null
  dispensed3: number | null
  dispensed4: number | null
  dispensedRecycler1: number | null
  dispensedRecycler2: number | null
  dispensedRecycler3: number | null
  dispensedRecycler4: number | null
  dispensedRecycler5: number | null
  dispensedRecycler6: number | null
  error: string | null
  errorCode: string | null
  id: Generated<number>
  layer2Address: string | null
  provisioned1: number | null
  provisioned2: number | null
  provisioned3: number | null
  provisioned4: number | null
  provisionedRecycler1: number | null
  provisionedRecycler2: number | null
  provisionedRecycler3: number | null
  provisionedRecycler4: number | null
  provisionedRecycler5: number | null
  provisionedRecycler6: number | null
  redeem: Generated<boolean>
  rejected1: number | null
  rejected2: number | null
  rejected3: number | null
  rejected4: number | null
  rejectedRecycler1: number | null
  rejectedRecycler2: number | null
  rejectedRecycler3: number | null
  rejectedRecycler4: number | null
  rejectedRecycler5: number | null
  rejectedRecycler6: number | null
  toAddress: string | null
  txHash: string | null
  txId: string
}

export interface CashOutTxs {
  commissionPercentage: Generated<Numeric | null>
  confirmedAt: Timestamp | null
  created: Generated<Timestamp>
  cryptoAtoms: Numeric
  cryptoCode: string
  customerId: Generated<string | null>
  denomination1: number | null
  denomination2: number | null
  denomination3: number | null
  denomination4: number | null
  denominationRecycler1: number | null
  denominationRecycler2: number | null
  denominationRecycler3: number | null
  denominationRecycler4: number | null
  denominationRecycler5: number | null
  denominationRecycler6: number | null
  deviceId: string
  discount: number | null
  discountSource: DiscountSource | null
  dispense: Generated<boolean>
  dispenseConfirmed: Generated<boolean | null>
  email: string | null
  error: string | null
  errorCode: string | null
  fiat: Numeric
  fiatCode: string
  fixedFee: Generated<Numeric>
  hdIndex: Generated<number | null>
  id: string
  layer2Address: string | null
  notified: Generated<boolean>
  phone: string | null
  provisioned1: number | null
  provisioned2: number | null
  provisioned3: number | null
  provisioned4: number | null
  provisionedRecycler1: number | null
  provisionedRecycler2: number | null
  provisionedRecycler3: number | null
  provisionedRecycler4: number | null
  provisionedRecycler5: number | null
  provisionedRecycler6: number | null
  publishedAt: Timestamp | null
  rawTickerPrice: Generated<Numeric | null>
  receivedCryptoAtoms: Generated<Numeric | null>
  redeem: Generated<boolean>
  status: Generated<StatusStage>
  swept: Generated<boolean>
  termsAccepted: Generated<boolean>
  timedout: Generated<boolean>
  toAddress: string
  txCustomerPhotoAt: Timestamp | null
  txCustomerPhotoPath: string | null
  txVersion: number
  walletScore: number | null
}

export interface CashoutTxTrades {
  tradeId: Generated<number>
  txId: string
}

export interface CashUnitOperation {
  billCountOverride: number | null
  created: Generated<Timestamp>
  deviceId: string | null
  id: string
  operationType: CashUnitOperationType
  performedBy: string | null
}

export interface ComplianceOverrides {
  complianceType: ComplianceType
  customerId: string | null
  id: string
  overrideAt: Timestamp
  overrideBy: string | null
  verification: VerificationType
}

export interface Coupons {
  code: string
  discount: number
  id: string
  softDeleted: Generated<boolean | null>
}

export interface CustomerCustomFieldPairs {
  customerId: string
  customFieldId: string
  value: string
}

export interface CustomerExternalCompliance {
  customerId: string
  externalId: string
  lastKnownStatus: ExternalComplianceStatus | null
  lastUpdated: Generated<Timestamp>
  service: string
}

export interface CustomerNotes {
  content: Generated<string>
  created: Generated<Timestamp>
  customerId: string
  id: string
  lastEditedAt: Timestamp | null
  lastEditedBy: string | null
  title: Generated<string>
}

export interface Customers {
  address: string | null
  authorizedAt: Timestamp | null
  authorizedOverride: Generated<VerificationType>
  authorizedOverrideAt: Timestamp | null
  authorizedOverrideBy: string | null
  created: Generated<Timestamp>
  email: string | null
  emailAt: Timestamp | null
  frontCameraAt: Timestamp | null
  frontCameraOverride: Generated<VerificationType>
  frontCameraOverrideAt: Timestamp | null
  frontCameraOverrideBy: string | null
  frontCameraPath: string | null
  id: string
  idCardData: { firstName: string; lastName: string }
  idCardDataAt: Timestamp | null
  idCardDataExpiration: Timestamp | null
  idCardDataNumber: string | null
  idCardDataOverride: Generated<VerificationType>
  idCardDataOverrideAt: Timestamp | null
  idCardDataOverrideBy: string | null
  idCardDataRaw: string | null
  idCardPhotoAt: Timestamp | null
  idCardPhotoOverride: Generated<VerificationType>
  idCardPhotoOverrideAt: Timestamp | null
  idCardPhotoOverrideBy: string | null
  idCardPhotoPath: string | null
  isTestCustomer: Generated<boolean>
  lastAuthAttempt: Timestamp | null
  lastUsedMachine: string | null
  name: string | null
  phone: string | null
  phoneAt: Timestamp | null
  phoneOverride: Generated<VerificationType>
  phoneOverrideAt: Timestamp | null
  phoneOverrideBy: string | null
  sanctions: boolean | null
  sanctionsAt: Timestamp | null
  sanctionsOverride: Generated<VerificationType>
  sanctionsOverrideAt: Timestamp | null
  sanctionsOverrideBy: string | null
  smsOverride: Generated<VerificationType>
  smsOverrideAt: Timestamp | null
  smsOverrideBy: string | null
  subscriberInfo: Json | null
  subscriberInfoAt: Timestamp | null
  subscriberInfoBy: string | null
  suspendedUntil: Timestamp | null
  usSsn: string | null
  usSsnAt: Timestamp | null
  usSsnOverride: Generated<VerificationType>
  usSsnOverrideAt: Timestamp | null
  usSsnOverrideBy: string | null
}

export interface CustomersCustomInfoRequests {
  customerData: Json
  customerId: string
  infoRequestId: string
  override: Generated<VerificationType>
  overrideAt: Timestamp | null
  overrideBy: string | null
}

export interface CustomFieldDefinitions {
  active: Generated<boolean | null>
  id: string
  label: string
}

export interface CustomInfoRequests {
  customRequest: Json | null
  enabled: Generated<boolean>
  id: string
}

export interface Devices {
  cassette1: Generated<number>
  cassette2: Generated<number>
  cassette3: Generated<number>
  cassette4: Generated<number>
  created: Generated<Timestamp>
  deviceId: string
  diagnosticsFrontUpdatedAt: Timestamp | null
  diagnosticsScanUpdatedAt: Timestamp | null
  diagnosticsTimestamp: Timestamp | null
  display: Generated<boolean>
  lastOnline: Generated<Timestamp>
  location: Generated<Json>
  model: string | null
  name: string
  numberOfCassettes: Generated<number>
  numberOfRecyclers: Generated<number>
  paired: Generated<boolean>
  recycler1: Generated<number>
  recycler2: Generated<number>
  recycler3: Generated<number>
  recycler4: Generated<number>
  recycler5: Generated<number>
  recycler6: Generated<number>
  userConfigId: number | null
  version: string | null
}

export interface EditedCustomerData {
  created: Generated<Timestamp>
  customerId: string
  frontCameraAt: Timestamp | null
  frontCameraBy: string | null
  frontCameraPath: string | null
  idCardData: { firstName: string; lastName: string }
  idCardDataAt: Timestamp | null
  idCardDataBy: string | null
  idCardPhotoAt: Timestamp | null
  idCardPhotoBy: string | null
  idCardPhotoPath: string | null
  name: string | null
  nameAt: Timestamp | null
  nameBy: string | null
  subscriberInfo: Json | null
  subscriberInfoAt: Timestamp | null
  subscriberInfoBy: string | null
  usSsn: string | null
  usSsnAt: Timestamp | null
  usSsnBy: string | null
}

export interface EmptyUnitBills {
  cashboxBatchId: string | null
  created: Generated<Timestamp>
  deviceId: string
  fiat: number
  fiatCode: string
  id: string
}

export interface HardwareCredentials {
  created: Generated<Timestamp | null>
  data: Json
  id: string
  lastUsed: Generated<Timestamp | null>
  userId: string
}

export interface IndividualDiscounts {
  customerId: string
  discount: number
  id: string
  softDeleted: Generated<boolean | null>
}

export interface Logs {
  deviceId: string | null
  id: string
  logLevel: string | null
  message: string | null
  serial: Generated<number>
  serverTimestamp: Generated<Timestamp>
  timestamp: Timestamp | null
}

export interface MachineEvents {
  created: Generated<Timestamp>
  deviceId: string
  deviceTime: Timestamp | null
  eventType: string
  id: string
  note: string | null
}

export interface MachineNetworkHeartbeat {
  averagePacketLoss: Numeric
  averageResponseTime: Numeric
  created: Generated<Timestamp>
  deviceId: string
  id: string
}

export interface MachineNetworkPerformance {
  created: Generated<Timestamp>
  deviceId: string
  downloadSpeed: Numeric
}

export interface MachinePings {
  deviceId: string
  deviceTime: Timestamp
  updated: Generated<Timestamp>
}

export interface Migrations {
  data: Json
  id: Generated<number>
}

export interface Notifications {
  created: Generated<Timestamp>
  detail: Json | null
  id: string
  message: string
  read: Generated<boolean>
  type: NotificationType
  valid: Generated<boolean>
}

export interface OperatorIds {
  id: Generated<number>
  operatorId: string
  service: string
}

export interface PairingTokens {
  created: Generated<Timestamp>
  id: Generated<number>
  name: string
  token: string | null
}

export interface SanctionsLogs {
  created: Generated<Timestamp>
  customerId: string
  deviceId: string
  id: string
  sanctionedAliasFullName: string
  sanctionedAliasId: string | null
  sanctionedId: string
}

export interface ServerLogs {
  deviceId: string | null
  id: string
  logLevel: string | null
  message: string | null
  meta: Json | null
  timestamp: Generated<Timestamp | null>
}

export interface SmsNotices {
  allowToggle: Generated<boolean>
  created: Generated<Timestamp>
  enabled: Generated<boolean>
  event: SmsNoticeEvent
  id: string
  message: string
  messageName: string
}

export interface Trades {
  created: Generated<Timestamp>
  cryptoAtoms: Numeric
  cryptoCode: string
  error: string | null
  fiatCode: string
  id: Generated<number>
  type: TradeType
}

export interface TransactionBatches {
  closedAt: Timestamp | null
  createdAt: Generated<Timestamp>
  cryptoCode: string
  errorMessage: string | null
  id: string
  status: Generated<TransactionBatchStatus>
}

export interface UnpairedDevices {
  deviceId: string
  id: string
  model: string | null
  name: string | null
  paired: Timestamp
  unpaired: Timestamp
}

export interface UserConfig {
  created: Generated<Timestamp>
  data: Json
  id: Generated<number>
  schemaVersion: Generated<number>
  type: string
  valid: boolean
}

export interface UserRegisterTokens {
  expire: Generated<Timestamp>
  role: Generated<Role | null>
  token: string
  useFido: Generated<boolean | null>
  username: string
}

export interface Users {
  created: Generated<Timestamp>
  enabled: Generated<boolean | null>
  id: string
  lastAccessed: Generated<Timestamp>
  lastAccessedAddress: string | null
  lastAccessedFrom: string | null
  password: string | null
  role: Generated<Role>
  tempTwofaCode: string | null
  twofaCode: string | null
  username: string
}

export interface UserSessions {
  expire: Timestamp
  sess: Json
  sid: string
}

export interface DB {
  authTokens: AuthTokens
  bills: Bills
  blacklist: Blacklist
  blacklistMessages: BlacklistMessages
  cashInActions: CashInActions
  cashInTxs: CashInTxs
  cashinTxTrades: CashinTxTrades
  cashOutActions: CashOutActions
  cashOutTxs: CashOutTxs
  cashoutTxTrades: CashoutTxTrades
  cashUnitOperation: CashUnitOperation
  complianceOverrides: ComplianceOverrides
  coupons: Coupons
  customerCustomFieldPairs: CustomerCustomFieldPairs
  customerExternalCompliance: CustomerExternalCompliance
  customerNotes: CustomerNotes
  customers: Customers
  customersCustomInfoRequests: CustomersCustomInfoRequests
  customFieldDefinitions: CustomFieldDefinitions
  customInfoRequests: CustomInfoRequests
  devices: Devices
  editedCustomerData: EditedCustomerData
  emptyUnitBills: EmptyUnitBills
  hardwareCredentials: HardwareCredentials
  individualDiscounts: IndividualDiscounts
  logs: Logs
  machineEvents: MachineEvents
  machineNetworkHeartbeat: MachineNetworkHeartbeat
  machineNetworkPerformance: MachineNetworkPerformance
  machinePings: MachinePings
  migrations: Migrations
  notifications: Notifications
  operatorIds: OperatorIds
  pairingTokens: PairingTokens
  sanctionsLogs: SanctionsLogs
  serverLogs: ServerLogs
  smsNotices: SmsNotices
  trades: Trades
  transactionBatches: TransactionBatches
  unpairedDevices: UnpairedDevices
  userConfig: UserConfig
  userRegisterTokens: UserRegisterTokens
  users: Users
  userSessions: UserSessions
}
