import BN from 'bn.js';
import type { SingleChainOrder } from '../orders/single-chain.js';
import { PublicKey } from '@solana/web3.js';
import jsUtilities from 'js-sha3';

export function genSecretHashAndNumber(order: SingleChainOrder): {
  secretHash: number[];
  secretNumber: string;
} {
  const tokenOut = new PublicKey(order.tokenOut);
  const receiver = new PublicKey(order.destinationAddress);

  const extraTransfers = order.extraTransfers ?? [];
  const secretNumber = new BN(crypto.getRandomValues(new Uint8Array(8)));

  const fullArray = [
    ...tokenOut.toBuffer(),
    ...receiver.toBuffer(),
    ...Buffer.concat(
      extraTransfers.map((t) =>
        Buffer.concat([new PublicKey(t.token).toBuffer(), new PublicKey(t.receiver).toBuffer()]),
      ),
    ),
    ...secretNumber.toArrayLike(Buffer, 'le', 8),
  ];

  const value = jsUtilities.keccak256(Uint8Array.from(fullArray));
  const secretHash = [...Uint8Array.from(Buffer.from(value, 'hex'))];

  return { secretHash, secretNumber: secretNumber.toString() };
}
