import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';

import { Store } from '@ngrx/store';
import { Dataset } from '../../metamodel/model';
import { SearchMultipleQueryParams } from "../store/model";
import { ConeSearch } from "../../shared/cone-search/store/model";
import * as searchMultipleActions from '../store/search-multiple.action';
import * as datasetActions from '../../metamodel/action/dataset.action';
import * as fromSearchMultiple from '../store/search-multiple.reducer';
import * as fromMetamodel from '../../metamodel/reducers';
import * as searchMultipleSelector from '../store/search-multiple.selector';
import * as metamodelSelector from '../../metamodel/selectors';
import * as coneSearchSelector from '../../shared/cone-search/store/cone-search.selector';
import { ScrollTopService } from '../../shared/service/sroll-top.service';


interface StoreState {
    searchMultiple: fromSearchMultiple.State;
    metamodel: fromMetamodel.State;
}

@Component({
    selector: 'app-position',
    templateUrl: 'position.component.html',
    styleUrls: ['position.component.css']
})
export class PositionComponent implements OnInit {
    public datasetSearchMetaIsLoading: Observable<boolean>;
    public datasetSearchMetaIsLoaded: Observable<boolean>;
    public currentStep: Observable<string>;
    public datasetList: Observable<Dataset[]>;
    public isValidConeSearch: Observable<boolean>;
    public coneSearch: Observable<ConeSearch>;
    public queryParams: Observable<SearchMultipleQueryParams>;

    constructor(private store: Store<StoreState>, private scrollTopService: ScrollTopService) {
        this.datasetSearchMetaIsLoading = store.select(metamodelSelector.getDatasetSearchMetaIsLoading);
        this.datasetSearchMetaIsLoaded = store.select(metamodelSelector.getDatasetSearchMetaIsLoaded);
        this.currentStep = store.select(searchMultipleSelector.getCurrentStep);
        this.datasetList = store.select(metamodelSelector.getDatasetList);
        this.isValidConeSearch = this.store.select(coneSearchSelector.getIsValidConeSearch);
        this.coneSearch = this.store.select(coneSearchSelector.getConeSearch);
        this.queryParams = this.store.select(searchMultipleSelector.getQueryParams);
    }

    ngOnInit() {
        // Create a micro task that is processed after the current synchronous code
        // This micro task prevent the expression has changed after view init error
        Promise.resolve(null).then(() => this.store.dispatch(new searchMultipleActions.InitSearchByUrlAction()));
        Promise.resolve(null).then(() => this.store.dispatch(new searchMultipleActions.ChangeStepAction('position')));
        this.store.dispatch(new datasetActions.LoadDatasetSearchMetaAction());
        this.scrollTopService.setScrollTop();
    }

    checkStep(): void {
        this.store.dispatch(new searchMultipleActions.PositionCheckedAction());
    }
}