import { HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { StrutturePubblicheControllerFindManyStrutture$Params } from '@api/fn/strutture-pubbliche/strutture-pubbliche-controller-find-many-strutture';
import { LuoghiApiClient, StrutturePubblicheApiClient } from '@api/services';
import { catchError, map, throwError } from 'rxjs';
import { StrutturePubblicheControllerFindManyCittaInStrutture$Params } from '../../../../api/fn/strutture-pubbliche/strutture-pubbliche-controller-find-many-citta-in-strutture';
import { StrutturePubblicheControllerFindManyProvinceInStrutture$Params } from '../../../../api/fn/strutture-pubbliche/strutture-pubbliche-controller-find-many-province-in-strutture';
import { StrutturePubblicheControllerFindManyRegioniInStrutture$Params } from '../../../../api/fn/strutture-pubbliche/strutture-pubbliche-controller-find-many-regioni-in-strutture';
import { StrutturePubblicheControllerFindManyStatiInStrutture$Params } from '../../../../api/fn/strutture-pubbliche/strutture-pubbliche-controller-find-many-stati-in-strutture';

@Injectable({
  providedIn: 'root',
})
export class StrutturePubblicheService {
  constructor(
    private strutturePubblicheApiClient: StrutturePubblicheApiClient,
    private luoghiApiClient: LuoghiApiClient,
  ) {}

  getStrutture(filters: StrutturePubblicheControllerFindManyStrutture$Params) {
    return this.strutturePubblicheApiClient
      .strutturePubblicheControllerFindManyStrutture(filters)
      .pipe(
        map((res) => res),
        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);
      }),
    );
  }

  getStati(flagAttivo: number = 1) {
    const params: StrutturePubblicheControllerFindManyStatiInStrutture$Params =
      {
        flagAttivo,
      };
    return this.strutturePubblicheApiClient
      .strutturePubblicheControllerFindManyStatiInStrutture(params)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getRegioni(codiceStato: string, flagAttivo: number = 1) {
    const params: StrutturePubblicheControllerFindManyRegioniInStrutture$Params =
      {
        codiceStato,
        flagAttivo,
      };
    return this.strutturePubblicheApiClient
      .strutturePubblicheControllerFindManyRegioniInStrutture(params)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getProvince(codiceRegione: string, flagAttivo: number = 1) {
    const params: StrutturePubblicheControllerFindManyProvinceInStrutture$Params =
      {
        codiceRegione,
        flagAttivo,
      };
    return this.strutturePubblicheApiClient
      .strutturePubblicheControllerFindManyProvinceInStrutture(params)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

  getCitta(siglaProvincia: string, flagAttivo: number = 1) {
    const params: StrutturePubblicheControllerFindManyCittaInStrutture$Params =
      {
        siglaProvincia,
        flagAttivo,
      };
    return this.strutturePubblicheApiClient
      .strutturePubblicheControllerFindManyCittaInStrutture(params)
      .pipe(
        catchError((err: HttpErrorResponse) => {
          return throwError(() => err);
        }),
      );
  }

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