import { applyParamsToScript, SpendingValidator } from '@lucid-evolution/lucid';
import {
  fromSystemParamsAssetLucid,
  IAssetParamsSP,
} from '../../types/system-params';
import { _cdpValidator } from '../../validators/cdp-validator';
import { _iassetValidator } from '../../validators/iasset-validator';

import { Data } from '@lucid-evolution/lucid';
import { AssetClassSchema } from '../../types/generic';

const IAssetScriptParamsSchema = Data.Object({
  upgradeToken: AssetClassSchema,
  versionRecordToken: AssetClassSchema,
});

export type IAssetScriptParams = Data.Static<typeof IAssetScriptParamsSchema>;
export const IAssetScriptParams =
  IAssetScriptParamsSchema as unknown as IAssetScriptParams;

export const mkIAssetValidatorFromSP = (
  params: IAssetParamsSP,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applyParamsToScript(_iassetValidator.cborHex, [
      Data.castTo(
        {
          upgradeToken: fromSystemParamsAssetLucid(params.upgradeToken),
          versionRecordToken: fromSystemParamsAssetLucid(
            params.versionRecordToken,
          ),
        },
        IAssetScriptParams,
      ),
    ]),
  };
};
