import { Injectable, NgModule, NgZone } from '@angular/core';
import { MicrofrontendPlatform } from '@scion/microfrontend-platform';
import { ActivatedRouteSnapshot, Resolve, RouterModule, RouterStateSnapshot, Routes } from '@angular/router';

// tag::resolver[]
@Injectable({providedIn: 'root'})
export class PlatformInitializer implements Resolve<void> {

  constructor(private _zone: NgZone) { // <1>
  }

  public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<void> {
    return this._zone.runOutsideAngular(() => MicrofrontendPlatform.connectToHost('<SYMBOLIC NAME>')); // <2>
  }
}

// end::resolver[]

class Microfrontend1Component {
}

class Microfrontend2Component {
}

// tag::resolver-registration[]
const routes: Routes = [
  {
    path: '',
    resolve: {platform: PlatformInitializer}, // <1>
    children: [ // <2>
      {
        path: 'microfrontend-1',
        loadChildren: () => import('./microfrontend-1.module').then(m => m.Microfrontend1Module),
      },
      {
        path: 'microfrontend-2',
        loadChildren: () => import('./microfrontend-2.module').then(m => m.Microfrontend1Module),
      },
    ],
  },
];

@NgModule({
  imports: [RouterModule.forRoot(routes, {useHash: true})],
  exports: [RouterModule],
})
export class AppRoutingModule {
}

// end::resolver-registration[]