import { createSelector, createFeatureSelector } from '@ngrx/store';

import * as searchMultiple from './search-multiple.reducer';
import { getConeSearch, getIsValidConeSearch } from '../../shared/cone-search/store/cone-search.selector';
import { ConeSearch } from '../../shared/cone-search/store/model';
import { SearchMultipleQueryParams } from './model';


export const getSearchMultipleState = createFeatureSelector<searchMultiple.State>('searchMultiple');

export const getCurrentStep = createSelector(
    getSearchMultipleState,
    searchMultiple.getCurrentStep
);

export const getPositionStepChecked = createSelector(
    getSearchMultipleState,
    searchMultiple.getPositionStepChecked
);

export const getDatasetsStepChecked = createSelector(
    getSearchMultipleState,
    searchMultiple.getDatasetsStepChecked
);

export const getResultStepChecked = createSelector(
    getSearchMultipleState,
    searchMultiple.getResultStepChecked
);

export const getSelectedDatasets = createSelector(
    getSearchMultipleState,
    searchMultiple.getSelectedDatasets
);

export const getNoSelectedDatasets = createSelector(
    getSelectedDatasets,
    (
        selectedDatasets: string[]) => {
        return selectedDatasets.length === 0;

    }
);

export const getQueryParams = createSelector(
    getIsValidConeSearch,
    getConeSearch,
    getSelectedDatasets,
    (
        isValidConeSearch: boolean,
        coneSearch: ConeSearch,
        selectedDatasets: string[]) => {
        let queryParams: SearchMultipleQueryParams = { };
        if (isValidConeSearch) {
            queryParams = {
                ...queryParams,
                cs: coneSearch.ra + ':' + coneSearch.dec + ':' + coneSearch.radius
            };
        }
        if (selectedDatasets.length > 0) {
            queryParams = {
                ...queryParams,
                d: selectedDatasets.join(';')
            };
        }
        return queryParams;
    }
);

export const getDatasetsCountIsLoading = createSelector(
    getSearchMultipleState,
    searchMultiple.getDatasetsCountIsLoading
);

export const getDatasetsCountIsLoaded = createSelector(
    getSearchMultipleState,
    searchMultiple.getDatasetsCountIsLoaded
);

export const getDatasetsCount = createSelector(
    getSearchMultipleState,
    searchMultiple.getDatasetsCount
);

export const getDatasetsWithData = createSelector(
    getSearchMultipleState,
    searchMultiple.selectIds
);

export const getAllData = createSelector(
    getSearchMultipleState,
    searchMultiple.selectEntities
);

export const getSelectedData = createSelector(
    getSearchMultipleState,
    searchMultiple.getSelectedData
);