import { applyParamsToScript, SpendingValidator } from '@lucid-evolution/lucid';
import { castStabilityPoolParams, StabilityPoolParams } from './types';
import {
  fromSysParamsStakeCredential,
  fromSystemParamsAssetLucid,
  StabilityPoolParamsSP,
} from '../../types/system-params';
import { _stabilityPoolValidator } from '../../validators/stability-pool-validator';

export const mkStabilityPoolValidator = (
  params: StabilityPoolParams,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applyParamsToScript(_stabilityPoolValidator.cborHex, [
      castStabilityPoolParams(params),
    ]),
  };
};

export const mkStabilityPoolValidatorFromSP = (
  params: StabilityPoolParamsSP,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applyParamsToScript(_stabilityPoolValidator.cborHex, [
      castStabilityPoolParams({
        assetSymbol: params.assetSymbol.unCurrencySymbol,
        stabilityPoolToken: fromSystemParamsAssetLucid(
          params.stabilityPoolToken,
        ),
        snapshotEpochToScaleToSumToken: fromSystemParamsAssetLucid(
          params.snapshotEpochToScaleToSumToken,
        ),
        accountToken: fromSystemParamsAssetLucid(params.accountToken),
        cdpToken: fromSystemParamsAssetLucid(params.cdpToken),
        iAssetAuthToken: fromSystemParamsAssetLucid(params.iAssetAuthToken),
        versionRecordToken: fromSystemParamsAssetLucid(
          params.versionRecordToken,
        ),
        iassetValHash: params.iassetValHash,
        accountCreateFeeLovelaces: BigInt(params.accountCreateFeeLovelaces),
        accountProcessingCooldownMs: BigInt(params.accountProcessingCooldownMs),
        accountProcessingBiasMs: BigInt(params.accountProcessingBiasMs),
        stakeCredential: params.stakeCredential
          ? fromSysParamsStakeCredential(params.stakeCredential)
          : null,
      }),
    ]),
  };
};
