import { fromHex, fromText, paymentCredentialOf } from '@lucid-evolution/lucid';
import { createProposal, fromSystemParamsAsset } from '../../src';
import { processSuccessfulProposal } from '../gov/actions';
import { AssetClass } from '@3rd-eye-labs/cardano-offchain-common';
import { findGov } from '../gov/governance-queries';
import { IndigoTestContext, runAndAwaitTxBuilder } from '../test-helpers';
import { findRandomCdpCreator } from '../cdp/cdp-queries';
import { findIAsset } from '../queries/iasset-queries';
import { Rational, rationalFromInt } from '../../src/types/rational';

export async function runCreateStableswapPool(
  iasset: string,
  collateralAsset: AssetClass,
  context: IndigoTestContext,
  ratioAssets?: Rational,
  mintingFeeRatio?: Rational,
  redemptionFeeRatio?: Rational,
): Promise<void> {
  const feeManager = fromHex(
    paymentCredentialOf(context.users.admin.address).hash,
  );
  const [tx, pollId] = await createProposal(
    {
      ProposeStableswapPool: {
        iasset: fromHex(fromText(iasset)),
        collateralAsset: collateralAsset,
        collateralToIassetRatio: ratioAssets
          ? ratioAssets
          : rationalFromInt(1n),
        mintingFeeRatio: mintingFeeRatio
          ? mintingFeeRatio
          : { numerator: 5n, denominator: 1_000n },
        redemptionFeeRatio: redemptionFeeRatio
          ? redemptionFeeRatio
          : { numerator: 5n, denominator: 1_000n },
        feeManager: feeManager,
        minMintingAmount: 0n,
        minRedemptionAmount: 0n,
        stableswapValHash: fromHex(
          context.systemParams.validatorHashes.stableswapHash,
        ),
      },
    },
    null,
    context.systemParams,
    context.lucid,
    context.emulator.slot,
    (
      await findGov(
        context.lucid,
        context.systemParams.validatorHashes.govHash,
        fromSystemParamsAsset(context.systemParams.govParams.govNFT),
      )
    ).utxo,
    undefined,
  );

  await runAndAwaitTxBuilder(context.lucid, tx);

  const iassetReference = await findIAsset(
    context.lucid,
    context.systemParams.validatorHashes.iassetHash,
    fromSystemParamsAsset(context.systemParams.cdpParams.iAssetAuthToken),
    'iUSD',
  );

  const cdpCreatorUtxo = await findRandomCdpCreator(
    context.lucid,
    context.systemParams.validatorHashes.cdpCreatorHash,
    fromSystemParamsAsset(context.systemParams.cdpCreatorParams.cdpCreatorNft),
  );

  await processSuccessfulProposal(
    pollId,
    null,
    null,
    iassetReference.utxo,
    null,
    null,
    cdpCreatorUtxo,
    context.systemParams,
    context,
  );
}
