import {Dictionary} from '@ngrx/entity/src/models';

/**
 * <%= pascalCase(singularDomainName) %> Selectors
 */
import {createFeatureSelector, createSelector, MemoizedSelector} from '@ngrx/store';
import {getPropertyValue, isItemDefined} from '@zionapps/core';
import {<%= pascalCase(singularDomainName) %>, <%= pascalCase(pluralDomainName) %>Domain} from './<%= paramCase(pluralDomainName) %>.domain';
import {<%= camelCase(pluralDomainName) %>Adapter} from './<%= paramCase(pluralDomainName) %>.utils';

const {
  selectIds,
  selectEntities,
  selectAll,
  selectTotal,
} = <%= camelCase(pluralDomainName) %>Adapter.getSelectors();

export const get<%= pascalCase(pluralDomainName) %>State: MemoizedSelector<<%= pascalCase(singularDomainName) %>, <%= pascalCase(pluralDomainName) %>Domain.State> = createFeatureSelector<<%= pascalCase(pluralDomainName) %>Domain.State>(<%= pascalCase(pluralDomainName) %>Domain.storeName);

export const select<%= pascalCase(singularDomainName) %>Entities = createSelector(
  get<%= pascalCase(pluralDomainName) %>State,
  (state: <%= pascalCase(pluralDomainName) %>Domain.State): Dictionary<<%= pascalCase(singularDomainName) %>> => selectEntities(state),
);

export const select<%= pascalCase(singularDomainName) %>Ids = createSelector(
  get<%= pascalCase(pluralDomainName) %>State,
  (state: <%= pascalCase(pluralDomainName) %>Domain.State): number[] | string[] => selectIds(state),
);

export const selectCurrent<%= pascalCase(singularDomainName) %>Id = createSelector(
  get<%= pascalCase(pluralDomainName) %>State,
  (state: <%= pascalCase(pluralDomainName) %>Domain.State): number => getPropertyValue(state, 'currentId', null),
);

export const selectCurrent<%= pascalCase(singularDomainName) %> = createSelector(
  get<%= pascalCase(pluralDomainName) %>State,
  selectCurrent<%= pascalCase(singularDomainName) %>Id,
  (state: <%= pascalCase(pluralDomainName) %>Domain.State, currentId: number): <%= pascalCase(singularDomainName) %> | null => {
  const entities = selectEntities(state);
  return isItemDefined(entities) && !!currentId ? entities[currentId] : null;
},
);

export const selectAll<%= pascalCase(pluralDomainName) %> = createSelector(
  get<%= pascalCase(pluralDomainName) %>State,
  (state: <%= pascalCase(pluralDomainName) %>Domain.State): <%= pascalCase(singularDomainName) %>[] => selectAll(state),
);

export const selectTotal<%= pascalCase(pluralDomainName) %> = createSelector(
  get<%= pascalCase(pluralDomainName) %>State,
  (state: <%= pascalCase(pluralDomainName) %>Domain.State): number => selectTotal(state),
);
