import { createFeature, createReducer, on } from '@ngrx/store';
import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity';
import { <%= classify(name) %> } from '<%= featurePath(group, flat, "models", dasherize(name)) %><%= dasherize(name) %>.model';
import { <%= classify(name) %>Actions } from '<%= featurePath(group, flat, "actions", dasherize(name)) %><%= dasherize(name) %>.actions';

export const <%= pluralize(name) %>FeatureKey = '<%= pluralize(name) %>';

export interface State extends EntityState<<%= classify(name) %>> {
  // additional entities state properties
}

export const adapter: EntityAdapter<<%= classify(name) %>> = createEntityAdapter<<%= classify(name) %>>();

export const initialState: State = adapter.getInitialState({
  // additional entity state properties
});

export const reducer = createReducer(
  initialState,
  on(<%= classify(name) %>Actions.add<%= classify(name) %>,
    (state, action) => adapter.addOne(action.<%= camelize(name) %>, state)
  ),
  on(<%= classify(name) %>Actions.upsert<%= classify(name) %>,
    (state, action) => adapter.upsertOne(action.<%= camelize(name) %>, state)
  ),
  on(<%= classify(name) %>Actions.add<%= classify(name) %>s,
    (state, action) => adapter.addMany(action.<%= camelize(name) %>s, state)
  ),
  on(<%= classify(name) %>Actions.upsert<%= classify(name) %>s,
    (state, action) => adapter.upsertMany(action.<%= camelize(name) %>s, state)
  ),
  on(<%= classify(name) %>Actions.update<%= classify(name) %>,
    (state, action) => adapter.updateOne(action.<%= camelize(name) %>, state)
  ),
  on(<%= classify(name) %>Actions.update<%= classify(name) %>s,
    (state, action) => adapter.updateMany(action.<%= camelize(name) %>s, state)
  ),
  on(<%= classify(name) %>Actions.delete<%= classify(name) %>,
    (state, action) => adapter.removeOne(action.id, state)
  ),
  on(<%= classify(name) %>Actions.delete<%= classify(name) %>s,
    (state, action) => adapter.removeMany(action.ids, state)
  ),
  on(<%= classify(name) %>Actions.load<%= classify(name) %>s,
    (state, action) => adapter.setAll(action.<%= camelize(name) %>s, state)
  ),
  on(<%= classify(name) %>Actions.clear<%= classify(name) %>s,
    state => adapter.removeAll(state)
  ),
);

export const <%= pluralize(name) %>Feature = createFeature({
  name: <%= pluralize(name) %>FeatureKey,
  reducer,
  extraSelectors: ({ select<%= capitalize(pluralize(name)) %>State }) => ({
    ...adapter.getSelectors(select<%= capitalize(pluralize(name)) %>State)
  }),
});

export const {
  selectIds,
  selectEntities,
  selectAll,
  selectTotal,
} = <%= pluralize(name) %>Feature;
