// CC0 license.
// taken from (credits): https://soliditydeveloper.com/merkle-tree 
const keccak256 = require("keccak256");
const { MerkleTree } = require("merkletreejs");

const Web3 = require("web3");

const web3 = new Web3();


/**
 * generates the proof offchain using the  PII information of the user and associated it with the other parameter details.
 * 
 */

async function generateProof() {

// consider the given information that is verified privately off-chain  (storing with wallet, name, age, personal ID, jurisdiction) 
// they will be considered as leaves for the application.
const personalIdentifiedInfo = ["0x00000a86986129038908a9808098-toto-18-99123456-France", "0x00000a86986129038908a9808098-john-20-1276546-England"].map(x => keccak256(x));
const tree = new MerkleTree(leaves,keccak256);

}


/**
 * this checks the ownership of the information from requirement (stored onchain) and then verify whether the keccak256 representation is a member of the given proof. 
 * we follow the checkProof  
 */
async function verifyRequirement(verifyingAddress,leafNodes) {
const buf2hex = x => '0x'+x.toString('hex')
const leaf = keccak256('0x00000a86986129038908a9808098-toto-18-99123456-France')

const leafInfo = buf2hex(leaf);

const hexproof = tree.getProof(leaf).map(x => buf2hex(x.data));

const positions = tree.getProof(leaf).map(x => x.position === 'right' ? 1 : 0)



//TODO: fetch the 
const SBTCertification = await web3.eth.Contract();

const verifiedOnchain = await SBTCertification.ifVerified(verifyingAddress, leafNodes);

assert.equal(MerkleTree.verify(proof,leaf,root), verifiedOnchain);

}



const root = tree.getRoot();


// this is the root generated by claim verifier, by doing the operations offchain.
const hexroot = buf2hex(root);

const merkleTree = new MerkleTree(leafNodes, keccak256, { sortPairs: true });

console.log("---------");
console.log("Merke Tree");
console.log("---------");
console.log(merkleTree.toString());
console.log("---------");
console.log("Merkle Root: " + merkleTree.getHexRoot());

console.log("Proof 1: " + merkleTree.getHexProof(leafNodes[0]));
console.log("Proof 2: " + merkleTree.getHexProof(leafNodes[1]));
