/*
 * Copyright (c) 2022  The AdvantEDGE Authors
 *
 * 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 { updateObject } from '../../util/object-util';
import {
  MOBILITY_EVENT,
  CFG_VIEW_NETWORK,
  SCENARIO_UPDATE_ACTION_NONE,
  PAGE_HOME
} from '../../meep-constants';

const initialState = {
  page: PAGE_HOME,
  cfgView: CFG_VIEW_NETWORK,
  mapCfg: {},
  eventCreationMode: false,
  eventAutomationMode: false,
  automationMovementMode: false,
  automationMobilityMode: false,
  automationPoasInRangeMode: false,
  automationNetCharMode: false,
  execCurrentEvent: null,
  currentEventType: MOBILITY_EVENT, // Should be moved somewhere else
  mobilityEventTarget: '',
  mobilityEventDestination: '',
  pduSessionEvent: {},
  scenarioUpdateAction: SCENARIO_UPDATE_ACTION_NONE,
  scenarioUpdateRemoveEleName: '',
  scenarioUpdateRemoveEleType: '',
  devMode: false,
  currentDialog: '',
  automaticRefresh: false,
  refreshInterval: 1000,
  execShowApps: false,
  execPauseSeq: false,
  execPauseDataflow: false,
  dashCfgMode: false,
  eventCfgMode: false,
  eventStatus: '',
  eventReplayMode: false,
  eventReplayLoop: false,
  replayFiles: [],
  replayFileSelected: '',
  replayFileDesc: '',
  sandbox: '',
  sandboxes: [],
  sandboxCfg: {},
  userMenuDisplay: false,
  signInStatus: '',
  signInUsername: '',
  activeTabIndex: 0
};

// Change the current page
const CHANGE_CURRENT_PAGE = 'CHANGE_CURRENT_PAGE';
export function uiChangeCurrentPage(page) {
  return {
    type: CHANGE_CURRENT_PAGE,
    payload: page
  };
}

// Change the current tab index
const CHANGE_CURRENT_TAB = 'CHANGE_CURRENT_TAB';
export function uiChangeCurrentTab(activeTabIndex) {
  return {
    type: CHANGE_CURRENT_TAB,
    payload: activeTabIndex
  };
}

const UI_CFG_CHANGE_VIEW = 'UI_CFG_CHANGE_VIEW';
export function uiCfgChangeView(view) {
  return {
    type: UI_CFG_CHANGE_VIEW,
    payload: view
  };
}

const UI_CFG_CHANGE_MAP_CFG = 'UI_CFG_CHANGE_MAP_CFG';
export function uiCfgChangeMapCfg(cfg) {
  return {
    type: UI_CFG_CHANGE_MAP_CFG,
    payload: cfg
  };
}

const UI_EXEC_CHANGE_SANDBOX = 'UI_EXEC_CHANGE_SANDBOX';
export function uiExecChangeSandbox(name) {
  return {
    type: UI_EXEC_CHANGE_SANDBOX,
    payload: name
  };
}

const UI_EXEC_CHANGE_SANDBOX_LIST = 'UI_EXEC_CHANGE_SANDBOX_LIST';
export function uiExecChangeSandboxList(list) {
  return {
    type: UI_EXEC_CHANGE_SANDBOX_LIST,
    payload: list
  };
}

const UI_EXEC_CHANGE_SANDBOX_CFG = 'UI_EXEC_CHANGE_SANDBOX_CFG';
export function uiExecChangeSandboxCfg(cfg) {
  return {
    type: UI_EXEC_CHANGE_SANDBOX_CFG,
    payload: cfg
  };
}

const UI_EXEC_CHANGE_CURRENT_EVENT = 'UI_EXEC_CHANGE_CURRENT_EVENT';
export function uiExecChangeCurrentEvent(event) {
  return {
    type: UI_EXEC_CHANGE_CURRENT_EVENT,
    payload: event
  };
}

const UI_EXEC_CHANGE_CURRENT_VIEW = 'UI_EXEC_CHANGE_CURRENT_VIEW';
export function uiExecChangeCurrentView(view) {
  return {
    type: UI_EXEC_CHANGE_CURRENT_VIEW,
    payload: view
  };
}

const UI_EXEC_CHANGE_MOBILITY_EVENT_TARGET = 'UI_EXEC_CHANGE_MOBILITY_EVENT_TARGET';
export function uiExecChangeMobilityEventTarget(event) {
  return {
    type: UI_EXEC_CHANGE_MOBILITY_EVENT_TARGET,
    payload: event
  };
}

const UI_EXEC_CHANGE_MOBILITY_EVENT_DESTINATION = 'UI_EXEC_CHANGE_MOBILITY_EVENT_DESTINATION';
export function uiExecChangeMobilityEventDestination(event) {
  return {
    type: UI_EXEC_CHANGE_MOBILITY_EVENT_DESTINATION,
    payload: event
  };
}

const UI_EXEC_CHANGE_PDU_SESSION_EVENT = 'UI_EXEC_CHANGE_PDU_SESSION_EVENT';
export function uiExecChangePduSessionEvent(event) {
  return {
    type: UI_EXEC_CHANGE_PDU_SESSION_EVENT,
    payload: event
  };
}

const UI_EXEC_CHANGE_SCENARIO_UPDATE_ACTION = 'UI_EXEC_CHANGE_SCENARIO_UPDATE_ACTION';
export function uiExecChangeScenarioUpdateAction(event) {
  return {
    type: UI_EXEC_CHANGE_SCENARIO_UPDATE_ACTION,
    payload: event
  };
}

const UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_NAME = 'UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_NAME';
export function uiExecScenarioUpdateRemoveEleName(event) {
  return {
    type: UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_NAME,
    payload: event
  };
}

const UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_TYPE = 'UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_TYPE';
export function uiExecScenarioUpdateRemoveEleType(event) {
  return {
    type: UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_TYPE,
    payload: event
  };
}

const UI_EXEC_CHANGE_EVENT_CREATION_MODE = 'UI_EXEC_CHANGE_EVENT_CREATION_MODE';
export function uiExecChangeEventCreationMode(val) {
  return {
    type: UI_EXEC_CHANGE_EVENT_CREATION_MODE,
    payload: val
  };
}

const UI_EXEC_CHANGE_EVENT_AUTOMATION_MODE = 'UI_EXEC_CHANGE_EVENT_AUTOMATION_MODE';
export function uiExecChangeEventAutomationMode(val) {
  return {
    type: UI_EXEC_CHANGE_EVENT_AUTOMATION_MODE,
    payload: val
  };
}

const UI_EXEC_CHANGE_AUTOMATION_MOVEMENT_MODE = 'UI_EXEC_CHANGE_AUTOMATION_MOVEMENT_MODE';
export const uiExecChangeAutomationMovementMode = val => {
  return {
    type: UI_EXEC_CHANGE_AUTOMATION_MOVEMENT_MODE,
    payload: val
  };
};

const UI_EXEC_CHANGE_AUTOMATION_MOBILITY_MODE = 'UI_EXEC_CHANGE_AUTOMATION_MOBILITY_MODE';
export const uiExecChangeAutomationMobilityMode = val => {
  return {
    type: UI_EXEC_CHANGE_AUTOMATION_MOBILITY_MODE,
    payload: val
  };
};

const UI_EXEC_CHANGE_AUTOMATION_POAS_IN_RANGE_MODE = 'UI_EXEC_CHANGE_AUTOMATION_POAS_IN_RANGE_MODE';
export const uiExecChangeAutomationPoasInRangeMode = val => {
  return {
    type: UI_EXEC_CHANGE_AUTOMATION_POAS_IN_RANGE_MODE,
    payload: val
  };
};

const UI_EXEC_CHANGE_AUTOMATION_NET_CHAR_MODE = 'UI_EXEC_CHANGE_AUTOMATION_NET_CHAR_MODE';
export const uiExecChangeAutomationNetCharMode = val => {
  return {
    type: UI_EXEC_CHANGE_AUTOMATION_NET_CHAR_MODE,
    payload: val
  };
};

const UI_EXEC_CHANGE_EVENT_REPLAY_MODE = 'UI_EXEC_CHANGE_EVENT_REPLAY_MODE';
export function uiExecChangeEventReplayMode(val) {
  return {
    type: UI_EXEC_CHANGE_EVENT_REPLAY_MODE,
    payload: val
  };
}

const UI_EXEC_CHANGE_DASH_CFG_MODE = 'UI_EXEC_CHANGE_DASH_CFG_MODE';
export function uiExecChangeDashCfgMode(val) {
  return {
    type: UI_EXEC_CHANGE_DASH_CFG_MODE,
    payload: val
  };
}

const UI_EXEC_CHANGE_EVENT_CFG_MODE = 'UI_EXEC_CHANGE_EVENT_CFG_MODE';
export function uiExecChangeEventCfgMode(val) {
  return {
    type: UI_EXEC_CHANGE_EVENT_CFG_MODE,
    payload: val
  };
}

const UI_EXEC_CHANGE_EVENT_STATUS = 'UI_EXEC_CHANGE_EVENT_STATUS';
export function uiExecChangeEventStatus(status) {
  return {
    type: UI_EXEC_CHANGE_EVENT_STATUS,
    payload: status
  };
}

const UI_CHANGE_DEV_MODE = 'UI_CHANGE_DEV_MODE';
export function uiChangeDevMode(mode) {
  return {
    type: UI_CHANGE_DEV_MODE,
    payload: mode
  };
}

const UI_CHANGE_CURRENT_DIALOG = 'UI_CHANGE_CURRENT_DIALOG';
export function uiChangeCurrentDialog(type) {
  return {
    type: UI_CHANGE_CURRENT_DIALOG,
    payload: type
  };
}

const UI_SET_AUTOMATIC_REFRESH = 'UI_SET_AUTOMATIC_REFRESH';
export function uiSetAutomaticRefresh(val) {
  return {
    type: UI_SET_AUTOMATIC_REFRESH,
    payload: val
  };
}

const UI_CHANGE_REFRESH_INTERVAL = 'UI_CHANGE_REFRESH_INTERVAL';
export function uiChangeRefreshInterval(val) {
  return {
    type: UI_CHANGE_REFRESH_INTERVAL,
    payload: val
  };
}

const UI_EXEC_CHANGE_SHOW_APPS = 'UI_EXEC_CHANGE_SHOW_APPS';
export function uiExecChangeShowApps(show) {
  return {
    type: UI_EXEC_CHANGE_SHOW_APPS,
    payload: show
  };
}

const UI_EXEC_CHANGE_PAUSE_SEQ = 'UI_EXEC_CHANGE_PAUSE_SEQ';
export function uiExecChangePauseSeq(pause) {
  return {
    type: UI_EXEC_CHANGE_PAUSE_SEQ,
    payload: pause
  };
}

const UI_EXEC_CHANGE_PAUSE_DATAFLOW = 'UI_EXEC_CHANGE_PAUSE_DATAFLOW';
export function uiExecChangePauseDataflow(pause) {
  return {
    type: UI_EXEC_CHANGE_PAUSE_DATAFLOW,
    payload: pause
  };
}

const UI_EXEC_CHANGE_REPLAY_FILES_LIST = 'UI_EXEC_CHANGE_REPLAY_FILES_LIST';
export function uiExecChangeReplayFilesList(replayFiles) {
  return {
    type: UI_EXEC_CHANGE_REPLAY_FILES_LIST,
    payload: replayFiles
  };
}

const UI_EXEC_CHANGE_REPLAY_FILE_SELECTED = 'UI_EXEC_CHANGE_REPLAY_FILE_SELECTED';
export function uiExecChangeReplayFileSelected(name) {
  return {
    type: UI_EXEC_CHANGE_REPLAY_FILE_SELECTED,
    payload: name
  };
}

const UI_EXEC_CHANGE_REPLAY_FILE_DESC = 'UI_EXEC_CHANGE_REPLAY_FILE_DESC';
export function uiExecChangeReplayFileDesc(desc) {
  return {
    type: UI_EXEC_CHANGE_REPLAY_FILE_DESC,
    payload: desc
  };
}

const UI_EXEC_CHANGE_REPLAY_LOOP = 'UI_EXEC_CHANGE_REPLAY_LOOP';
export const uiExecChangeReplayLoop = val => {
  return {
    type: UI_EXEC_CHANGE_REPLAY_LOOP,
    payload: val
  };
};

// Change the help menu display
const CHANGE_USER_MENU_DISPLAY = 'CHANGE_USER_MENU_DISPLAY';
export function uiChangeUserMenuDisplay(display) {
  return {
    type: CHANGE_USER_MENU_DISPLAY,
    payload: display
  };
}

const UI_CHANGE_SIGN_IN_STATUS = 'UI_CHANGE_SIGN_IN_STATUS';
export function uiChangeSignInStatus(status) {
  return {
    type: UI_CHANGE_SIGN_IN_STATUS,
    payload: status
  };
}

const UI_CHANGE_SIGN_IN_USER_NAME = 'UI_CHANGE_SIGN_IN_USER_NAME';
export function uiChangeSignInUsername(name) {
  return {
    type: UI_CHANGE_SIGN_IN_USER_NAME,
    payload: name
  };
}

export default function uiReducer(state = initialState, action) {
  switch (action.type) {
  case CHANGE_CURRENT_PAGE:
    return updateObject(state, { page: action.payload });
  case CHANGE_CURRENT_TAB:
    return updateObject(state, { activeTabIndex: action.payload });
  case UI_CFG_CHANGE_VIEW:
    return updateObject(state, { cfgView: action.payload });
  case UI_CFG_CHANGE_MAP_CFG:
    return updateObject(state, { mapCfg: action.payload });
  case UI_EXEC_CHANGE_SANDBOX:
    return updateObject(state, { sandbox: action.payload });
  case UI_EXEC_CHANGE_SANDBOX_LIST:
    return updateObject(state, { sandboxes: action.payload });
  case UI_EXEC_CHANGE_SANDBOX_CFG:
    return updateObject(state, { sandboxCfg: action.payload });
  case UI_EXEC_CHANGE_CURRENT_EVENT:
    return updateObject(state, { execCurrentEvent: action.payload });
  case UI_EXEC_CHANGE_CURRENT_VIEW:
    return updateObject(state, { execCurrentView: action.payload });
  case UI_EXEC_CHANGE_MOBILITY_EVENT_TARGET:
    return updateObject(state, { mobilityEventTarget: action.payload });
  case UI_EXEC_CHANGE_MOBILITY_EVENT_DESTINATION:
    return updateObject(state, { mobilityEventDestination: action.payload });
  case UI_EXEC_CHANGE_PDU_SESSION_EVENT:
    return updateObject(state, { pduSessionEvent: action.payload });
  case UI_EXEC_CHANGE_SCENARIO_UPDATE_ACTION:
    return updateObject(state, { scenarioUpdateAction: action.payload });
  case UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_NAME:
    return updateObject(state, { scenarioUpdateRemoveEleName: action.payload });
  case UI_EXEC_SCENARIO_UPDATE_REMOVE_ELE_TYPE:
    return updateObject(state, { scenarioUpdateRemoveEleType: action.payload });
  case UI_CHANGE_DEV_MODE:
    return updateObject(state, { devMode: action.payload || false });
  case UI_CHANGE_CURRENT_DIALOG:
    return updateObject(state, { currentDialog: action.payload });
  case UI_EXEC_CHANGE_EVENT_CREATION_MODE:
    return updateObject(state, { eventCreationMode: action.payload });
  case UI_EXEC_CHANGE_EVENT_AUTOMATION_MODE:
    return updateObject(state, { eventAutomationMode: action.payload });
  case UI_EXEC_CHANGE_AUTOMATION_MOVEMENT_MODE:
    return updateObject(state, { automationMovementMode: action.payload });
  case UI_EXEC_CHANGE_AUTOMATION_MOBILITY_MODE:
    return updateObject(state, { automationMobilityMode: action.payload });
  case UI_EXEC_CHANGE_AUTOMATION_POAS_IN_RANGE_MODE:
    return updateObject(state, { automationPoasInRangeMode: action.payload });
  case UI_EXEC_CHANGE_AUTOMATION_NET_CHAR_MODE:
    return updateObject(state, { automationNetCharMode: action.payload });
  case UI_EXEC_CHANGE_EVENT_REPLAY_MODE:
    return updateObject(state, { eventReplayMode: action.payload });
  case UI_EXEC_CHANGE_DASH_CFG_MODE:
    return updateObject(state, { dashCfgMode: action.payload });
  case UI_EXEC_CHANGE_EVENT_CFG_MODE:
    return updateObject(state, { eventCfgMode: action.payload });
  case UI_EXEC_CHANGE_EVENT_STATUS:
    return updateObject(state, { eventStatus: action.payload });
  case UI_SET_AUTOMATIC_REFRESH:
    return updateObject(state, { automaticRefresh: action.payload });
  case UI_CHANGE_REFRESH_INTERVAL:
    return updateObject(state, { refreshInterval: action.payload });
  case UI_EXEC_CHANGE_SHOW_APPS:
    return updateObject(state, { execShowApps: action.payload });
  case UI_EXEC_CHANGE_PAUSE_SEQ:
    return updateObject(state, { execPauseSeq: action.payload });
  case UI_EXEC_CHANGE_PAUSE_DATAFLOW:
    return updateObject(state, { execPauseDataflow: action.payload });
  case UI_EXEC_CHANGE_REPLAY_FILES_LIST:
    return updateObject(state, { replayFiles: action.payload });
  case UI_EXEC_CHANGE_REPLAY_FILE_SELECTED:
    return updateObject(state, { replayFileSelected: action.payload });
  case UI_EXEC_CHANGE_REPLAY_FILE_DESC:
    return updateObject(state, { replayFileDesc: action.payload });
  case UI_EXEC_CHANGE_REPLAY_LOOP:
    return updateObject(state, { eventReplayLoop: action.payload });
  case CHANGE_USER_MENU_DISPLAY:
    return updateObject(state, { userMenuDisplay: action.payload });
  case UI_CHANGE_SIGN_IN_STATUS:
    return updateObject(state, { signInStatus: action.payload });
  case UI_CHANGE_SIGN_IN_USER_NAME:
    return updateObject(state, { signInUsername: action.payload });
  default:
    return state;
  }
}
