export enum PaymentMethods {
  CARD = 'CARD',
  CARD_INSTALLMENTS = 'CARD_INSTALLMENTS',
  CARD_TOKEN = 'CARD_TOKEN',
  CARD_TOKEN_INSTALLMENTS = 'CARD_TOKEN_INSTALLMENTS',
  QR_PROMPT_PAY = 'QR_PROMPT_PAY',
  ALIPAY = 'ALIPAY',
  LINE_PAY = 'LINE_PAY',
  MOBILE_BANKING = 'MOBILE_BANKING',
  SHOPEE_PAY = 'SHOPEE_PAY',
  TRUE_MONEY = 'TRUE_MONEY',
  WECHAT_PAY = 'WECHAT_PAY',
  BANGKOK_BANK_APP = 'BANGKOK_BANK_APP',
  KPLUS = 'KPLUS',
  KRUNGSRI_APP = 'KRUNGSRI_APP',
  SCB_EASY = 'SCB_EASY',
}

export enum BeamFeeType {
  TRANSACTION_FEE = 'TRANSACTION_FEE',
  SERVICE_FEE = 'SERVICE_FEE',
}

export enum BeamPaymentLinkStatus {
  ACTIVE = 'ACTIVE',
  PAID = 'PAID',
  EXPIRED = 'EXPIRED',
  DISABLED = 'DISABLED',
  VOIDED = 'VOIDED',
  REFUNDED = 'REFUNDED',
}

export enum CurrencyCode {
  THB = 'THB',
}

export type CreatePaymentArgs = {
  collectDeliveryAddress?: boolean
  collectPhoneNumber?: boolean // default: true
  expiresAt?: string
  feeType?: BeamFeeType
  linkSettings: {
    buyNowPayLater?: { isEnabled?: boolean }
    card?: { isEnabled?: boolean }
    cardInstallments?: {
      installments3m?: { isEnabled?: boolean }
      installments4m?: { isEnabled?: boolean }
      installments6m?: { isEnabled?: boolean }
      installments10m?: { isEnabled?: boolean }
      isEnabled?: boolean
    }
    eWallets?: { isEnabled?: boolean }
    mobileBanking?: { isEnabled?: boolean }
    qrPromptPay?: { isEnabled?: boolean }
  }
  order: {
    currency: CurrencyCode
    description?: string
    internalNote?: string
    netAmount: number
    orderItems?: {
      description?: string
      imageUrl?: string
      itemName?: string
      price: number
      productId?: string
      quantity?: number
      sku?: string
    }[]
    referenceId?: string
  }
  redirectUrl?: string
}

export type CreatePaymentResponse = {
  id: string
  url: string
}

export type GetPaymentResponse = {
  collectDeliveryAddress: boolean
  collectPhoneNumber: boolean
  expiresAt: string
  feeType: BeamFeeType
  linkSettings: {
    buyNowPayLater: { isEnabled: boolean }
    card: { isEnabled: boolean }
    cardInstallments: {
      installments3m: { isEnabled: boolean }
      installments4m: { isEnabled: boolean }
      installments6m: { isEnabled: boolean }
      installments10m: { isEnabled: boolean }
      isEnabled: boolean
    }
    eWallets: { isEnabled: boolean }
    mobileBanking: { isEnabled: boolean }
    qrPromptPay: { isEnabled: boolean }
  }
  merchantId: string
  order: {
    currency: CurrencyCode
    description: string
    internalNote: string
    netAmount: number
    orderItems: {
      description: string
      imageUrl: string
      itemName: string
      price: number
      productId: string
      quantity: number
      sku: string
    }[]
    referenceId: string
  }
  paymentLinkId: string
  redirectUrl: string
  status: BeamPaymentLinkStatus
  url: string
}

export type DisablePaymentResponse = {
  code: number
  error?: { errorCode: string; errorMessage: string }
  message: string
}

export enum BeamRefundStatus {
  PENDING = 'PENDING',
  SUCCEEDED = 'SUCCEEDED',
  FAILED = 'FAILED',
  DISABLED = 'DISABLED',
  VOIDED = 'VOIDED',
  REFUNDED = 'REFUNDED',
}

export type RefundPaymentResponse = {
  refundId: string
}

export type GetRefundResponse = {
  amount: number
  chargeId: string
  createdAt: string
  currency: CurrencyCode
  failureCode: string
  merchantId: string
  referenceId: string
  refundId: string
  refundReason: string
  status: BeamRefundStatus
  transactionTime: string
  updatedAt: string
}

export enum ChargeSource {
  PAYMENT_LINK = 'PAYMENT_LINK',
  STORE_LINK = 'STORE_LINK',
  QR_PROMPT_PAY_LINK = 'QR_PROMPT_PAY_LINK',
  API = 'API',
  BOLT = 'BOLT',
}

export enum feeStrategy {
  RATE = 'RATE',
  MINIMUM_AMOUNT = 'MINIMUM_AMOUNT',
}

export enum BeamTransactionsType {
  PENDING = 'PENDING',
  SUCCEEDED = 'SUCCEEDED',
  FAILED = 'FAILED',
  DISABLED = 'DISABLED',
  VOIDED = 'VOIDED',
  REFUNDED = 'REFUNDED',
}

export type ListTransactionsResponse = {
  data: {
    chargeSource: ChargeSource
    createdAt: string
    currency: CurrencyCode
    feeAmount: number
    feeStrategy: feeStrategy
    grossAmount: number
    merchantId: string
    netAmount: number
    referenceId: string
    sourceId: string
    transactionId: string
    transactionTime: string
    transactionType: BeamTransactionsType
    vatAmount: number
  }[]
  totalCount: number
}

export type SuccessfulTransactionsResponse = {
  chargeSource: ChargeSource
  createdAt: string
  currency: CurrencyCode
  feeAmount: number
  feeStrategy: feeStrategy
  grossAmount: number
  merchantId: string
  netAmount: number
  referenceId: string
  sourceId: string
  transactionId: string
  transactionTime: string
  transactionType: BeamTransactionsType
  vatAmount: number
}

export type CreateChargePaymentArgs = {
  amount: number
  currency: CurrencyCode
  customer?: {
    deliveryAddress?: {
      address?: {
        city?: string
        country?: string
        postCode?: string
        streetAddress?: string
      }
      contactName?: string
      phone?: {
        countryCode: string
        number: string
      }
    }
    email?: string
    primaryPhoneNumber?: {
      countryCode: string
      number: string
    }
  }
  paymentMethod: {
    alipay?: {}
    bangkokBankApp?: {}
    card?: {
      cardHolderName: string
      expiryMonth: number
      expiryYear: number
      pan: string
      securityCode?: string
    }
    cardInstallments?: {
      cardHolderName: string
      expiryMonth: number
      expiryYear: number
      installmentPeriod: 3 | 4 | 6 | 10
      pan: string
      securityCode?: string
    }
    cardToken?: {
      cardTokenId: string
      securityCode: string
    }
    cardTokenInstallments?: {
      cardTokenId: string
      installmentPeriod: 3 | 4 | 6 | 10
      securityCode: string
    }
    kPlus?: {}
    krungsriApp?: {}
    linePay?: {}
    paymentMethodType: PaymentMethods
    qrPromptPay?: {
      expiresAt?: string
    }
    scbEasy?: {}
    shopeePay?: {}
    trueMoney?: {}
    weChatPay?: {}
  }
  referenceId?: string
  returnUrl?: string
  skip3dsFlow?: boolean
}

export enum ActionRequired {
  NONE = 'NONE',
  REDIRECT = 'REDIRECT',
  'ENCODE_IMAGE' = 'ENCODE_IMAGE',
}

export type CreateChargePaymentResponse = {
  actionRequired: ActionRequired
  chargeId: string
  encodedImage?: {
    expiry: string
    imageBase64Encoded: string
    rawData: string
  }
  paymentMethodType: PaymentMethods
  redirect?: {
    redirectUrl: string
  }
}

export enum FailureCode {
  CH_PROCESSING_FAILED = 'CH_PROCESSING_FAILED',
  CH_INSUFFICIENT_FUNDS = 'CH_INSUFFICIENT_FUNDS',
  CH_AUTHENTICATION_FAILED = 'CH_AUTHENTICATION_FAILED',
}

export enum BeamChargeStatus {
  PENDING = 'PENDING',
  SUCCEEDED = 'SUCCEEDED',
  FAILED = 'FAILED',
}

export type GetChargePaymentResponse = {
  amount: number
  chargeId: string
  createdAt: string
  currency: CurrencyCode
  customer?: {
    deliveryAddress: {
      address: {
        city: string
        country: string
        postCode: string
        streetAddress: string
      }
      contactName: string
      phone: {
        countryCode: string
        number: string
      }
    }
    email: string
    primaryPhone: {
      countryCode: string
      number: string
    }
  }
  failureCode: FailureCode
  merchantId: string
  paymentMethod: {
    alipay?: {}
    bangkokBankApp?: {}
    card?: {
      brand: string
      countryAlpha2: string
      last4: string
    }
    cardInstallments?: {
      brand: string
      countryAlpha2: string
      installmentPeriod: 3 | 4 | 6 | 10
      last4: string
    }
    kPlus?: {}
    krungsriApp?: {}
    krungthaiNext?: {}
    linePay?: {}
    make?: {}
    paymentMethodType: PaymentMethods
    qrPromptPay?: {}
    scbEasy?: {}
    shopeePay?: {}
    trueMoney?: {}
    weChatPay?: {}
  }
  referenceId: string
  source: ChargeSource
  sourceId: string
  status: BeamChargeStatus
  transactionTime: string
  updatedAt: string
}

export type CreateBoltConnectionResponse = {
  createdAt: string
  deviceId: string
  id: string
  merchantId: string
}

export type DeleteBoltConnectionResponse = {
  code: number
  message: string
  error?: { errorCode: string; errorMessage: string }
}

export type GetBoltConnectionResponse = {
  createdAt: string
  deviceId: string
  id: string
  merchantId: string
}

export enum BoltIssuerGroup {
  BangkokBank = 'BangkokBank',
  CIMBThaiBank = 'CIMBThaiBank',
  KasikornBank = 'KasikornBank',
  KrungsriBank = 'KrungsriBank',
  KrungsriFirstChoice = 'KrungsriFirstChoice',
  KrungthaiBank = 'KrungthaiBank',
  SiamCommercialBank = 'SiamCommercialBank',
  TMBThanachartBank = 'TMBThanachartBank',
  UnitedOverseasBank = 'UnitedOverseasBank',
  Ungrouped = 'Ungrouped',
  Unknown = 'Unknown',
}

export enum BoltStatus {
  ACTIVE = 'ACTIVE',
  CANCELED = 'CANCELED',
  EXPIRED = 'EXPIRED',
}

export type CreateBoltIntentArgs = {
  amount: number
  boltConnectionId?: string
  currency: CurrencyCode
  expiryDurationInSec: number
  internalNote?: string
  paymentMethod: {
    alipay?: {}
    card?: {}
    cardInstallments?: {
      installmentPeriod: 3 | 4 | 6 | 10
      issuerGroup: BoltIssuerGroup
    }
    linePay?: {}
    paymentMethodType: PaymentMethods
    qrPromptPay?: {}
    shopeePay?: {}
    trueMoney?: {}
    weChatPay?: {}
  }
  referenceId: string
}

export type CreateBoltIntentResponse = {
  amount: number
  boltConnectionId: string
  createdAt: string
  createdBy: string
  currency: CurrencyCode
  expiresAt: string
  id: string
  internalNote: string
  merchant: {
    logoUrl: string
    merchantId: string
    name: string
  }
  paymentMethod: {
    alipay: {}
    card: {}
    cardInstallments: {
      installmentPeriod: 3 | 4 | 6 | 10
      issuerGroup: BoltIssuerGroup
    }
    linePay: {}
    paymentMethodType: PaymentMethods
    qrPromptPay: {}
    shopeePay: {}
    trueMoney: {}
    weChatPay: {}
  }
  referenceId: string
  status: BoltStatus
  updatedAt: string
  updatedBy: string
}

export type CancelBoltIntentResponse = {
  code: number
  error?: {
    errorCode: string
    errorMessage: string
  }
  message: string
}

export type ChargeSuccessWebhook = {
  chargeId: string
  merchantId: string
  referenceId: string
  status: BeamTransactionsType
  currency: CurrencyCode
  amount: number
  source: ChargeSource
  sourceId: string
  transactionTime: string
  paymentMethod: {
    paymentMethodType: PaymentMethods
    card: {
      last4: string
      brand: string
      countryAlpha2: string
    }
    cardInstallments: string | null
    cardNetworkToken: string | null
    qrPromptPay: string | null
    alipay: string | null
    weChatPay: string | null
    trueMoney: string | null
    linePay: string | null
    shopeePay: string | null
    make: string | null
    bangkokBankApp: string | null
    kPlus: string | null
    scbEasy: string | null
    krungsriApp: string | null
    krungthaiNext: string | null
  }
  failureCode: FailureCode
  customer: {
    primaryPhone: {
      countryCode: string
      number: string
    }
    email: string
    deliveryAddress: {
      contactName: string
      phone: {
        countryCode: string
        number: string
      }
      address: {
        streetAddress: string
        city: string
        country: string
        postCode: string
      }
    }
  }
  createdAt: string
  updatedAt: string
}

export type PaymentLinkPaidWebhook = {
  paymentLinkId: string
  merchantId: string
  url: string
  status: 'PAID'
  order: {
    netAmount: number
    currency: CurrencyCode
    description: string
    internalNote: string
    referenceId: string
    orderItems: {
      description: string
      imageUrl: string
      itemName: string
      price: number
      productId: string
      quantity: number
      sku: string
    }[]
  }
  linkSettings: {
    buyNowPayLater: {
      isEnabled: boolean
    }
    card: {
      isEnabled: boolean
    }
    cardInstallments: {
      installments3m: {
        isEnabled: boolean
      }
      installments4m: {
        isEnabled: boolean
      }
      installments6m: {
        isEnabled: boolean
      }
      installments10m: {
        isEnabled: boolean
      }
    }
    qrPromptPay: {
      isEnabled: boolean
    }
    eWallets: {
      isEnabled: boolean
    }
    mobileBanking: {
      isEnabled: boolean
    }
  }
  collectDeliveryAddress: boolean
  collectPhoneNumber: boolean
  redirectUrl: string
  expiresAt: string
  feeType: BeamFeeType
}
