// Copyright 2019-2026 @pezkuwi/wasm-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0

/* global it */

import crypto from 'crypto';

import { assert, stringToU8a, u8aToHex } from '@pezkuwi/util';

/**
 * @internal
 * @param {*} pair
 */
function extractKeys (pair) {
  return [pair, pair.slice(64), pair.slice(0, 64)];
}

/**
 * @internal
 * @param {*} wasm
 */
function randomPair (wasm) {
  return extractKeys(wasm.sr25519KeypairFromSeed(crypto.randomBytes(32)));
}

/**
 * @param {*} wasm
 */
export function vrfSignAndVerifyCompat (wasm) {
  it('can sign and verify (1)', () => {
    const [, pk, sk] = randomPair(wasm);
    const outAndProof = wasm.vrfSign(sk, stringToU8a('my VRF context'), stringToU8a('this is a message'), new Uint8Array());
    const isValid = wasm.vrfVerify(pk, stringToU8a('my VRF context'), stringToU8a('this is a message'), new Uint8Array(), outAndProof);

    // console.log('\tVRF', u8aToHex(outAndProof));
    // console.log('\tRES', isValid);

    assert(isValid, 'ERROR: Unable to verify VRF output & proof');
  });
}

/**
 * @param {*} wasm
 */
export function vrfSignAndVerify (wasm) {
  it('can sign and verify (2)', () => {
    const [, pk, sk] = randomPair(wasm);
    const outAndProof = wasm.vrfSign(sk, stringToU8a('my VRF context'), stringToU8a('this is a message'), stringToU8a('extra param'));
    const isValid = wasm.vrfVerify(pk, stringToU8a('my VRF context'), stringToU8a('this is a message'), stringToU8a('extra param'), outAndProof);

    // console.log('\tVRF', u8aToHex(outAndProof));
    // console.log('\tRES', isValid);

    assert(isValid, 'ERROR: Unable to verify VRF extra output & proof');
  });
}

/**
 * @param {*} wasm
 */
export function vrfSignAndVerifyDeterministic (wasm) {
  it('has non-deterministic outputs', () => {
    const [,, sk] = randomPair(wasm);
    const outAndProof1 = wasm.vrfSign(sk, stringToU8a('my VRF context'), stringToU8a('this is a message'), stringToU8a('extra param'));
    const outAndProof2 = wasm.vrfSign(sk, stringToU8a('my VRF context'), stringToU8a('this is a message'), stringToU8a('extra param'));
    const sig1 = u8aToHex(outAndProof1.slice(0, 32));
    const sig2 = u8aToHex(outAndProof2.slice(0, 32));

    // console.log('\tSG1', sig1);
    // console.log('\tSG2', sig2);

    assert(sig1 === sig2, 'ERROR: VRF extra outputs are non-deterministic');
  });
}
