import { ActionTypes } from 'app/actions/ActionTypes';

export const selectedPath = (state = '', action: any) => {
  switch (action.type) {
    case ActionTypes.SELECT_PATH:
    case ActionTypes.REQUEST_COMMITS:
    case ActionTypes.RECEIVE_COMMITS:
      return action.selectedPath;
    default:
      return state;
  }
};

export const commits = (state = [], action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return [];
    case ActionTypes.RECEIVE_COMMITS:
      return state.concat(action.commits);
    default:
      return state;
  }
};

export const highlightedCommitIds = (state = '', action: any) => {
  switch (action.type) {
    case ActionTypes.HIGHLIGHT_COMMITS:
      return action.commitIds;
    default:
      return state;
  }
};

export const isFetching = (state = false, action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return true;
    case ActionTypes.RECEIVED_All_COMMITS:
      return false;
    default:
      return state;
  }
};

export const totalCommits = (state = 0, action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return 0;
    case ActionTypes.RECEIVE_COMMIT_RANGE:
      return action.commitRange.count;
    default:
      return state;
  }
};

export const earliestCommitDate = (state = null, action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return null;
    case ActionTypes.RECEIVE_COMMIT_RANGE:
      return action.commitRange.firstCommit.authorDate;
    default:
      return state;
  }
};

export const latestCommitDate = (state = 0, action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return null;
    case ActionTypes.RECEIVE_COMMIT_RANGE:
      return action.commitRange.lastCommit.authorDate;
    default:
      return state;
  }
};

export const hasUncommittedChanges = (state = null, action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return null;
    case ActionTypes.RECEIVE_COMMIT_RANGE:
      return action.commitRange.hasUncommittedChanges;
  }
  return state;
};

export const existsLocally = (state = null, action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return null;
    case ActionTypes.RECEIVE_COMMIT_RANGE:
      return action.commitRange.existsLocally;
  }
  return state;
};

export const gitRoot = (state = null, action: any) => {
  switch (action.type) {
    case ActionTypes.REQUEST_COMMITS:
      return null;
    case ActionTypes.RECEIVE_COMMIT_RANGE:
      return action.commitRange.gitRoot;
  }
  return state;
};

export const isFileSelected = (state = false, action: any) => {
  switch (action.type) {
    case ActionTypes.RECEIVE_COMMITS:
      return action.isFileSelected;
  }
  return state;
};
