import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { Clusterables } from '../models/clusterables-enum';
import { VisualizationData } from '../models/visualization-data';
import featureOneClusters from '../../mock/feature1/clusters.json';
import featureOneSSE from '../../mock/feature1/sse.json';
import featureTwoClusters from '../../mock/feature2/clusters.json';
import featureTwoSSE from '../../mock/feature2/sse.json';
import radarClusters from '../../mock/radar/clusters.json';
import radarSSE from '../../mock/radar/sse.json';
import { VisualizationsDataConcreteService } from './visualizations-data-concrete.service';
import { RadarChartDataMapper } from '../mappers/radar-chart-data-mapper';
import { ClusterVisualizationDataMapper } from '../mappers/cluster-visualization-data-mapper';
import { SseDataMapper } from '../mappers/sse-data-mapper';

/**
 * This class serves for deploy to serge for demonstration purposes
 */
@Injectable({
  providedIn: 'root',
})
export class MockedRestService extends VisualizationsDataConcreteService {
  getData(trainingDefinitionId: number, numOfClusters: number, instanceIds: number[], level: number): any {
    console.log(
      'Mock data for TD' +
        trainingDefinitionId +
        ', TI ' +
        instanceIds +
        ', level ' +
        level +
        '. Number of clusters set to ' +
        numOfClusters,
    );
    switch (this._selectedFeature) {
      case Clusterables.WrongFlags:
        return of(ClusterVisualizationDataMapper.fromDTO({ featureOneClusters }));
      case Clusterables.TimeAfterHint:
        return of(ClusterVisualizationDataMapper.fromDTO({ featureTwoClusters }));
      default:
        return new Observable<VisualizationData>();
    }
  }
  getRadarData(trainingDefinitionId: number, numOfClusters: number, instanceIds: number[], level: number): any {
    console.log(
      'Mock data for TD' +
        trainingDefinitionId +
        ', TI ' +
        instanceIds +
        ', level ' +
        level +
        '. Number of clusters set to ' +
        numOfClusters,
    );
    return of(RadarChartDataMapper.fromDTO(radarClusters));
  }
  getLineData(trainingDefinitionId: number, numOfClusters: number, instanceIds: number[], level: number) {
    console.log(
      'Mock data for TD' +
        trainingDefinitionId +
        ', TI ' +
        instanceIds +
        ', level ' +
        level +
        '. Number of clusters set to ' +
        numOfClusters,
    );
    switch (this._selectedFeature) {
      case Clusterables.WrongFlags:
        return of(SseDataMapper.fromDTO(featureOneSSE));
      case Clusterables.TimeAfterHint:
        return of(SseDataMapper.fromDTO(featureTwoSSE));
      case Clusterables.NDimensional:
        return of(SseDataMapper.fromDTO(radarSSE));
      default:
        return new Observable<VisualizationData>();
    }
  }
}