import { Course } from '@app/core/models/course';
import { Note } from './../models/note';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { groupBy, toArray, mergeMap, flatMap, tap, mergeAll, map, distinct, share } from 'rxjs/operators';

import { DataService } from '@app/core/data.service';

@Injectable({
	providedIn: 'root'
})
export class DegreePlannerDataService {
	degreePlannerData: Observable<any>;
	coursesData$: any;
	termCodes: any;
	planId: number;

	constructor(private dataService: DataService) { }

	getDegreePlanDataById(planId: number) {
		this.planId = planId;
		// this.dataService.test().subscribe(() => {});

		this.degreePlannerData = this.dataService.getDegreePlannerCourseData(planId).pipe(
			map(courses => courses.sort((a, b) => Number(a.termCode) - Number(b.termCode))),
			mergeAll(),
			share()
		);

		this.degreePlannerData.pipe(
			map(course => course.termCode),
			distinct(),
			toArray()
		).subscribe(termCodes => this.termCodes = termCodes);

		this.coursesData$ = this.degreePlannerData.pipe(
			groupBy(course => course.termCode),
			mergeMap(group$ => group$.pipe(toArray())),
			map(course => {
				return {
					termCode: course[0].termCode,
					year: course[0].termCode.substring(1, 3),
					courses: course
				};
			}),
			groupBy(terms => terms.year),
			mergeMap(group$ => group$.pipe(toArray())),
			toArray(),

			tap(x => console.log('new data', x))
		);

		return this.coursesData$;
	}

	getAllTerms() {
		return this.termCodes;
	}

	getAllNotes(): Observable<Note[]> {
		return this.dataService.getAllNotes(this.planId);
	}

	getPlanId(): number {
		return this.planId;
	}
}