import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { SlutredovisningResponseMainOccupationDetails } from '@msfa-models/api/slutredovisning.response.model';
import { DeltagareAvrop } from '@msfa-models/avrop.model';
import { CustomError } from '@msfa-models/error/custom-error';
import { MainOccupation, Slutredovisning } from '@msfa-models/slutredovisning.model';
import { BehaviorSubject, Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';
import { SlutredovisningFormData } from '../models/slutredovisning-form-data.model';
import { SlutredovisningFormService } from '../slutredovisning-form.service';
import { slutredovisningFormDataToSlutredovisningRequest } from '../utils/forms-to-slutredovisning-form-data';

@Component({
  selector: 'msfa-slutredovisning-form-step3',
  templateUrl: './slutredovisning-form-step3.component.html',
  styleUrls: ['./slutredovisning-form-step3.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class SlutredovisningFormStep3Component implements OnInit {
  @Output() backClick = new EventEmitter<void>();
  @Input() slutredovisningFormData: SlutredovisningFormData;
  @Input() avrop: DeltagareAvrop;

  submitIsLoading$ = new BehaviorSubject<boolean>(false);
  submitError$ = new BehaviorSubject<CustomError>(null);
  submittedDate$ = new BehaviorSubject<Date | null>(null);

  slutredovisning$: Observable<SlutredovisningFormData>;

  goBack(): void {
    this.backClick.emit();
  }

  constructor(private slutredovisningFormService: SlutredovisningFormService) {}

  submitSlutredovisning(): void {
    this.submitIsLoading$.next(true);

    const toBeSubmitted = slutredovisningFormDataToSlutredovisningRequest(this.slutredovisningFormData);
    this.slutredovisningFormService.submitSlutredovisning$(toBeSubmitted).subscribe({
      next: () => {
        this.submitIsLoading$.next(false);
        this.submittedDate$.next(new Date());
      },
      error: (customError: CustomError) => {
        this.submitError$.next({ ...customError, message: customError.error.message });
        this.submitIsLoading$.next(false);
        throw { ...customError, avoidToast: true };
      },
    });
  }

  ngOnInit(): void {
    this.slutredovisning$ =
      this.slutredovisningFormData?.mainOccupation?.type === MainOccupation.Work
        ? this.slutredovisningFormService.yrkeToTextMap$.pipe(
            map(yrkeToText => this._formDataWithWorkToSlutredovisning(this.slutredovisningFormData, yrkeToText))
          )
        : of(this.slutredovisningFormData as Slutredovisning);
  }

  private _formDataWithWorkToSlutredovisning(
    slutredovisningFormData: SlutredovisningFormData,
    yrkeToText: { [key: string]: string }
  ): Slutredovisning {
    if (slutredovisningFormData.mainOccupation.type !== MainOccupation.Work) {
      throw new Error('Only use this method if MainOccupation is Work');
    }

    const newMainOccupation: SlutredovisningResponseMainOccupationDetails = {
      ...slutredovisningFormData.mainOccupation,
      work: slutredovisningFormData.mainOccupation.work.map(yrke => ({
        ...yrke,
        yrkesomradeName: yrkeToText[yrke.yrkesomrade],
        yrkesgruppName: yrkeToText[yrke.yrkesgrupp],
      })),
    };
    return { ...slutredovisningFormData, mainOccupation: newMainOccupation };
  }
}
