import { CollectionState, initialCollectionState } from '@ascendedco/architecture'
import { createEntityAdapter, EntityAdapter } from '@ngrx/entity'
import { <%= classify(name) %>Actions, <%= classify(name) %>ActionTypes } from './<%= dasherize(name) %>.actions'
import { <%= classify(name) %> } from '../../entity/<%= dasherize(name) %>.entity'

export const <%= camelize(name) %>FeatureKey = '<%= camelize(name) %>'

export interface State extends CollectionState<<%= classify(name) %>> {
  // add additional state properties if necessary
}

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

export const initialState: State = adapter.getInitialState({
  // add additional initial state properties if necessary
  ...initialCollectionState,
})

export function reducer(
  state = initialState,
  action: <%= classify(name) %>Actions,
): State {
  switch (action.type) {

    case <%= classify(name) %>ActionTypes.Create<%= classify(name) %>:
    case <%= classify(name) %>ActionTypes.Create<%= classify(name) %>s:
    case <%= classify(name) %>ActionTypes.Update<%= classify(name) %>:
    case <%= classify(name) %>ActionTypes.Update<%= classify(name) %>s:
    case <%= classify(name) %>ActionTypes.Delete<%= classify(name) %>:
    case <%= classify(name) %>ActionTypes.Delete<%= classify(name) %>s: {
      return { ...state, loading: true }
    }

    case <%= classify(name) %>ActionTypes.Upsert<%= classify(name) %>: {
      return {
        ...adapter.upsertOne(action.payload.<%= camelize(name) %>, state),
        loaded: true,
        loading: false,
      }
    }

    case <%= classify(name) %>ActionTypes.Upsert<%= classify(name) %>s: {
      return {
        ...adapter.upsertMany(action.payload.<%= camelize(name) %>s, state),
        loaded: true,
        loading: false,
      }
    }

    case <%= classify(name) %>ActionTypes.Remove<%= classify(name) %>: {
      return {
        ...adapter.removeOne(action.payload.id, state),
        loading: false
      }
    }

    case <%= classify(name) %>ActionTypes.Remove<%= classify(name) %>s: {
      return {
        ...adapter.removeMany(action.payload.ids, state),
        loading: false
      }
    }

    case <%= classify(name) %>ActionTypes.Clear<%= classify(name) %>s: {
      return adapter.removeAll(state)
    }

    default: {
      return state
    }
  }
}

export const {
  selectIds,
  selectEntities,
  selectAll,
  selectTotal,
} = adapter.getSelectors()

export const selectAll<%= classify(name) %>s = selectAll
export const select<%= classify(name) %>Entities = selectEntities
export const select<%= classify(name) %>Ids = selectIds
export const select<%= classify(name) %>Total = selectTotal
