//
// Copyright 2022 Vulcanize, Inc.
//

import assert from 'assert';
import path from 'path';

import { BaseProvider } from '@ethersproject/providers';
import { GraphDatabase, EventData } from '@cerc-io/util';

import { instantiate } from './loader';
import exampleAbi from '../test/subgraph/example1/build/Example1/abis/Example1.json';
import { storageLayout } from '../test/artifacts/Example1.json';
import { getTestDatabase, getTestIndexer, getTestProvider, getDummyEventData } from '../test/utils';
import { Indexer } from '../test/utils/indexer';

xdescribe('storage-call wasm tests', () => {
  let exports: any;
  let db: GraphDatabase;
  let indexer: Indexer;
  let provider: BaseProvider;

  const contractAddress = process.env.EXAMPLE_CONTRACT_ADDRESS;
  assert(contractAddress);

  const data = {
    abis: {
      Example1: exampleAbi
    },
    dataSource: {
      address: contractAddress,
      network: 'mainnet',
      name: 'Example1'
    }
  };

  let dummyEventData: EventData;

  before(async () => {
    db = getTestDatabase();
    indexer = getTestIndexer(new Map([['Example1', storageLayout]]));
    provider = getTestProvider();

    // Create dummy test data.
    dummyEventData = await getDummyEventData();
  });

  it('should load the subgraph example wasm', async () => {
    const filePath = path.resolve(__dirname, '../test/subgraph/example1/build/Example1/Example1.wasm');
    const instance = await instantiate(
      db,
      indexer,
      provider,
      {
        rpcSupportsBlockHashParam: true,
        block: dummyEventData.block,
        contractAddress
      },
      filePath,
      data
    );
    exports = instance.exports;
    const { _start } = exports;

    // Important to call _start for built subgraphs on instantiation!
    // TODO: Check api version https://github.com/graphprotocol/graph-node/blob/6098daa8955bdfac597cec87080af5449807e874/runtime/wasm/src/module/mod.rs#L533
    _start();
  });

  it('should execute contract getStorageValue function', async () => {
    const { testGetStorageValue } = exports;

    await testGetStorageValue();
  });

  it('should execute getStorageValue function for mapping type variable', async () => {
    const { testMapStorageValue } = exports;

    await testMapStorageValue();
  });
});
