import { Action } from '@ngrx/store';

import { Criterion, SearchMeta } from './model';

export const INIT_SEARCH_BY_URL = '[Search] Init Search By Url';
export const CHANGE_STEP = '[Search] Change Search Step';
export const SELECT_DATASET = '[Search] Select Dataset';
export const NEW_SEARCH = '[Search] New Search';
export const CRITERIA_CHECKED = '[Search] Criteria Checked';
export const OUTPUT_CHECKED = '[Search] Output Checked';
export const RESULT_CHECKED = '[Search] Result Checked';
export const UPDATE_CRITERIA_LIST = '[Search] Update Criteria List';
export const ADD_CRITERION = '[Search] Add Criterion';
export const DELETE_CRITERION = '[Search] Delete Criterion';
export const UPDATE_OUTPUT_LIST = '[Search] Update Output List';
export const RETRIEVE_META = '[Search] Retrieve Meta';
export const RETRIEVE_META_SUCCESS = '[Search] Retrieve Meta Success';
export const RETRIEVE_META_FAIL = '[Search] Retrieve Meta Fail';
export const RETRIEVE_DATA = '[Search] Retrieve Data';
export const RETRIEVE_DATA_SUCCESS = '[Search] Retrieve Data Success';
export const RETRIEVE_DATA_FAIL = '[Search] Retrieve Data Fail';
export const ADD_SELECTED_DATA = '[Search] Add Selected Data';
export const DELETE_SELECTED_DATA = '[Search] Delete Selected Data';

export class InitSearchByUrl implements Action {
    type = INIT_SEARCH_BY_URL;

    constructor(public payload: {} = null) { }
}

export class ChangeStepAction implements Action {
    type = CHANGE_STEP;

    constructor(public payload: string) { }
}

export class SelectDatasetAction implements Action {
    type = SELECT_DATASET;

    constructor(public payload: string) { }
}

export class NewSearchAction implements Action {
    type = NEW_SEARCH;

    constructor(public payload: string) { }
}

export class CriteriaChecked implements Action {
    type = CRITERIA_CHECKED;

    constructor(public payload: {} = null) { }
}

export class OutputChecked implements Action {
    type = OUTPUT_CHECKED;

    constructor(public payload: {} = null) { }
}

export class ResultChecked implements Action {
    type = RESULT_CHECKED;

    constructor(public payload: {} = null) { }
}

export class UpdateCriteriaListAction implements Action {
    type = UPDATE_CRITERIA_LIST;

    constructor(public payload: Criterion[]) { }
}

export class AddCriterionAction implements Action {
    type = ADD_CRITERION;

    constructor(public payload: Criterion) { }
}

export class DeleteCriterionAction implements Action {
    type = DELETE_CRITERION;

    constructor(public payload: number) { }
}

export class UpdateOutputListAction implements Action {
    type = UPDATE_OUTPUT_LIST;

    constructor(public payload: number[]) { }
}

export class RetrieveMetaAction implements Action {
    type = RETRIEVE_META;

    constructor(public payload: {} = null) { }
}

export class RetrieveMetaSuccessAction implements Action {
    type = RETRIEVE_META_SUCCESS;

    constructor(public payload: SearchMeta) { }
}

export class RetrieveMetaFailAction implements Action {
    type = RETRIEVE_META_FAIL;

    constructor(public payload: {} = null) { }
}

export class RetrieveDataAction implements Action {
    type = RETRIEVE_DATA;

    constructor(public payload: number) { }
}

export class RetrieveDataSuccessAction implements Action {
    type = RETRIEVE_DATA_SUCCESS;

    constructor(public payload: any[]) { }
}

export class RetrieveDataFailAction implements Action {
    type = RETRIEVE_DATA_FAIL;

    constructor(public payload: {} = null) { }
}

export class AddSelectedDataAction implements Action {
    type = ADD_SELECTED_DATA;

    constructor(public payload: any) { }
}

export class DeleteSelectedDataAction implements Action {
    type = DELETE_SELECTED_DATA;

    constructor(public payload: any) { }
}

export type Actions
    = InitSearchByUrl
    | ChangeStepAction
    | SelectDatasetAction
    | NewSearchAction
    | CriteriaChecked
    | OutputChecked
    | ResultChecked
    | UpdateCriteriaListAction
    | AddCriterionAction
    | DeleteCriterionAction
    | UpdateOutputListAction
    | RetrieveMetaAction
    | RetrieveMetaSuccessAction
    | RetrieveMetaFailAction
    | RetrieveDataAction
    | RetrieveDataSuccessAction
    | RetrieveDataFailAction
    | AddSelectedDataAction
    | DeleteSelectedDataAction;