/* eslint-disable @typescript-eslint/no-unused-vars */
import axios from 'axios';
import { ethers } from 'ethersV5';

import {
  // swap methods
  constructPartialSDK,
  constructEthersContractCaller,
  constructAxiosFetcher,
  // OTCOrders methods
  constructBuildOTCOrder,
  constructSignOTCOrder,
  constructPostOTCOrder,
  // extra types
  SignableOrderData,
  OTCOrderToPost,
} from '..';

const wallet = ethers.Wallet.createRandom();
const takerAccount = '0x5678...';

const fetcher = constructAxiosFetcher(axios);

const provider = wallet.connect(ethers.getDefaultProvider(1));
const contractCaller = constructEthersContractCaller(
  {
    ethersProviderOrSigner: provider,
    EthersContract: ethers.Contract,
  },
  wallet.address
);

// type BuildOTCOrderFunctions
// & SignOTCOrderFunctions
// & PostOTCOrderFunctions

const OTCOrderSDK = constructPartialSDK(
  {
    chainId: 1,
    fetcher,
    contractCaller,
  },
  constructBuildOTCOrder,
  constructSignOTCOrder,
  constructPostOTCOrder
);

const DAI = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const HEX = '0x2b591e99afe9f32eaa6214f7b7629768c40eeb39';

const orderInput = {
  nonce: 1,
  expiry: Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 7, // week from now, in sec
  makerAsset: DAI,
  takerAsset: HEX,
  makerAmount: (1e18).toString(10),
  takerAmount: (8e18).toString(10),
  maker: wallet.address,
  taker: takerAccount,
};

async function run() {
  const signableOrderData: SignableOrderData = await OTCOrderSDK.buildOTCOrder(
    orderInput
  );

  const signature: string = await OTCOrderSDK.signOTCOrder(signableOrderData);

  const orderToPostToApi: OTCOrderToPost = {
    ...signableOrderData.data,
    signature,
  };

  const newOrder = await OTCOrderSDK.postOTCOrder(orderToPostToApi);
  console.log(newOrder);
}

run();
