import { LucidEvolution, UTxO } from '@lucid-evolution/lucid';
import { createScriptAddress } from '../../src';
import { option as O, function as F } from 'fp-ts';
import {
  AssetClass,
  assetClassToUnit,
  assetClassValueOf,
  getRandomElement,
  matchSingle,
} from '@3rd-eye-labs/cardano-offchain-common';

export async function findAllInterestCollectors(
  lucid: LucidEvolution,
  interestCollectorScriptHash: string,
): Promise<UTxO[]> {
  return lucid.utxosAt(
    createScriptAddress(lucid.config().network!, interestCollectorScriptHash),
  );
}

export async function findAdminInterestCollectors(
  lucid: LucidEvolution,
  interestCollectorScriptHash: string,
  multisigUtxoNft: AssetClass,
): Promise<UTxO> {
  return matchSingle(
    await lucid.utxosAtWithUnit(
      createScriptAddress(lucid.config().network!, interestCollectorScriptHash),
      assetClassToUnit(multisigUtxoNft),
    ),
    (_) => new Error('Expected a single admin interest collector UTXO'),
  );
}

export async function findRandomNonAdminInterestCollector(
  lucid: LucidEvolution,
  interestCollectorScriptHash: string,
  multisigUtxoNft: AssetClass,
): Promise<UTxO> {
  const allCollectors = (
    await findAllInterestCollectors(lucid, interestCollectorScriptHash)
  ).filter((utxo) => !assetClassValueOf(utxo.assets, multisigUtxoNft));

  return F.pipe(
    O.fromNullable(getRandomElement(allCollectors)),
    O.match(() => {
      throw new Error('Expected some non-admin interest collector UTXOs.');
    }, F.identity),
  );
}
