import {
  applyParamsToScript,
  applySingleCborEncoding,
  SpendingValidator,
} from '@lucid-evolution/lucid';
import { castExecuteParams, ExecuteParams } from './types';
import {
  ExecuteParamsSP,
  fromSystemParamsAssetLucid,
} from '../../types/system-params';
import { _executeValidator } from '../../validators/execute-validator';

export const mkExecuteValidator = (
  params: ExecuteParams,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applySingleCborEncoding(
      applyParamsToScript(_executeValidator.cborHex, [
        castExecuteParams(params),
      ]),
    ),
  };
};

export const mkExecuteValidatorFromSP = (
  params: ExecuteParamsSP,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applySingleCborEncoding(
      applyParamsToScript(_executeValidator.cborHex, [
        castExecuteParams({
          govNFT: fromSystemParamsAssetLucid(params.govNFT),
          upgradeToken: fromSystemParamsAssetLucid(params.upgradeToken),
          iAssetToken: fromSystemParamsAssetLucid(params.iAssetToken),
          collateralAssetToken: fromSystemParamsAssetLucid(
            params.collateralAssetToken,
          ),
          stabilityPoolToken: fromSystemParamsAssetLucid(
            params.stabilityPoolToken,
          ),
          cdpCreatorToken: fromSystemParamsAssetLucid(params.cdpCreatorToken),
          cdpToken: fromSystemParamsAssetLucid(params.cdpToken),
          versionRecordToken: fromSystemParamsAssetLucid(
            params.versionRecordToken,
          ),
          iassetValHash: params.iassetValHash,
          cdpValHash: params.cdpValHash,
          sPoolValHash: params.sPoolValHash,
          versionRegistryValHash: params.versionRegistryValHash,
          treasuryValHash: params.treasuryValHash,
        }),
      ]),
    ),
  };
};
