import { Injectable }                   from '@angular/core';
import { Router, NavigationEnd }        from '@angular/router';


import { SharedService }               from './svc.shared';
import { HelperService }               from './svc.helper';
import { Subject }                      from 'rxjs/Subject';

@Injectable()
export class BreadCrumbsService {
    
    constructor(
        private router: Router,
        private _shared: SharedService,
        private _helper: HelperService
    ) {
        router.events.subscribe((val) => {
            if(val instanceof NavigationEnd) {
                this.setBreadcrumb(val.url);
            }
        });
    }

    currentCrumbPathSource = new Subject<Object[]>();
    currentCrumbPath$ = this.currentCrumbPathSource.asObservable();

    setBreadcrumb(url:string) {
        let splitUrl        = url.split('/'); 
        let tempCrumbs      = [];
        let pathUntilNow    = '';

        // TODO: Change case so they use functions instead!
        
        for(let i = 0; splitUrl.length > i; i++) {
            switch(i) {

                case 0:
                    // Home crumb should only be shown if not on front-page
                    if(splitUrl[1].length > 1) {
                        tempCrumbs.push({name: 'Home', link: '/'});
                        pathUntilNow += '/';
                    }
                    break;
                

                case 1:
                    // If url contains categories
                    if(!!!splitUrl[i].indexOf(this._helper.categories) ) { // tripple bangs (!!!) because the opposite of -1 is false...
                        tempCrumbs.push({name: 'Collections', link: pathUntilNow + this._helper.categories });
                        pathUntilNow += this._helper.categories;
                    }
                    // If designers, materials or media
                    else if(!!!splitUrl[i].indexOf('designers') || !!!splitUrl[i].indexOf('materials') || !!!splitUrl[i].indexOf('media')) {
                        tempCrumbs.push({ name: splitUrl[1], link: pathUntilNow + splitUrl[i] })
                        pathUntilNow += splitUrl[i]
                    }
                    // If search without result
                    else if(!!!splitUrl[i].indexOf('search')) {
                        tempCrumbs.push({name: splitUrl[i], link: pathUntilNow + splitUrl[i] });
                        pathUntilNow += splitUrl[i];
                    }
                    else if(!!!splitUrl[i].indexOf('studio')) {
                        tempCrumbs.push({name: splitUrl[i], link: pathUntilNow + splitUrl[i] });
                        pathUntilNow += splitUrl[i];
                    }
                    // else default to page
                    else {
                        this._shared.currentPage$.subscribe(result => {
                            tempCrumbs.push({name: result, link: pathUntilNow + splitUrl[i] });
                            pathUntilNow += splitUrl[i];
                        });
                    }
                    break;
                

                case 2:


                    // if designers, materials or media, assign child as key in breadcrumb
                    if(!!!splitUrl[1].indexOf('designers') || !!!splitUrl[1].indexOf('materials') || !!!splitUrl[1].indexOf('media')) {
                        tempCrumbs.push({ name: splitUrl[i], link: pathUntilNow + splitUrl[i] })
                    }

                    if(!!!splitUrl[1].indexOf('studio')) {
                        tempCrumbs.push({ name: splitUrl[i], link: pathUntilNow + splitUrl[i]  })
                    }

                    // If collection
                    this._shared.currentCollection$.subscribe(result => {
                        let collectionName = splitUrl[i]; // Set default value for collection

                        for(let index = 0; result.length > index; index++) {
                            let collection = result[index];
                            if(collection.urlkey == splitUrl[i]) {
                                collectionName = collection.name;
                            }
                        };

                        tempCrumbs.push({name: collectionName, link: pathUntilNow + '/' + splitUrl[i] });
                        pathUntilNow += '/' + splitUrl[i];
                    });
                    break;


                case 3:
                    // If product
                    this._shared.currentProduct$.subscribe(result => {
                        tempCrumbs.push({name: result, link: pathUntilNow + '/' + splitUrl[i] });
                        pathUntilNow += '/' + splitUrl[i];
                    });
                    break;
            }
        }

        this.currentCrumbPathSource.next(tempCrumbs);

    }
}