/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
import {Action, ActionReducer} from '@ngrx/store';
import {createSelector} from 'reselect';
import {RoutePayload} from './route-payload';

export interface Resource {
  identifier: string;
}

export interface LoadResourcePayload {
  resource: any;
}

export interface SelectResourcePayload {
  selectedId: string;
}

export interface CreateResourceSuccessPayload extends RoutePayload {
  resource: any;
}

export interface UpdateResourceSuccessPayload extends RoutePayload {
  resource: any;
}

export interface DeleteResourceSuccessPayload extends RoutePayload {
  resource: any;
}

export interface ResourceState {
  ids: string[];
  entities: { [id: string]: any };
  selectedId: string | null;
  loadedAt: { [id: string]: number };
}

const initialState: ResourceState = {
  ids: [],
  entities: {},
  loadedAt: {},
  selectedId: null
};

export const createResourceReducer =
  (resourceId: string, reducer?: ActionReducer<ResourceState>, identifierName: string = 'identifier') => {

    const identifier = (resource: any) => resource[identifierName];

/*    return function (state: ResourceState = initialState, action: Action): ResourceState {

      switch (action.type) {

        case `[${resourceId}] Load`: {
          const resource = action.payload.resource;

          const newIds = state.ids.filter(id => id !== identifier(resource));

          return {
            ids: [...newIds, identifier(resource)],
            entities: Object.assign({}, state.entities, {
              [identifier(resource)]: resource
            }),
            selectedId: state.selectedId,
            loadedAt: Object.assign({}, state.entities, {
              [identifier(resource)]: Date.now()
            })
          };
        }

        case `[${resourceId}] Select`: {
          return Object.assign({}, state, {
            selectedId: action.payload
          });
        }

        case `[${resourceId}] Create Success`: {
          const resource = action.payload.resource;

          return {
            ids: [...state.ids, identifier(resource)],
            entities: Object.assign({}, state.entities, {
              [identifier(resource)]: resource
            }),
            selectedId: state.selectedId,
            loadedAt: state.loadedAt
          };
        }

        case `[${resourceId}] Update Success`: {
          const resource = action.payload.resource;

          return {
            ids: state.ids,
            entities: Object.assign({}, state.entities, {
              [identifier(resource)]: resource
            }),
            selectedId: state.selectedId,
            loadedAt: state.loadedAt
          };
        }

        case `[${resourceId}] Delete Success`: {
          const resource = action.payload.resource;

          const newIds = state.ids.filter(id => id !== identifier(resource));

          const newEntities = newIds.reduce((entities: { [id: string]: any }, id: string) => {
            const entity = state.entities[id];
            return Object.assign(entities, {
              [identifier(entity)]: entity
            });
          }, {});

          const newLoadedAt = newIds.reduce((entities: { [id: string]: any }, id: string) => {
            const loadedAt = state.loadedAt[id];
            return Object.assign(entities, {
              [id]: loadedAt
            });
          }, {});

          return {
            ids: [...newIds],
            entities: newEntities,
            loadedAt: newLoadedAt,
            selectedId: state.selectedId,
          };
        }

        default: {
          // delegate to wrapped reducer
          if (reducer) {
            return reducer(state, action);
          }
          return state;
        }
      }
    };
    */
  };

export const getResourceEntities = (cacheState: ResourceState) => cacheState.entities;
export const getResourceLoadedAt = (cacheState: ResourceState) => cacheState.loadedAt;
export const getResourceIds = (cacheState: ResourceState) => cacheState.ids;
export const getResourceSelectedId = (cacheState: ResourceState) => cacheState.selectedId;

export const getResourceSelected = createSelector(getResourceEntities, getResourceSelectedId, (entities, selectedId) => {
  return entities[selectedId];
});

export const getResourceAll = createSelector(getResourceEntities, getResourceIds, (entities, ids) => {
  return ids.map(id => entities[id]);
});
