import sqlite3InitModule from './jswasm/sqlite3-wasmfs.mjs';
const wMsg = (type,...args)=>{
  postMessage({type, args});
};
wMsg('log',"speedtest1-wasmfs starting...");
/**
   If this environment contains OPFS, this function initializes it and
   returns the name of the dir on which OPFS is mounted, else it returns
   an empty string.
*/
const wasmfsDir = function f(wasmUtil,dirName="/opfs"){
  if(undefined !== f._) return f._;
  if( !globalThis.FileSystemHandle
      || !globalThis.FileSystemDirectoryHandle
      || !globalThis.FileSystemFileHandle){
    return f._ = "";
  }
  try{
    if(0===wasmUtil.xCallWrapped(
      'sqlite3__wasm_init_wasmfs', 'i32', ['string'], dirName
    )){
      return f._ = dirName;
    }else{
      return f._ = "";
    }
  }catch(e){
    // sqlite3_wasm_init_wasmfs() is not available
    return f._ = "";
  }
};
wasmfsDir._ = undefined;

const log = (...args)=>wMsg('log',...args);
const logErr = (...args)=>wMsg('logErr',...args);

const runTests = function(sqlite3){
  console.log("Module inited.",sqlite3);
  const wasm = sqlite3.wasm;
  const __unlink = wasm.xWrap("sqlite3__wasm_vfs_unlink", "int", ["*","string"]);
  const unlink = (fn)=>__unlink(0,fn);
  const pDir = wasmfsDir(wasm);
  if(pDir) log("Persistent storage:",pDir);
  else{
    logErr("Expecting persistent storage in this build.");
    return;
  }
  const scope = wasm.scopedAllocPush();
  const dbFile = pDir+"/speedtest1.db";
  const urlParams = new URL(globalThis.location.href).searchParams;
  const argv = ["speedtest1"];
  if(urlParams.has('flags')){
    argv.push(...(urlParams.get('flags').split(',')));
    let i = argv.indexOf('--vfs');
    if(i>=0) argv.splice(i,2);
  }else{
    argv.push(
      "--singlethread",
      "--nomutex",
      //"--nosync",
      "--nomemstat",
      "--size", "10"
    );
  }

  if(argv.indexOf('--memdb')>=0){
    logErr("WARNING: --memdb flag trumps db filename.");
  }
  argv.push("--big-transactions"/*important for tests 410 and 510!*/,
            dbFile);
  //log("argv =",argv);
  // These log messages are not emitted to the UI until after main() returns. Fixing that
  // requires moving the main() call and related cleanup into a timeout handler.
  if(pDir) unlink(dbFile);
  log("Starting native app:\n ",argv.join(' '));
  log("This will take a while and the browser might warn about the runaway JS.",
      "Give it time...");
  setTimeout(function(){
    if(pDir) unlink(dbFile);
    wasm.xCall('wasm_main', argv.length,
               wasm.scopedAllocMainArgv(argv));
    wasm.scopedAllocPop(scope);
    if(pDir) unlink(dbFile);
    log("Done running native main()");
  }, 25);
}/*runTests()*/;

sqlite3InitModule({
  print: log,
  printErr: logErr
}).then(runTests);
