import { BigNumber, ContractTransaction } from 'ethers';

export enum PaymentToken {
  SENTINEL, // denotes non-existence of payment token. i.e. default value signifying it hasn't been set
  WETH,
  DAI,
  USDC,
  USDT,
  TUSD,
  RENT,
}

export enum NFTStandard {
  E721,
  E1155,
}

export interface INFTSafe {
  lend(
    nftStandards: NFTStandard[],
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendAmounts: BigNumber[],
    maxRentDurations: number[],
    minRentDurations: number[],
    dailyRentPrices: string[],
    paymentOptions: PaymentToken[],
    collateralPrices: string[],
    allowedRenters: string[][][]
  ): Promise<ContractTransaction>;

  rent(
    nftStandards: NFTStandard[],
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[],
    rentDurations: number[],
    rentAmounts: BigNumber[]
  ): Promise<ContractTransaction>;

  stopRenting(
    nftStandards: NFTStandard[],
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[],
    rentingIds: BigNumber[]
  ): Promise<ContractTransaction>;

  claimRentOrCollateral(
    nftStandards: NFTStandard[],
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[],
    rentingIds: BigNumber[]
  ): Promise<ContractTransaction>;

  stopLending(
    nftStandards: NFTStandard[],
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[]
  ): Promise<ContractTransaction>;
}

export type rentProps = {};
export interface IRevenueSharedNFTRentals {
  lend(
    lendingRequests: [
      NFTStandard,
      string,
      BigNumber,
      BigNumber,
      string,
      number,
      [string[], number[]],
      [string[]],
      PaymentToken
    ][]
  ): Promise<ContractTransaction>;

  rent(
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[],
    rentDurations: number[],
    rentAmounts: BigNumber[]
  ): Promise<ContractTransaction>;

  stopRenting(
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[],
    rentingIds: BigNumber[]
  ): Promise<ContractTransaction>;

  shareRevenue(
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[],
    revenueAmounts: BigNumber[],
    renters: string[],
    revenueTokenAddress: string[]
  ): Promise<ContractTransaction>;

  stopLending(
    nftStandards: NFTStandard[],
    nftAddresses: string[],
    tokenIds: BigNumber[],
    lendingIds: BigNumber[]
  ): Promise<ContractTransaction>;
}
