import { describe } from "mocha";

import { getAssociatedTokenAddressSync } from "@solana/spl-token";
import { PublicKey } from "@solana/web3.js";

import {
	SolmashWhitelistInstructions,
	SolmashWhitelistProgramFactory,
	SolmashWhitelistService,
} from "../../src";
import { getConnection, getProviders, getSignTransaction, nowInSec } from "../shared";

describe("initAuction()", () => {
	const connection = getConnection("devnet");
	const provider = getProviders(connection)[0];
	const signTransaction = getSignTransaction(provider);

	const program = SolmashWhitelistProgramFactory.getProgram(provider, { network: "devnet" });
	const inx = new SolmashWhitelistInstructions(program);
	const service = new SolmashWhitelistService(inx, connection, signTransaction);

	let tokenInPools: number;
	let auctionName: string;

	it("initialize auction", async () => {
		const now = nowInSec();
		const preSaleStartTime = now + 60 * 1;
		const preSaleEndTime = preSaleStartTime + 60 * 15;
		console.log({ preSaleStartTime }, { preSaleEndTime });

		const auctionTokenAddress = "8CSvK7xceqUeqRaPr91r5kgteXGcWmBL48aoUQCtdizq";
		const bidTokenAddress = "De31sBPcDejCVpZZh1fq8SNs7AcuWcBKuU3k2jqnkmKc";
		const ownerAddress = provider.publicKey.toString();

		const data = {
			ownerAddress,
			bidTokenAddress,
			auctionTokenAddress,
			name: "test wl auction 003",
			enabled: true,
			preSaleEndTime,
			preSaleStartTime,
			ticketPriceInSobb: "30",
			ticketPriceInSol: "1",
			ticketsInPool: "30",
			tokenQuantityPerTicket: "100",
		};

		tokenInPools = Number(data.ticketsInPool) * Number(data.tokenQuantityPerTicket);
		auctionName = data.name;

		const payload = await service.initAuction(data);

		const signature = await payload.execute({ commitment: "finalized" });

		console.log({ signature });
	});

	it("adds token", async () => {
		console.log("waiting before adding tokens");
		await new Promise((r) => setTimeout(r, 10000));

		const ownerAddress = provider.publicKey.toString();
		const auctionTokenAddress = "8CSvK7xceqUeqRaPr91r5kgteXGcWmBL48aoUQCtdizq";
		const auction = SolmashWhitelistService.deriveAuctionAddress(auctionName, program.programId);

		// test assert setup
		const ownerAuctionTokenAccount = getAssociatedTokenAddressSync(
			new PublicKey(auctionTokenAddress),
			new PublicKey(ownerAddress),
		);
		const auctionVault = SolmashWhitelistService.deriveAuctionVaultAddress(
			auction,
			program.programId,
		);
		const auctionVaultTokenAccount = getAssociatedTokenAddressSync(
			new PublicKey(auctionTokenAddress),
			auctionVault,
			true,
		);

		const { value: ownerAtaBalBefore } = await connection.getTokenAccountBalance(
			ownerAuctionTokenAccount,
			"confirmed",
		);
		console.log({ ownerAtaBalBefore });

		const payload = await service.addToken({
			ownerAddress,
			auctionAddress: auction.toString(),
			auctionTokenAddress,
		});

		// console.log({ payload });
		const signature = await payload.execute();
		console.log({ signature });

		const { value: ownerAtaBalAfter } = await connection.getTokenAccountBalance(
			ownerAuctionTokenAccount,
			"confirmed",
		);
		const { value: auctionVaultAtaBalAfter } = await connection.getTokenAccountBalance(
			auctionVaultTokenAccount,
			"confirmed",
		);

		console.log({ ownerAtaBalAfter });
		console.log({ auctionVaultAtaBalAfter });

		console.log({ tokenInPools });
	});
});
