import { NgModuleRef, ApplicationRef } from "@angular/core";
import { createNewHosts } from "@angularclass/hmr";

export const hmrBootstrap = (
  module: any,
  bootstrap: () => Promise<NgModuleRef<any>>
) => {
	let ngModule: NgModuleRef<any>;
	module.hot.accept();
	// module.hot.decline("./node_modules/@angular/platform-browser-dynamic/fesm5/platform-browser-dynamic.js");
  bootstrap().then(mod => {
      ngModule = mod;
      (<any>window).appBootstrap && (<any>window).appBootstrap(); 
  });

  // var lastHash;
	// var upToDate = function upToDate() {
	// 	return lastHash.indexOf(window['__webpack_hash__']) >= 0;
	// };
	// var log = function (type, text){
  //   console.info(type + " = " + text);
  // };
  // if (module.hot.status() === "idle") {
	// 	module.hot
	// 		.check()
	// 		.then(function(updatedModules) {
	// 			if (!updatedModules) {
	// 				log("warning", "[HMR] Cannot find update. Need to do a full reload!");
	// 				log(
	// 					"warning",
	// 					"[HMR] (Probably because of restarting the webpack-dev-server)"
	// 				);
	// 				return;
	// 			}
	// 			log("info",JSON.stringify(updatedModules))
	// 			return module.hot
	// 				.apply({
	// 					ignoreUnaccepted: true,
	// 					ignoreDeclined: true,
	// 					ignoreErrored: true,
	// 					onUnaccepted: function(data) {
	// 						log(
	// 							"warning",
	// 							"Ignored an update to unaccepted module " +
	// 								data.chain.join(" -> ")
	// 						);
	// 					},
	// 					onDeclined: function(data) {
	// 						log(
	// 							"warning",
	// 							"Ignored an update to declined module " +
	// 								data.chain.join(" -> ")
	// 						);
	// 					},
	// 					onErrored: function(data) {
	// 						log("error", data.error);
	// 						log(
	// 							"warning",
	// 							"Ignored an error while updating module " +
	// 								data.moduleId +
	// 								" (" +
	// 								data.type +
	// 								")"
	// 						);
	// 					}
	// 				})
	// 				.then(function(renewedModules) {
	// 					if (!upToDate()) {
	// 						// check();
	// 					}

	// 					// require("./log-apply-result")(updatedModules, renewedModules);

	// 					if (upToDate()) {
	// 						log("info", "[HMR] App is up to date.");
	// 					}
	// 				});
	// 		})
	// 		.catch(function(err) {
	// 			var status = module.hot.status();
	// 			if (["abort", "fail"].indexOf(status) >= 0) {
	// 				log(
	// 					"warning",
	// 					"[HMR] Cannot check for update. Need to do a full reload!"
	// 				);
	// 				log("warning", "[HMR] " + err.stack || err.message);
	// 			} else {
	// 				log(
	// 					"warning",
	// 					"[HMR] Update check failed: " + err.stack || err.message
	// 				);
	// 			}
  //     });
  // }
  
  module.hot.dispose(() => {
    const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef);
    const elements = appRef.components.map(c => c.location.nativeElement);
    const makeVisible = createNewHosts(elements);
    ngModule.destroy();
    makeVisible();
  });
}