import { Injectable } from '@angular/core';
import { Activity, mapResponseToActivity } from '@msfa-models/activity.model';
import { SlutredovisningRequest } from '@msfa-models/api/slutredovisning.request.model';
import { DeltagareAvrop } from '@msfa-models/avrop.model';
import { mapResponseToYrkesomrade, Yrkesomrade, yrkeToTextMap } from '@msfa-models/yrkesomrade.model';
import { DeltagareApiService } from '@msfa-services/api/deltagare.api.service';
import { GemensamPlaneringApiService } from '@msfa-services/api/gemensam-planering-api.service';
import { SlutredovisningApiService } from '@msfa-services/api/slutredovisning.api.service';
import { BehaviorSubject, Observable } from 'rxjs';
import { map, shareReplay } from 'rxjs/operators';
import { SlutredovisningStep0FormData } from './slutredovisning-form-step0/slutredovisning-form-step0.component';
import { SlutredovisningStep1FormData } from './slutredovisning-form-step1/slutredovisning-form-step1.component';
import { SlutredovisningStep2FormData } from './slutredovisning-form-step2/slutredovisning-form-step2.component';
import { SlutredovisningStep } from './slutredovisning-form.model';

@Injectable()
export class SlutredovisningFormService {
  private _currentStep$ = new BehaviorSubject<SlutredovisningStep>('step0');
  currentStep$ = this._currentStep$.asObservable();

  private _step0FormData$ = new BehaviorSubject<SlutredovisningStep0FormData | null>(null);
  step0FormData$ = this._step0FormData$.asObservable();
  private _step1FormData$ = new BehaviorSubject<SlutredovisningStep1FormData | null>(null);
  step1FormData$ = this._step1FormData$.asObservable();

  private _step2FormData$ = new BehaviorSubject<SlutredovisningStep2FormData | null>(null);

  yrkesomraden$: Observable<Yrkesomrade[]> = this.slutredovisningApiService.fetchYrken$().pipe(
    map(({ data }) => data.map(yo => mapResponseToYrkesomrade(yo))),
    shareReplay(1)
  );

  yrkeToTextMap$: Observable<{ [key: string]: string }> = this.yrkesomraden$.pipe(
    map(yrkesomraden => yrkeToTextMap(yrkesomraden))
  );

  step2FormData$ = this._step2FormData$.asObservable();

  constructor(
    private slutredovisningApiService: SlutredovisningApiService,
    private deltagareApiService: DeltagareApiService,
    private gemensamPlaneringApiService: GemensamPlaneringApiService
  ) {}
  setStep(step: SlutredovisningStep): void {
    this._currentStep$.next(step);
  }

  submitSlutredovisning$(slutredovisning: SlutredovisningRequest): Observable<unknown> {
    return this.slutredovisningApiService.submitSlutredovisning$(slutredovisning);
  }

  fetchAvropInformation$(genomforandeReferens: number): Observable<DeltagareAvrop> {
    return this.deltagareApiService.fetchAvropInformation$(genomforandeReferens);
  }

  processStep0Data(formData: SlutredovisningStep0FormData): void {
    this._step0FormData$.next(formData);
    this.setStep('step1');
  }

  processStep1Data(formData: SlutredovisningStep1FormData): void {
    this._step1FormData$.next(formData);
    this.setStep('step2');
  }

  processStep2Data(formData: SlutredovisningStep2FormData): void {
    this._step2FormData$.next(formData);
    this.setStep('step3');
  }

  getAllChosenActivities(genomforandeReferens: number): Observable<Activity[]> {
    return this.gemensamPlaneringApiService
      .fetchAllChosenActivities(genomforandeReferens)
      .pipe(map(({ data }) => data.map(activity => mapResponseToActivity(activity))));
  }
}
