import {ChangeDetectionStrategy, Component, inject} from '@angular/core';
import {toObservable} from '@angular/core/rxjs-interop';
import {
ConnectedApplication,
ConnectedApplicationParameter,
NshmpConnectedApplicationsComponent,
nshmpUtils,
} from '@ghsc/nshmp-lib-ng/nshmp';
import {ControlType} from 'projects/nshmp-apps/src/app/designmaps/rtgm/models/control-type.model';
import {apps} from 'projects/nshmp-apps/src/shared/utils/applications.utils';
import {combineLatest, map, Observable} from 'rxjs';
import {AppService} from '../../services/app.service';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [NshmpConnectedApplicationsComponent],
selector: 'app-connected-applications',
styleUrl: './connected-applications.component.scss',
templateUrl: './connected-applications.component.html',
})
export class ConnectedApplicationsComponent {
private service = inject(AppService);
private formGroup = this.service.formGroup;
connectedApplications: ConnectedApplication[] = [
{
application: apps().hazard.dynamic,
description: 'Open the dynamic hazard application using the current control panel inputs',
parameters$: this.dynamicParameters$(),
},
{
application: apps().designMaps.rtgm,
description: 'Open the RTGM application using the current control panel inputs',
parameters$: this.rtgmParameters$(),
},
{
application: apps().source.modelMaps,
description: 'Open the model maps application using the current NSHM',
parameters$: this.modelParameters$(),
},
{
application: apps().ncm.geophysicalProfiles,
description: 'Open the NCM geophysical profiles applications using the current location',
parameters$: this.geophysicalParameters$(),
},
{
application: apps().source.mfd,
description: 'Open the magnitude frequency distribution application using the current NSHM',
parameters$: this.modelParameters$(),
},
{
application: apps().source.rateAndProbability,
description:
'Open the rates and probabilities application using the current control panel inputs',
parameters$: this.ratesParameters$(),
},
];
private dynamicParameters$(): Observable<ConnectedApplicationParameter[]> {
return combineLatest([
this.formGroup.valueChanges,
toObservable(this.service.availableModels),
]).pipe(
map(([values, availableModels]) => {
const parameters: ConnectedApplicationParameter[] = [
{
key: 'model',
value: values.model,
valueDisplay: nshmpUtils.parameterToDisplay(values.model ?? '', availableModels),
},
{key: 'maxDirection', value: values.maxDirection},
{key: 'latitude', units: '°', value: values.latitude},
{key: 'returnPeriod', units: 'years', value: values.returnPeriod},
{key: 'longitude', units: '°', value: values.longitude},
{key: 'siteClass', value: values.siteClass},
{key: 'vs30', units: 'm/s', value: values.vs30},
];
return parameters;
}),
);
}
private geophysicalParameters$(): Observable<ConnectedApplicationParameter[]> {
return this.formGroup.valueChanges.pipe(
map(values => {
return [
{
gridColumn: 12,
key: 'location',
value: `${values.latitude}, ${values.longitude}`,
valueDisplay: [
`${this.service.checkNanDisplay(values.latitude)}°`,
`${this.service.checkNanDisplay(values.longitude)}°`,
].join(),
},
];
}),
);
}
private modelParameters$(): Observable<ConnectedApplicationParameter[]> {
return combineLatest([
this.formGroup.valueChanges,
toObservable(this.service.availableModels),
]).pipe(
map(([values, availableModels]) => {
const parameters: ConnectedApplicationParameter[] = [
{
gridColumn: 12,
key: 'model',
value: values.model,
valueDisplay: nshmpUtils.parameterToDisplay(values.model ?? '', availableModels),
},
];
return parameters;
}),
);
}
private ratesParameters$(): Observable<ConnectedApplicationParameter[]> {
return combineLatest([
this.formGroup.valueChanges,
toObservable(this.service.availableModels),
]).pipe(
map(([values, availableModels]) => {
const parameters: ConnectedApplicationParameter[] = [
{
gridColumn: 12,
key: 'model',
value: values.model,
valueDisplay: nshmpUtils.parameterToDisplay(values.model ?? '', availableModels),
},
{gridColumn: 12, key: 'latitude', units: '°', value: values.latitude},
{gridColumn: 12, key: 'longitude', units: '°', value: values.longitude},
];
return parameters;
}),
);
}
private rtgmParameters$(): Observable<ConnectedApplicationParameter[]> {
return combineLatest([
this.formGroup.valueChanges,
toObservable(this.service.availableModels),
]).pipe(
map(([values, availableModels]) => {
const parameters: ConnectedApplicationParameter[] = [
{
key: 'model',
value: values.model,
valueDisplay: nshmpUtils.parameterToDisplay(values.model ?? '', availableModels),
},
{key: 'imt', value: values.imt},
{key: 'latitude', units: '°', value: values.latitude},
{key: 'returnPeriod', units: 'years', value: values.returnPeriod},
{key: 'longitude', units: '°', value: values.longitude},
{key: 'siteClass', value: values.siteClass},
{key: 'vs30', units: 'm/s', value: values.vs30},
{key: 'controlType', value: ControlType.DYNAMIC_HAZARD},
];
return parameters;
}),
);
}
}