import { BrowserProvider, JsonRpcSigner, JsonRpcProvider } from 'ethers'
import { LiquidityOperation, OraclePackage, RiskDirection } from './typings'

export type RhoSDKNetwork = 'mainnet' | 'testnet' | 'devnet' | 'custom'

export interface RhoSDKParams {
  network?: RhoSDKNetwork
  routerAddress?: string
  viewAddress?: string
  quoterAddress?: string
  rpcUrl?: string
  oracleServiceUrl?: string | string[]
  privateKey?: string
  provider?: JsonRpcProvider | BrowserProvider
  signer?: JsonRpcSigner
}

export interface RhoSDKConfig extends RhoSDKParams {
  routerAddress: string
  viewAddress: string
  quoterAddress: string
  rpcUrl: string
  oracleServiceUrl: string | string[]
}

export interface OraclePackagesParams {
  oraclePackages?: OraclePackage[]
}

export interface PaginationParams {
  offset?: number
  limit?: number
}

export interface UserPaginationParams extends PaginationParams {
  userAddress: string
}
export interface UserOracleParams extends OraclePackagesParams {
  userAddress: string
}

export interface UserOraclePaginationParams extends UserOracleParams, PaginationParams {}

export interface OraclePaginationParams extends OraclePackagesParams, PaginationParams {}

export interface MarketOracleParams extends OraclePackagesParams {
  marketId: string
}

export interface MarketUserOracleParams extends UserOracleParams, MarketOracleParams {}

export interface MarketFutureOracleParams extends OraclePackagesParams {
  marketId: string
  futureId: string
}

export interface MarketFutureOraclePaginationParams extends MarketFutureOracleParams, PaginationParams {}

export interface FutureMarketUserOracleParams extends MarketUserOracleParams {
  futureId: string
}

export interface TradeQuoteParams extends FutureMarketUserOracleParams {
  notional: bigint
}

export interface LiquidityPositionQuoteParams extends TradeQuoteParams {
  operation: LiquidityOperation
  lowerBound: string
  upperBound: string
}

export interface LiquidatePositionParams extends MarketUserOracleParams {
  futureIds: string[]
  positionsPercentage: string[]
  settleMaturedPositions?: boolean
}

export interface ExecuteTradeParams extends MarketFutureOracleParams {
  riskDirection: RiskDirection
  notional: bigint
  futureRateLimit: bigint
  depositAmount: bigint
  deadline?: number
  settleMaturedPositions?: boolean
}

export interface DepositParams extends MarketUserOracleParams {
  amount: bigint
  settleMaturedPositions?: boolean
}

export interface WithdrawParams extends MarketOracleParams {
  amount: bigint
  unwrapNativeToken?: boolean
  settleMaturedPositions?: boolean
}

export interface LiquidityOperationParams extends MarketFutureOracleParams {
  notional: bigint
  collateral: string
  lowerBound: string
  upperBound: string
  deadline?: number
  settleMaturedPositions?: boolean
}

export interface TransferPositionsOwnershipParams extends MarketUserOracleParams {
  depositAmount: bigint
  settleMaturedPositions?: boolean
}
