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

import { Criterion } from './model';
// import { Criterion, ConeSearch, Resolver } 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 RETRIEVE_COORDINATES = '[Search] Retrieve Coordinates';
// export const RETRIEVE_COORDINATES_SUCCESS = '[Search] Retrieve Coordinates Success';
// export const RETRIEVE_COORDINATES_FAIL = '[Search] Retrieve Coordinates Fail';
// export const DELETE_RESOLVER = '[Search] Delete Resolver';
// export const ADD_CONE_SEARCH = '[Search] Add Cone Search';
// export const DELETE_CONE_SEARCH = '[Search] Delete Cone Search';
export const CONE_SEARCH_ADDED = '[Search] Cone Search Added';
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 OUTPUT_LIST_EMPTY = '[Search] Output List Empty';
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 GET_DATA_LENGTH = '[Search] Get Data Length';
export const GET_DATA_LENGTH_SUCCESS = '[Search] Get Data Length Success';
export const GET_DATA_LENGTH_FAIL = '[Search] Get Data Length Fail';
export const ADD_SELECTED_DATA = '[Search] Add Selected Data';
export const DELETE_SELECTED_DATA = '[Search] Delete Selected Data';
export const EXECUTE_PROCESS = '[Search] Execute Process';
export const EXECUTE_PROCESS_WIP = '[Search] Execute Process WIP';
export const EXECUTE_PROCESS_SUCCESS = '[Search] Execute Process Success';
export const EXECUTE_PROCESS_FAIL = '[Search] Execute Process Fail';
export const DESTROY_RESULTS = '[Search] Destroy Results';


export class InitSearchByUrl implements Action {
    readonly type = INIT_SEARCH_BY_URL;

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

export class ChangeStepAction implements Action {
    readonly type = CHANGE_STEP;

    constructor(public payload: string) { }
}

export class SelectDatasetAction implements Action {
    readonly type = SELECT_DATASET;

    constructor(public payload: string) { }
}

export class NewSearchAction implements Action {
    readonly type = NEW_SEARCH;

    constructor(public payload: string) { }
}

export class CriteriaChecked implements Action {
    readonly type = CRITERIA_CHECKED;

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

export class OutputChecked implements Action {
    readonly type = OUTPUT_CHECKED;

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

export class ResultChecked implements Action {
    readonly type = RESULT_CHECKED;

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

// export class RetrieveCoordinatesAction implements Action {
//     readonly type = RETRIEVE_COORDINATES;
//
//     constructor(public payload: string) { }
// }
//
// export class RetrieveCoordinatesSuccessAction implements Action {
//     readonly type = RETRIEVE_COORDINATES_SUCCESS;
//
//     constructor(public payload: Resolver) { }
// }
//
// export class RetrieveCoordinatesFailAction implements Action {
//     readonly type = RETRIEVE_COORDINATES_FAIL;
//
//     constructor(public payload: string | null) { }
// }
//
// export class DeleteResolver implements Action {
//     readonly type = DELETE_RESOLVER;
//
//     constructor(public payload: {} = null) { }
// }
//
// export class AddConeSearchAction implements Action {
//     readonly type = ADD_CONE_SEARCH;
//
//     constructor(public payload: ConeSearch) { }
// }
//
// export class DeleteConeSearchAction implements Action {
//     readonly type = DELETE_CONE_SEARCH;
//
//     constructor(public payload: {} = null) { }
// }

export class ConeSearchAddedAction implements Action {
    readonly type = CONE_SEARCH_ADDED;

    constructor(public payload: boolean) { }
}

export class UpdateCriteriaListAction implements Action {
    readonly type = UPDATE_CRITERIA_LIST;

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

export class AddCriterionAction implements Action {
    readonly type = ADD_CRITERION;

    constructor(public payload: Criterion) { }
}

export class DeleteCriterionAction implements Action {
    readonly type = DELETE_CRITERION;

    constructor(public payload: number) { }
}

export class UpdateOutputListAction implements Action {
    readonly type = UPDATE_OUTPUT_LIST;

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

export class RetrieveDataAction implements Action {
    readonly type = RETRIEVE_DATA;

    // [nbItems, page, sortedCol, sortedOrder]
    constructor(public payload: [number, number, number, string]) { }
}

export class RetrieveDataSuccessAction implements Action {
    readonly type = RETRIEVE_DATA_SUCCESS;

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

export class RetrieveDataFailAction implements Action {
    readonly type = RETRIEVE_DATA_FAIL;

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

export class GetDataLengthAction implements Action {
    readonly type = GET_DATA_LENGTH;

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

export class GetDataLengthSuccessAction implements Action {
    readonly type = GET_DATA_LENGTH_SUCCESS;

    constructor(public payload: number) { }
}

export class GetDataLengthFailAction implements Action {
    readonly type = GET_DATA_LENGTH_FAIL;

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

export class AddSelectedDataAction implements Action {
    readonly type = ADD_SELECTED_DATA;

    constructor(public payload: number | string) { }
}

export class DeleteSelectedDataAction implements Action {
    readonly type = DELETE_SELECTED_DATA;

    constructor(public payload: number | string) { }
}

export class ExecuteProcessAction implements Action {
    readonly type = EXECUTE_PROCESS;

    constructor(public payload: string) { }
}

export class ExecuteProcessWipAction implements Action {
    readonly type = EXECUTE_PROCESS_WIP;

    constructor(public payload: string) { }
}

export class ExecuteProcessSuccessAction implements Action {
    readonly type = EXECUTE_PROCESS_SUCCESS;

    constructor(public payload: any) { }
}

export class ExecuteProcessFailAction implements Action {
    readonly type = EXECUTE_PROCESS_FAIL;

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

export class OutputListEmptyAction implements Action {
    readonly type = OUTPUT_LIST_EMPTY;

    constructor(public payload: boolean) { }
}

export class DestroyResultsAction implements Action {
    readonly type = DESTROY_RESULTS;

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

export type Actions
    = InitSearchByUrl
    | ChangeStepAction
    | SelectDatasetAction
    | NewSearchAction
    | CriteriaChecked
    | OutputChecked
    | ResultChecked
    // | RetrieveCoordinatesAction
    // | RetrieveCoordinatesSuccessAction
    // | RetrieveCoordinatesFailAction
    // | DeleteResolver
    // | AddConeSearchAction
    // | DeleteConeSearchAction
    | ConeSearchAddedAction
    | UpdateCriteriaListAction
    | AddCriterionAction
    | DeleteCriterionAction
    | UpdateOutputListAction
    | OutputListEmptyAction
    | RetrieveDataAction
    | RetrieveDataSuccessAction
    | RetrieveDataFailAction
    | GetDataLengthAction
    | GetDataLengthSuccessAction
    | GetDataLengthFailAction
    | AddSelectedDataAction
    | DeleteSelectedDataAction
    | ExecuteProcessAction
    | ExecuteProcessWipAction
    | ExecuteProcessSuccessAction
    | ExecuteProcessFailAction
    | DestroyResultsAction;