import { ImportSourceElement } from 'app/client/lib/ImportSourceElement';
import { createRpcLogger, PluginInstance } from 'app/common/PluginInstance';
import { FileListItem } from 'app/plugin/grist-plugin-api';
import { assert } from 'chai';
import { Rpc } from 'grain-rpc';

// assign console to logger to show logs
const logger = {};

describe("ImportSourceElement.importSourceStub#getImportSource()", function() {
  it("should accept buffer for FileContent.content", async function() {
    const plugin = createImportSourcePlugin({
      getImportSource: () => (Promise.resolve({
        item: {
          kind: "fileList",
          files: [{
            content: new Uint8Array([1, 2]),
            name: "MyFile"
          }]
        }
      }))
    });
    const importSourceStub = ImportSourceElement.fromArray([plugin])[0].importSourceStub;
    const res = await importSourceStub.getImportSource(0);
    assert.equal((res!.item as FileListItem).files[0].name, "MyFile");
    assert.deepEqual((res!.item as FileListItem).files[0].content, new Uint8Array([1, 2]));
  });
});

// Helper that creates a plugin which contributes importSource.
function createImportSourcePlugin(importSource: any): PluginInstance {
  const plugin = new PluginInstance({
    id: "",
    path: "",
    manifest: {
      components: {
        safeBrowser: "index.html"
      },
      contributions: {
        importSources: [{
          label: "Importer",
          importSource: {
            component: "safeBrowser",
            name: "importer"
          }
        }]
      }
    },
  }, createRpcLogger(logger, "plugin instance"));
  const rpc = new Rpc({logger: createRpcLogger(logger, 'rpc')});
  rpc.setSendMessage((mssg: any) => rpc.receiveMessage(mssg));
  rpc.registerImpl("importer", importSource);
  plugin.rpc.registerForwarder("index.html", rpc);
  return plugin;
}