import { assert, beforeEach, test } from 'vitest';
import { LucidContext } from './test-helpers';
import { addAssets, EmulatorAccount, Lucid } from '@lucid-evolution/lucid';
import { Emulator } from '@lucid-evolution/lucid';
import { generateEmulatorAccount } from '@lucid-evolution/lucid';
import { DEFAULT_INTEREST, iusdInitialAssetCfg } from './mock/assets-mock';
import {
  EXAMPLE_TOKEN_1,
  MAINNET_PROTOCOL_PARAMETERS,
} from './indigo-test-helpers';
import {
  mkAssetsOf,
  mkLovelacesOf,
} from '@3rd-eye-labs/cardano-offchain-common';
import { rationalFromInt } from '../src/types/rational';
import { init } from './endpoints/initialize';

type MyContext = LucidContext<{
  admin: EmulatorAccount;
}>;

beforeEach<MyContext>(async (context: MyContext) => {
  context.users = {
    admin: generateEmulatorAccount(
      addAssets(
        mkLovelacesOf(100_000_000_000_000n),
        mkAssetsOf(EXAMPLE_TOKEN_1, 1_000_000_000_000_000n),
      ),
    ),
  };

  context.emulator = new Emulator(
    [context.users.admin],
    MAINNET_PROTOCOL_PARAMETERS,
  );

  context.lucid = await Lucid(context.emulator, 'Custom');
});

test<MyContext>('Initialize Protocol - can initialize', async ({
  lucid,
  users,
  emulator,
}: MyContext) => {
  lucid.selectWallet.fromSeed(users.admin.seedPhrase);

  await init(
    lucid,
    [
      iusdInitialAssetCfg(DEFAULT_INTEREST, [
        {
          collateralAsset: EXAMPLE_TOKEN_1,
          collateralToIassetRatio: rationalFromInt(1n),
          feeManager: undefined,
          minMintOrderAmount: 0n,
          minRedemptionOrderAmount: 0n,
          mintingEnabled: true,
          redemptionEnabled: true,
          mintingFeeRatio: { numerator: 1n, denominator: 100n },
          redemptionFeeRatio: { numerator: 1n, denominator: 100n },
        },
      ]),
    ],
    emulator.slot,
  );
});

test<MyContext>('Validate Lucid protocol parameters match Mainnet', ({
  lucid,
}: MyContext) => {
  const protocolParameters = lucid.config().protocolParameters!;
  assert(
    protocolParameters.maxTxSize === 16384,
    'Lucid maxTxSize does not match Cardano Mainnet',
  );
  assert(
    protocolParameters.maxTxExMem === 16500000n,
    'Lucid maxTxExMem does not match Cardano Mainnet',
  );
  assert(
    protocolParameters.maxTxExSteps === 10000000000n,
    'Lucid maxTxExSteps does not match Cardano Mainnet',
  );
});
