import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { IInstitution, ISector } from './interfaces/institution';
import * as d3 from 'd3';
import { shareReplay, switchMap } from 'rxjs/operators';
import { environment } from 'src/environments/environment';
import { Observable, of } from 'rxjs';

@Injectable({
  providedIn: 'root',
})
export class DataService {
  dimensionOptions = this.http
    .get<Metric[]>('assets/options.json')
    .pipe(shareReplay(1));

  constructor(private http: HttpClient) {}

  async loadData(): Promise<IData> {
    const data = await this.http
      .get<ISector>(`${environment.api}institutions`)
      .toPromise();
    const repoData = await this.http
      .get<ISector>(`${environment.api}repositories`)
      .toPromise();
    return {
      csvData: this.parseJSON2CSV(data),
      jsonData: data,
    };
  }

  async loadRepoData(): Promise<any> {
    const repoData = await this.http
      .get<ISector>(`${environment.api}repositories`)
      .toPromise();
    return {
      csvData: this.parseJSON2CSV(repoData),
      jsonData: repoData,
    };
  }

  async loadUserData(): Promise<any> {
    const userData = await this.http
      .get<ISector>(`${environment.api}users`)
      .toPromise();
    return {
      csvData: this.parseJSON2CSV(userData),
      jsonData: userData,
    };
  }

  loadDataObservable(): Observable<any> {
    return this.http.get(`${environment.api}institutions`).pipe(
      switchMap((data) => {
        return of({
          csvData: this.parseJSON2CSV(data),
          jsonData: data,
        });
      })
    );
  }

  private parseJSON2CSV(data: any): any {
    return data as d3.DSVRowArray;
  }
}
export interface IData {
  jsonData: ISector;
  csvData: any[];
}

export interface Metric {
  key: string;
  friendly_name: string;
  description: string;
}