import { applyParamsToScript, SpendingValidator } from '@lucid-evolution/lucid';
import {
  castPollManagerParams,
  PollManagerParams,
} from '../poll/types-poll-manager';
import {
  PollManagerParamsSP,
  PollShardParamsSP,
  fromSystemParamsAssetLucid,
} from '../../types/system-params';
import { castPollShardParams, PollShardParams } from './types-poll-shard';
import { _pollManagerValidator } from '../../validators/poll-manager-validator';
import { _pollShardValidator } from '../../validators/poll-shard-validator';

export const mkPollManagerValidator = (
  params: PollManagerParams,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applyParamsToScript(_pollManagerValidator.cborHex, [
      castPollManagerParams(params),
    ]),
  };
};

export const mkPollManagerValidatorFromSP = (
  params: PollManagerParamsSP,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applyParamsToScript(_pollManagerValidator.cborHex, [
      castPollManagerParams({
        govNFT: fromSystemParamsAssetLucid(params.govNFT),
        pollToken: fromSystemParamsAssetLucid(params.pollToken),
        upgradeToken: fromSystemParamsAssetLucid(params.upgradeToken),
        indyAsset: fromSystemParamsAssetLucid(params.indyAsset),
        govExecuteValHash: params.govExecuteValHash,
        pBiasTime: BigInt(params.pBiasTime),
        shardValHash: params.shardsValHash,
        treasuryValHash: params.treasuryValHash,
      }),
    ]),
  };
};

export const mkPollShardValidator = (
  params: PollShardParams,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applyParamsToScript(_pollShardValidator.cborHex, [
      castPollShardParams(params),
    ]),
  };
};

export const mkPollShardValidatorFromSP = (
  params: PollShardParamsSP,
): SpendingValidator => {
  return {
    type: 'PlutusV3',
    script: applyParamsToScript(_pollShardValidator.cborHex, [
      castPollShardParams({
        pollToken: fromSystemParamsAssetLucid(params.pollToken),
        stakingToken: fromSystemParamsAssetLucid(params.stakingToken),
        indyAsset: fromSystemParamsAssetLucid(params.indyAsset),
        stakingValHash: params.stakingValHash,
      }),
    ]),
  };
};
