/*!
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 *
 * 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 keyMirror from 'nfvo-utils/KeyMirror.js';

export const DATE_FORMAT = 'MM/DD/YYYY';

export const actionTypes = keyMirror({
	SET_CURRENT_SCREEN: null,
	SET_CURRENT_LICENSE_MODEL: null
});

export const enums = keyMirror({

	BREADCRUMS: {
		LICENSE_MODEL: 'LICENSE_MODEL',
		LICENSE_MODEL_OVERVIEW: 'LICENSE_MODEL_OVERVIEW',
		LICENSE_AGREEMENTS: 'LICENSE_AGREEMENTS',
		FEATURE_GROUPS: 'FEATURE_GROUPS',
		ENTITLEMENT_POOLS: 'ENTITLEMENT_POOLS',
		LICENSE_KEY_GROUPS: 'LICENSE_KEY_GROUPS',
		ACTIVITY_LOG: 'ACTIVITY_LOG',

		SOFTWARE_PRODUCT: 'SOFTWARE_PRODUCT',
		SOFTWARE_PRODUCT_LANDING_PAGE: 'SOFTWARE_PRODUCT_LANDING_PAGE',
		SOFTWARE_PRODUCT_DETAILS: 'SOFTWARE_PRODUCT_DETAILS',
		SOFTWARE_PRODUCT_ATTACHMENTS: 'SOFTWARE_PRODUCT_ATTACHMENTS',
		SOFTWARE_PRODUCT_PROCESSES: 'SOFTWARE_PRODUCT_PROCESSES',
		SOFTWARE_PRODUCT_DEPLOYMENT: 'SOFTWARE_PRODUCT_DEPLOYMENT',
		SOFTWARE_PRODUCT_NETWORKS: 'SOFTWARE_PRODUCT_NETWORKS',
		SOFTWARE_PRODUCT_DEPENDENCIES: 'SOFTWARE_PRODUCT_DEPENDENCIES',
		SOFTWARE_PRODUCT_ACTIVITY_LOG: 'SOFTWARE_PRODUCT_ACTIVITY_LOG',
		SOFTWARE_PRODUCT_COMPONENTS: 'SOFTWARE_PRODUCT_COMPONENTS',
		SOFTWARE_PRODUCT_COMPONENT_PROCESSES: 'SOFTWARE_PRODUCT_COMPONENT_PROCESSES',
		SOFTWARE_PRODUCT_COMPONENT_STORAGE: 'SOFTWARE_PRODUCT_COMPONENT_STORAGE',
		SOFTWARE_PRODUCT_COMPONENT_GENERAL: 'SOFTWARE_PRODUCT_COMPONENT_GENERAL',
		SOFTWARE_PRODUCT_COMPONENT_COMPUTE: 'SOFTWARE_PRODUCT_COMPONENT_COMPUTE',
		SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING: 'SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING',
		SOFTWARE_PRODUCT_COMPONENT_MONITORING: 'SOFTWARE_PRODUCT_COMPONENT_MONITORING',
		SOFTWARE_PRODUCT_COMPONENT_IMAGES: 'SOFTWARE_PRODUCT_COMPONENT_IMAGES'
	},

	SCREEN: {
		ONBOARDING_CATALOG: null,
		LICENSE_MODEL_OVERVIEW: null,
		LICENSE_AGREEMENTS: null,
		FEATURE_GROUPS: null,
		ENTITLEMENT_POOLS: null,
		LICENSE_KEY_GROUPS: null,
		ACTIVITY_LOG: null,

		SOFTWARE_PRODUCT_LANDING_PAGE: null,
		SOFTWARE_PRODUCT_DETAILS: null,
		SOFTWARE_PRODUCT_ATTACHMENTS: null,
		SOFTWARE_PRODUCT_PROCESSES: null,
		SOFTWARE_PRODUCT_DEPLOYMENT: null,
		SOFTWARE_PRODUCT_NETWORKS: null,
		SOFTWARE_PRODUCT_DEPENDENCIES: null,
		SOFTWARE_PRODUCT_ACTIVITY_LOG: null,
		SOFTWARE_PRODUCT_COMPONENTS: null,
		SOFTWARE_PRODUCT_COMPONENT_PROCESSES: null,
		SOFTWARE_PRODUCT_COMPONENT_COMPUTE: null,
		SOFTWARE_PRODUCT_COMPONENT_STORAGE: null,
		SOFTWARE_PRODUCT_COMPONENT_NETWORK: null,
		SOFTWARE_PRODUCT_COMPONENT_GENERAL: null,
		SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING: null,
		SOFTWARE_PRODUCT_COMPONENT_MONITORING: null,
		SOFTWARE_PRODUCT_COMPONENT_IMAGES: null
	}
});
