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

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

export const CHANGE_STEP = 'Change Search Step';
export const SELECT_DATASET = 'Select Dataset';
export const NEW_SEARCH = 'New Search';
export const CRITERIA_CHECKED = 'Criteria Checked';
export const OUTPUT_CHECKED = 'Output Checked';
export const RESULT_CHECKED = 'Result Checked';
export const UPDATE_DEFAULT_CRITERIA_LIST = 'Update Default Criteria List Action';
export const UPDATE_CRITERIA_LIST = 'Update Criteria List';
export const ADD_CRITERION = 'Add Criterion';
export const DELETE_CRITERION = 'Delete Criterion';
export const UPDATE_DEFAULT_OUTPUT_LIST = 'Update Default Output List';
export const UPDATE_OUTPUT_LIST = 'Update Output List';
export const RETRIEVE_META = 'Retrieve Meta';
export const RETRIEVE_META_SUCCESS = 'Retrieve Meta Success';
export const RETRIEVE_META_FAILED = 'Retrieve Meta Failed';
export const RETRIEVE_DATA = 'Retrieve Data';
export const RETRIEVE_DATA_SUCCESS = 'Retrieve Data Success';
export const RETRIEVE_DATA_FAILED = 'Retrieve Data Failed';

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 UpdateDefaultCriteriaListAction implements Action {
    type = UPDATE_DEFAULT_CRITERIA_LIST;

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

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 UpdateDefaultOutputListAction implements Action {
    type = UPDATE_DEFAULT_OUTPUT_LIST;

    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 RetrieveMetaFailedAction implements Action {
    type = RETRIEVE_META_FAILED;

    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 RetrieveDataFailedAction implements Action {
    type = RETRIEVE_DATA_FAILED;

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

export type Actions
    = ChangeStepAction | SelectDatasetAction | NewSearchAction | UpdateDefaultCriteriaListAction | UpdateCriteriaListAction
    | AddCriterionAction
    | DeleteCriterionAction
    | UpdateDefaultOutputListAction
    | UpdateOutputListAction
    | RetrieveMetaAction
    | RetrieveMetaSuccessAction
    | RetrieveMetaFailedAction
    | RetrieveDataAction
    | RetrieveDataSuccessAction
    | RetrieveDataFailedAction;