/**
 * Test endpoint for protocol initialization.
 * Re-exports from the initialize contract and provides a test-friendly init() wrapper
 * that uses protocolParamsMock and optional initPyth when pythConfig is not provided.
 */

import type { LucidEvolution } from '@lucid-evolution/lucid';
import type { ScriptCredential } from '../../src';
import type { ProtocolParams } from '../../src/contracts/gov/types-new';
import {
  init as initContract,
  initPythConfig,
} from '../../src/contracts/initialize/actions';
import {
  mintOneTimeToken,
  DEFAULT_INIT_OPTIONS,
} from '../../src/contracts/initialize/helpers';
import type {
  AssetInfo,
  CollateralAssetInfo,
  InitialAssetParam,
  InitializeOptions,
} from '../../src/contracts/initialize/types';
import { protocolParamsMock } from '../mock/protocol-params-mock';
import { AssetClass } from '@3rd-eye-labs/cardano-offchain-common';

export type {
  AssetInfo,
  CollateralAssetInfo,
  InitialAssetParam,
  InitializeOptions,
};
export { initPythConfig, mintOneTimeToken, DEFAULT_INIT_OPTIONS };

/**
 * Initialize the protocol (test helper).
 * Uses protocolParamsMock merged with overrideProtocolParams.
 * If pythConfig is not provided, initializes Pyth via initPyth + initPythConfig.
 * Uses DEFAULT_INIT_OPTIONS when initOptions is not provided.
 */
export async function init(
  lucid: LucidEvolution,
  defaultInitialAssets: InitialAssetParam[],
  currentSlot: number,
  mkPythBasedAssets: (
    pythStateNft: AssetClass,
  ) => InitialAssetParam[] = () => [],
  overrideProtocolParams: Partial<ProtocolParams> = {},
  initOptions: InitializeOptions = DEFAULT_INIT_OPTIONS,
  spStakingCred: ScriptCredential = {
    tag: 'StakingHash',
    contents: {
      tag: 'ScriptCredential',
      contents: 'b8358aadd30c60eba168608ad5e875592e9b7cb8c700827cde87f9a3',
    },
  },
  treasuryStakingCred: ScriptCredential = {
    tag: 'StakingHash',
    contents: {
      tag: 'ScriptCredential',
      contents: 'b8358aadd30c60eba168608ad5e875592e9b7cb8c700827cde87f9a3',
    },
  },
): Promise<ReturnType<typeof initContract>> {
  const protocolParams: ProtocolParams = {
    ...protocolParamsMock,
    ...overrideProtocolParams,
  };

  return initContract(
    lucid,
    defaultInitialAssets,
    currentSlot,
    mkPythBasedAssets,
    protocolParams,
    initOptions,
    spStakingCred,
    treasuryStakingCred,
  );
}
