import { HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { LuoghiControllerFindLuogoByAutocomplete$Params } from '@api/fn/luoghi/luoghi-controller-find-luogo-by-autocomplete';
import { StruttureControllerDeleteAllegatoConvenzione$Params } from '@api/fn/strutture/strutture-controller-delete-allegato-convenzione';
import {
  LuoghiApiClient,
  StipulatoriApiClient,
  StruttureApiClient,
} from '@api/services';
import { StatoConvenzioniEnum } from '@core/common/enum/convenzioni.enum';
import { LazyLoadEvent, MessageService } from 'primeng/api';
import { catchError, map, of, throwError } from 'rxjs';
import {
  CreateConvenzioneStruttura,
  CreateStruttura,
  FindStrutture,
  UpdateConvenzioneStruttura,
} from '../../../../api/models';

@Injectable({
  providedIn: 'root',
})
export class StruttureService {
  constructor(
    private struttureApiClient: StruttureApiClient,
    private luoghiApiClient: LuoghiApiClient,
    private readonly messageService: MessageService,
    private stipulatoreApiClient: StipulatoriApiClient,
  ) {}

  getStrutture(filters: FindStrutture) {
    const params = {
      body: filters,
    };
    return this.struttureApiClient
      .struttureControllerFindManyStrutture(params)
      .pipe(
        map((res) => ({ rows: res })),
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getLuoghi(q: string, flagAttivo?: number) {
    const params: LuoghiControllerFindLuogoByAutocomplete$Params = {
      q: q,
      flagAttivo: flagAttivo,
      statiEsteri: 1,
    };

    return this.luoghiApiClient
      .luoghiControllerFindLuogoByAutocomplete(params)
      .pipe(
        map((res) => ({ rows: res, rowsTotalCount: res.length })),
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getLuoghiEsteso(q: string, flagAttivo?: number) {
    const params = {
      q: q,
      flagAttivo: flagAttivo,
    };

    return this.luoghiApiClient.luoghiControllerFindLuogoEsteso(params).pipe(
      map((res) => ({ rows: res, rowsTotalCount: res.length })),
      catchError((err: HttpErrorResponse) => {
        return throwError(() => err);
      }),
    );
  }

  getStrutturaMadre(q: string, flagOnlyStrutturaMadre?: number) {
    const params = {
      q: q,
      flagOnlyStrutturaMadre: flagOnlyStrutturaMadre,
    };

    return this.struttureApiClient
      .struttureControllerFindManyStruttureByAutocomplete(params)
      .pipe(
        map((res) => ({ rows: res, rowsTotalCount: res.length })),
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getValoriStatusConvenzioni() {
    return of([
      {
        label: 'Attive',
        value: StatoConvenzioniEnum.ATTIVO,
      },
      {
        label: 'Chiuse',
        value: StatoConvenzioniEnum.CHIUSO,
      },
      {
        label: 'Tutte',
        value: StatoConvenzioniEnum.TUTTI,
      },
    ]);
  }

  getTipologieStrutture() {
    return this.struttureApiClient
      .struttureControllerFindManyTipiStrutture()
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getStipulatori() {
    return this.stipulatoreApiClient
      .stipulatoriControllerFindManyStipulatori()
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getTipoStrutture() {
    return this.struttureApiClient
      .struttureControllerFindManyTipiStrutture()
      .pipe(
        map((res) => ({ rows: res, rowsTotalCount: res.length })),
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getTipoGestione() {
    return this.struttureApiClient
      .struttureControllerFindManyTipiGestioni()
      .pipe(
        map((res) => ({ rows: res, rowsTotalCount: res.length })),
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getAllStipulatori() {
    return this.stipulatoreApiClient
      .stipulatoriControllerFindManyStipulatori()
      .pipe(
        map((res) => ({ rows: res, rowsTotalCount: res.length })),
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getConvenzioniByStrutturaId(idStruttura: number) {
    const params = {
      id: idStruttura,
    };

    return this.struttureApiClient
      .struttureControllerGetConvenzioniByStrutturaId(params)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getAllegatiByConvenzioneId(idStruttura: number, idConvenzione: number) {
    const params = {
      id: idStruttura,
      idConvenzione: idConvenzione,
    };
    return this.struttureApiClient
      .struttureControllerGetAllegatiConvenzione(params)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  downloadAllegato(
    idStruttura: number,
    idConvenzione: number,
    fileName: string,
  ) {
    const params = {
      id: idStruttura,
      idConvenzione: idConvenzione,
      fileName: fileName,
    };
    return this.struttureApiClient
      .struttureControllerDownloadAllegatoConvenzione(params)
      .pipe(
        catchError((err: unknown) => {
          this.messageService.add({
            severity: 'error',
            summary: 'Oops, qualcosa è andato storto!',
            detail: `Riprova più tardi`,
          });
          return throwError(() => err);
        }),
      );
  }

  exportCSV() {
    return this.struttureApiClient.struttureControllerExportStrutture().pipe(
      catchError((err: unknown) => {
        this.messageService.add({
          severity: 'error',
          summary: 'Oops, qualcosa è andato storto!',
          detail: `Riprova più tardi`,
        });
        return throwError(() => err);
      }),
    );
  }

  createStruttura(params: CreateStruttura) {
    const param = {
      body: params,
    };
    return this.struttureApiClient
      .struttureControllerCreateStruttura(param)
      .pipe(
        catchError((err: unknown) => {
          this.messageService.add({
            severity: 'error',
            summary: 'Oops, qualcosa è andato storto!',
            detail: `Riprova più tardi`,
          });
          return throwError(() => err);
        }),
      );
  }

  editStruttura(id: number, params: any) {
    const param = {
      id: id,
      body: params,
    };
    return this.struttureApiClient
      .struttureControllerUpdateStruttura(param)
      .pipe(
        catchError((err: unknown) => {
          this.messageService.add({
            severity: 'error',
            summary: 'Oops, qualcosa è andato storto!',
            detail: `Riprova più tardi`,
          });
          return throwError(() => err);
        }),
      );
  }

  editVisibilita(id: number, params: any) {
    const param = {
      id: id,
      body: params,
    };
    return this.struttureApiClient
      .struttureControllerUpdateVisibilitaStruttura(param)
      .pipe(
        catchError((err: unknown) => {
          this.messageService.add({
            severity: 'error',
            summary: 'Oops, qualcosa è andato storto!',
            detail: `Riprova più tardi`,
          });
          return throwError(() => err);
        }),
      );
  }

  getStrutturaById(id: number) {
    const params = {
      id: id,
    };

    return this.struttureApiClient
      .struttureControllerGetOneStrutturaById(params)
      .pipe(
        catchError((err: unknown) => {
          this.messageService.add({
            severity: 'error',
            summary: 'Oops, qualcosa è andato storto!',
            detail: `Riprova più tardi`,
          });
          return throwError(() => err);
        }),
      );
  }

  createConvenzione(idStruttura: number, params: CreateConvenzioneStruttura) {
    const param = {
      id: idStruttura,
      body: params,
    };
    return this.struttureApiClient
      .struttureControllerCreateConvenzione(param)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  editConvenzione(
    params: UpdateConvenzioneStruttura,
    strutturaId: number,
    convenzioneId: number,
  ) {
    const param = {
      id: strutturaId,
      idConvenzione: convenzioneId,
      body: params,
    };
    return this.struttureApiClient
      .struttureControllerUpdateConvenzione(param)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  deleteAllegato(params: StruttureControllerDeleteAllegatoConvenzione$Params) {
    return this.struttureApiClient
      .struttureControllerDeleteAllegatoConvenzione(params)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }
}
function convertLazyLoadEvent(arg0: LazyLoadEvent) {
  throw new Error('Function not implemented.');
}
