import { Injectable } from "@angular/core";

import { of as observableOf, Observable, throwError } from "rxjs";
import { HttpClient, HttpHeaders } from "@angular/common/http";
import { retry, catchError, map, timeout } from "rxjs/operators";

import { environment } from "@environments/environment";

@Injectable({
  providedIn: "root"
})
export class IncomesService {
  time: number = 6000;

  constructor(private http: HttpClient) {}

  // Obtener listado de propuestas de inversiones
  getProjectionsIncomeList(active: string = "1", currentDate: string = "1") {
    return this.http
      .get<any>(
        `${environment.productionApiUrl}/proyecciones?activos=${active}&fecha_actual=${currentDate}`
      )
      .pipe(
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  // Obtener propuesta de inversion segun ID
  searchProjectionsIncomeByInstrument(query: string) {
    return this.http
      .get<any>(
        `${environment.productionApiUrl}/proyecciones?instrumento=${query}`
      )
      .pipe(
        timeout(this.time),
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  searchProjectionsIncomeByDate(
    start_date: string,
    end_date: string
  ): Observable<boolean> {
    return this.http
      .get<any>(
        `${environment.productionApiUrl}/proyecciones?fecha_desde=${start_date}&fecha_hasta=${end_date}`
      )
      .pipe(
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  getProjection(
    id_inversion: string,
    id_proyeccion_ingreso_instrumento: string,
    fecha_proyeccion_pago: string,
    id_proyeccion_instrumento?: string
  ): Observable<boolean> {
    let url;
    if (id_proyeccion_instrumento != undefined) {
      url = `?id_inversion=${id_inversion}&id_proyeccion_ingreso_instrumento=${id_proyeccion_ingreso_instrumento}&fecha_proyeccion_pago=${fecha_proyeccion_pago}&id_proyeccion_ingreso=${id_proyeccion_instrumento}`;
    } else {
      url = `?id_inversion=${id_inversion}&id_proyeccion_ingreso_instrumento=${id_proyeccion_ingreso_instrumento}&fecha_proyeccion_pago=${fecha_proyeccion_pago}`;
    }
    return this.http
      .get<any>(`${environment.productionApiUrl}/proyeccion${url}`)
      .pipe(
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  getProjectionIncome(instrument: string, id: string): Observable<boolean> {
    return this.http
      .get<any>(
        `${environment.productionApiUrl}/proyeccion/${instrument}/${id}`
      )
      .pipe(
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  createIncome(income: Object): Observable<boolean> {
    return this.http
      .post<any>(`${environment.productionApiUrl}/ingreso`, income)
      .pipe(
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  conciliateIncome(income: Object): Observable<boolean> {
    return this.http
      .post<any>(`${environment.productionApiUrl}/conciliacion`, income)
      .pipe(
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  updateProposalInvestment(id: string, inversion: Object): Observable<boolean> {
    return this.http
      .put<any>(`${environment.productionApiUrl}/inversion/${id}`, inversion)
      .pipe(
        map(response => {
          return response;
        }),
        catchError(this.errorHandl)
      );
  }

  //if(error.error instanceof ErrorEvent) {
  errorHandl(error) {
    let errorMessage = "";
    if (error.error) {
      // Get client-side error
      errorMessage = error.error;
    } else {
      // Get server-side error
      errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`;
    }
    return throwError(errorMessage);
  }
}
