import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { throwError, Observable } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { ConfigService } from './config.service';
import { Course } from './models/course';
import { DegreePlan } from './models/degree-plan';
import { Term } from './models/term';
import { FavoriteCourse } from './models/favorite-course';

const httpOptions = {
	headers: new HttpHeaders({
		'Content-Type':  'application/json'
	})
};

@Injectable()
export class DataService {
	private plannerApiUrl: string;
	private searchApiUrl: string;

	constructor(private http: HttpClient, private configService: ConfigService) {
		this.plannerApiUrl = this.configService.apiPlannerUrl;
		this.searchApiUrl = this.configService.apiSearchUrl;
	}

	getDegreePlans(): Observable<DegreePlan[]> {
		return this.http.get<DegreePlan[]>(this.plannerApiUrl + '/degreePlan')
			.pipe(catchError(this.errorHandler));
	}

	getDegreePlannerCourseData(): Observable<Course[]> {
		return this.http.get<Course[]>(this.plannerApiUrl + '/degreePlan/520224/courses')
			.pipe(catchError(this.errorHandler));
	}

	getTerms(): Observable<Term[]> {
		return this.http.get<Term[]>(this.searchApiUrl + '/terms')
			.pipe(catchError(this.errorHandler));
	}

	getFavoriteCourses(): Observable<FavoriteCourse[]> {
		return this.http.get<FavoriteCourse[]>(this.plannerApiUrl + '/favorites')
			.pipe(catchError(this.errorHandler));
	}

	saveFavoriteCourse(subjectCode: string, courseId: string): Observable<FavoriteCourse> {
		return this.http.post<FavoriteCourse>(this.plannerApiUrl + 'favorites/' + subjectCode + '/' + courseId, httpOptions)
		.pipe(catchError(this.errorHandler));
	}

	removeFavoriteCourse(subjectCode, courseId): Observable<FavoriteCourse> {
		return this.http.delete<FavoriteCourse>(this.plannerApiUrl + 'favorites/' + subjectCode + '/' + courseId, httpOptions)
		.pipe(catchError(this.errorHandler));
	}

	private errorHandler(error: HttpErrorResponse) {
		return throwError(error || 'Server Error');
	}
}