import { Action } from '@ngrx/store';
import { type } from '../../../shared/ngrx/type';
import { BitstreamFormat } from '../../../core/shared/bitstream-format.model';

/**
 * For each action type in an action group, make a simple
 * enum object for all of this group's action types.
 *
 * The 'type' utility function coerces strings into string
 * literal types and runs a simple check to guarantee all
 * action types in the application are unique.
 */
export const BitstreamFormatsRegistryActionTypes = {

  SELECT_FORMAT: type('dspace/bitstream-formats-registry/SELECT_FORMAT'),
  DESELECT_FORMAT: type('dspace/bitstream-formats-registry/DESELECT_FORMAT'),
  DESELECT_ALL_FORMAT: type('dspace/bitstream-formats-registry/DESELECT_ALL_FORMAT')
};

/* tslint:disable:max-classes-per-file */
/**
 * Used to select a single bitstream format in the bitstream format registry
 */
export class BitstreamFormatsRegistrySelectAction implements Action {
  type = BitstreamFormatsRegistryActionTypes.SELECT_FORMAT;

  bitstreamFormat: BitstreamFormat;

  constructor(bitstreamFormat: BitstreamFormat) {
    this.bitstreamFormat = bitstreamFormat;
  }
}

/**
 * Used to deselect a single bitstream format in the bitstream format registry
 */
export class BitstreamFormatsRegistryDeselectAction implements Action {
  type = BitstreamFormatsRegistryActionTypes.DESELECT_FORMAT;

  bitstreamFormat: BitstreamFormat;

  constructor(bitstreamFormat: BitstreamFormat) {
    this.bitstreamFormat = bitstreamFormat;
  }
}

/**
 * Used to deselect all bitstream formats in the bitstream format registry
 */
export class BitstreamFormatsRegistryDeselectAllAction implements Action {
  type = BitstreamFormatsRegistryActionTypes.DESELECT_ALL_FORMAT;
}

/* tslint:enable:max-classes-per-file */

/**
 * Export a type alias of all actions in this action group
 * so that reducers can easily compose action types
 * These are all the actions to perform on the bitstream format registry state
 */
export type BitstreamFormatsRegistryAction
  = BitstreamFormatsRegistrySelectAction
  | BitstreamFormatsRegistryDeselectAction
  | BitstreamFormatsRegistryDeselectAllAction
