import { describe, expect, it } from 'vitest';
import {
  loadSystemParamsFromFile,
  mkCDPCreatorValidatorFromSP,
  mkInterestOracleValidator,
  mkRobValidatorFromSP,
  mkCdpValidatorFromSP,
  mkExecuteValidatorFromSP,
  mkCollectorValidatorFromSP,
  mkInterestCollectionValidatorFromSP,
  mkTreasuryValidatorFromSP,
} from '../src';
import { validatorToScriptHash } from '@lucid-evolution/lucid';
import { mkStabilityPoolValidatorFromSP } from '../src/contracts/stability-pool/scripts';
import { mkGovValidatorFromSP } from '../src/contracts/gov/scripts';
import { mkStakingValidatorFromSP } from '../src/contracts/staking/scripts';
import { mkStableswapValidatorFromSP } from '../src/contracts/stableswap/scripts';

const systemParams = loadSystemParamsFromFile(
  './tests/data/system-params.json',
);

describe('Validator Hash checks', () => {
  it.todo('CDP Creator validator hash', () => {
    expect(
      validatorToScriptHash(
        mkCDPCreatorValidatorFromSP(systemParams.cdpCreatorParams),
      ),
    ).toBe(systemParams.validatorHashes.cdpCreatorHash);
  });
  it.todo('CDP validator hash', () => {
    expect(
      validatorToScriptHash(mkCdpValidatorFromSP(systemParams.cdpParams)),
    ).toBe(systemParams.validatorHashes.cdpHash);
  });
  it.todo('Collector validator hash', () => {
    expect(
      validatorToScriptHash(
        mkCollectorValidatorFromSP(systemParams.collectorParams),
      ),
    ).toBe(systemParams.validatorHashes.collectorHash);
  });
  it.todo('Interest collector validator hash', () => {
    expect(
      validatorToScriptHash(
        mkInterestCollectionValidatorFromSP(
          systemParams.interestCollectionParams,
        ),
      ),
    ).toBe(systemParams.validatorHashes.interestCollectionHash);
  });
  // TODO: Revisit this test, issues with cbor encoding on Lucid?
  // Applying parameters to the validator using `aiken build` does not result in the same hash as the one generate by Lucid.
  it.todo('Execute validator hash', () => {
    expect(
      validatorToScriptHash(
        mkExecuteValidatorFromSP(systemParams.executeParams),
      ),
    ).toBe(systemParams.validatorHashes.executeHash);
  });
  it.todo('Gov validator hash', () => {
    expect(
      validatorToScriptHash(mkGovValidatorFromSP(systemParams.govParams)),
    ).toBe(systemParams.validatorHashes.govHash);
  });
  it.todo('Staking validator hash', () => {
    expect(
      validatorToScriptHash(
        mkStakingValidatorFromSP(systemParams.stakingParams),
      ),
    ).toBe(systemParams.validatorHashes.stakingHash);
  });
  it.todo('Stability Pool validator hash', () => {
    expect(
      validatorToScriptHash(
        mkStabilityPoolValidatorFromSP(systemParams.stabilityPoolParams),
      ),
    ).toBe(systemParams.validatorHashes.stabilityPoolHash);
  });
  it.todo('Stableswap validator hash', () => {
    expect(
      validatorToScriptHash(
        mkStableswapValidatorFromSP(systemParams.stableswapParams),
      ),
    ).toBe(systemParams.validatorHashes.stabilityPoolHash);
  });

  it.todo('Interest Oracle validator hash', () => {
    expect(
      validatorToScriptHash(
        mkInterestOracleValidator({
          biasTime: 1_200_000n,
          owner: 'a962c79bd58fc9fcecd78f8a963e0ce80e907264cd86cd5814d87333',
        }),
      ),
    ).toBe('b970b3e0e1b591840627e6919898c12ee57e2f0225ab03e056d10d52');
  });

  it.todo('ROB validator hash', () => {
    expect(
      validatorToScriptHash(mkRobValidatorFromSP(systemParams.robParams)),
    ).toBe(systemParams.validatorHashes.robHash);
  });

  it.todo('Treasury validator hash', () => {
    expect(
      validatorToScriptHash(
        mkTreasuryValidatorFromSP(systemParams.treasuryParams),
      ),
    ).toBe(systemParams.validatorHashes.treasuryHash);
  });
});
