/*
 * Minio Cloud Storage (C) 2016 Minio, Inc.
 *
 * Licensed 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 * as actions from './actions'
import { minioBrowserPrefix } from './constants'

export default (state = {
    buckets: [],
    visibleBuckets: [],
    objects: [],
    istruncated: true,
    storageInfo: {},
    serverInfo: {},
    currentBucket: '',
    currentPath: '',
    showMakeBucketModal: false,
    uploads: {},
    alert: {
      show: false,
      type: 'danger',
      message: ''
    },
    loginError: false,
    sortNameOrder: false,
    sortSizeOrder: false,
    sortDateOrder: false,
    latestUiVersion: currentUiVersion,
    sideBarActive: false,
    loginRedirectPath: minioBrowserPrefix,
    settings: {
      accessKey: '',
      secretKey: '',
      secretKeyVisible: false
    },
    showSettings: false,
    policies: [],
    deleteConfirmation: {
      object: '',
      show: false
    },
    shareObject: {
      show: false,
      url: '',
      object: ''
    },
    prefixWritable: false,
    checkedObjects: []
  }, action) => {
  let newState = Object.assign({}, state)
  switch (action.type) {
    case actions.SET_WEB:
      newState.web = action.web
      break
    case actions.SET_BUCKETS:
      newState.buckets = action.buckets
      break
    case actions.ADD_BUCKET:
      newState.buckets = [action.bucket, ...newState.buckets]
      newState.visibleBuckets = [action.bucket, ...newState.visibleBuckets]
      break
    case actions.SET_VISIBLE_BUCKETS:
      newState.visibleBuckets = action.visibleBuckets
      break
    case actions.SET_CURRENT_BUCKET:
      newState.currentBucket = action.currentBucket
      break
    case actions.APPEND_OBJECTS:
      newState.objects = [...newState.objects, ...action.objects]
      newState.marker = action.marker
      newState.istruncated = action.istruncated
      break
    case actions.SET_OBJECTS:
      newState.objects = [...action.objects]
      break
    case actions.RESET_OBJECTS:
      newState.objects = []
      newState.marker = ""
      newState.istruncated = false
      break
    case actions.SET_CURRENT_PATH:
      newState.currentPath = action.currentPath
      break
    case actions.SET_STORAGE_INFO:
      newState.storageInfo = action.storageInfo
      break
    case actions.SET_SERVER_INFO:
      newState.serverInfo = action.serverInfo
      break
    case actions.SHOW_MAKEBUCKET_MODAL:
      newState.showMakeBucketModal = action.showMakeBucketModal
      break
    case actions.UPLOAD_PROGRESS:
      newState.uploads = Object.assign({}, newState.uploads)
      newState.uploads[action.slug].loaded = action.loaded
      break
    case actions.ADD_UPLOAD:
      newState.uploads = Object.assign({}, newState.uploads, {
        [action.slug]: {
          loaded: 0,
          size: action.size,
          xhr: action.xhr,
          name: action.name
        }
      })
      break
    case actions.STOP_UPLOAD:
      newState.uploads = Object.assign({}, newState.uploads)
      delete newState.uploads[action.slug]
      break
    case actions.SET_ALERT:
      if (newState.alert.alertTimeout) clearTimeout(newState.alert.alertTimeout)
      if (!action.alert.show) {
        newState.alert = Object.assign({}, newState.alert, {
          show: false
        })
      } else {
        newState.alert = action.alert
      }
      break
    case actions.SET_LOGIN_ERROR:
      newState.loginError = true
      break
    case actions.SET_SHOW_ABORT_MODAL:
      newState.showAbortModal = action.showAbortModal
      break
    case actions.SHOW_ABOUT:
      newState.showAbout = action.showAbout
      break
    case actions.SET_SORT_NAME_ORDER:
      newState.sortNameOrder = action.sortNameOrder
      break
    case actions.SET_SORT_SIZE_ORDER:
      newState.sortSizeOrder = action.sortSizeOrder
      break
    case actions.SET_SORT_DATE_ORDER:
      newState.sortDateOrder = action.sortDateOrder
      break
    case actions.SET_LATEST_UI_VERSION:
      newState.latestUiVersion = action.latestUiVersion
      break
    case actions.SET_SIDEBAR_STATUS:
      newState.sidebarStatus = action.sidebarStatus
      break
    case actions.SET_LOGIN_REDIRECT_PATH:
      newState.loginRedirectPath = action.path
    case actions.SET_LOAD_BUCKET:
      newState.loadBucket = action.loadBucket
      break
    case actions.SET_LOAD_PATH:
      newState.loadPath = action.loadPath
      break
    case actions.SHOW_SETTINGS:
      newState.showSettings = action.showSettings
      break
    case actions.SET_SETTINGS:
      newState.settings = Object.assign({}, newState.settings, action.settings)
      break
    case actions.SHOW_BUCKET_POLICY:
      newState.showBucketPolicy = action.showBucketPolicy
      break
    case actions.SET_POLICIES:
      newState.policies = action.policies
      break
    case actions.DELETE_CONFIRMATION:
      newState.deleteConfirmation = Object.assign({}, action.payload)
      break
    case actions.SET_SHARE_OBJECT:
      newState.shareObject = Object.assign({}, action.shareObject)
      break
    case actions.SET_PREFIX_WRITABLE:
      newState.prefixWritable = action.prefixWritable
      break
    case actions.REMOVE_OBJECT:
      let idx = newState.objects.findIndex(object => object.name === action.object)
      if (idx == -1) break
      newState.objects = [...newState.objects.slice(0, idx), ...newState.objects.slice(idx + 1)]
      break

    case actions.CHECKED_OBJECTS_ADD:
      newState.checkedObjects = [...newState.checkedObjects, action.objectName]
      break
    case actions.CHECKED_OBJECTS_REMOVE:
      let index = newState.checkedObjects.indexOf(action.objectName)
      if (index == -1) break
      newState.checkedObjects = [...newState.checkedObjects.slice(0, index), ...newState.checkedObjects.slice(index + 1)]
      break
    case actions.CHECKED_OBJECTS_RESET:
      newState.checkedObjects = []
      break
  }

  return newState
}
