import { SafeFactory } from "@safe-global/protocol-kit";
import { PRIVATE_KEY_1, PRIVATE_KEY_2, PRIVATE_KEY_3, PUBLIC_KEY_1, PUBLIC_KEY_2, PUBLIC_KEY_3 } from "../config";
import { EthersAdapter } from "@safe-global/protocol-kit";
import { ethers } from "ethers";
import { SdkConfig } from "@ingocollatz/sdk";
import Web3 from "web3";
import HDWalletProvider from "@truffle/hdwallet-provider";
import { Web3Adapter } from "@safe-global/protocol-kit";


// Ethers
(async (): Promise<void> => {
  const provider = new ethers.providers.JsonRpcProvider(SdkConfig._rpcUrl);

  console.log("Initializing signers and EthersAdapter...");

  const safeSigner1 = new ethers.Wallet(PRIVATE_KEY_1, provider);
  const safeSigner2 = new ethers.Wallet(PRIVATE_KEY_2, provider);
  const safeSigner3 = new ethers.Wallet(PRIVATE_KEY_3, provider);

  const ethAdapterOwner = new EthersAdapter({
    ethers,
    signerOrProvider: safeSigner1,
  });

  console.log("Creating a Safe Factory...");

  const safeFactory = await SafeFactory.create({ ethAdapter: ethAdapterOwner });

  console.log("Deploying a Safe...");

  const safe = await safeFactory.deploySafe({
    safeAccountConfig: {
      owners: [
        await safeSigner1.getAddress(),
        await safeSigner2.getAddress(),
        await safeSigner3.getAddress(),
      ],
      threshold: 1,
    },
    options: {
      gasLimit: 10000000,
    },
  });

  console.log("Successfully deployed Safe at: ", await safe.getAddress());
})();

// Web3
// const web3 = new Web3();

// (async (): Promise<void> => {
//   try {
//     console.log("Initializing HDWalletProvider...");
//     const provider = new HDWalletProvider(
//       {
//         privateKeys: [PRIVATE_KEY_1.slice(2)],
//         providerOrUrl: SdkConfig._rpcUrl,
//       },
//     );

//     web3.setProvider(<any>provider);

//     console.log("Initializing EthersAdapter...");

//     const ethAdapterOwner = new Web3Adapter({
//       web3,
//       signerAddress: PUBLIC_KEY_1,
//     });

//     provider.engine.stop();


//     console.log("Creating a Safe Factory...");

//     const safeFactory = await SafeFactory.create({ ethAdapter: ethAdapterOwner });

//     console.log("Deploying a Safe...");

//     const safe = await safeFactory.deploySafe({
//       safeAccountConfig: {
//         owners: [
//           PUBLIC_KEY_1,
//           PUBLIC_KEY_2,
//           PUBLIC_KEY_3,
//         ],
//         threshold: 1,
//       },
//     });

//     console.log("Successfully deployed Safe at: ", safe.getAddress());

//   } catch (error) {
//     console.log(error);
//   }
// })();
