import {itemTypes} from 'sdc-app/onboarding/versionsPage/VersionsPageConstants.js';
import {enums, screenTypes} from 'sdc-app/onboarding/OnboardingConstants.js';
import OnboardingActionHelper from 'sdc-app/onboarding/OnboardingActionHelper.js';
import {actionTypes as SoftwareProductActionTypes} from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js';
import ItemsHelper from 'sdc-app/common/helpers/ItemsHelper.js';
import versionPageActionHelper from 'sdc-app/onboarding/versionsPage/VersionsPageActionHelper.js';
import i18n from 'nfvo-utils/i18n/i18n.js';
import {actionTypes as modalActionTypes} from 'nfvo-components/modal/GlobalModalConstants.js';

const ScreensHelper = {
	loadScreen(dispatch, {screen, screenType, props}) {
		if(screen === enums.SCREEN.ONBOARDING_CATALOG) {
			OnboardingActionHelper.navigateToOnboardingCatalog(dispatch);
			return;
		}

		screenType = !screenType ? this.getScreenType(screen) : screenType;

		if(screenType === screenTypes.LICENSE_MODEL) {
			const {licenseModelId, version, licenseModel, usersList} = props;
			let itemStatusPromise = version && screen ?
				ItemsHelper.checkItemStatus(dispatch, {itemId: licenseModelId, versionId: version.id}) :
				Promise.resolve();
			itemStatusPromise.then((updatedVersion) => {
				if (updatedVersion && updatedVersion.status !== version.status) {
					dispatch({
						type: modalActionTypes.GLOBAL_MODAL_WARNING,
						data: {
							title: i18n('Commit error'),
							msg: i18n('Item version was certified by Owner'),
							cancelButtonText: i18n('Cancel')
						}
					});
					versionPageActionHelper.fetchVersions(dispatch, {itemType: itemTypes.LICENSE_MODEL, itemId: licenseModelId});
				}
				let newVersion = updatedVersion ? updatedVersion : version;
				switch (screen) {
					case enums.SCREEN.LICENSE_MODEL_OVERVIEW:
						OnboardingActionHelper.navigateToLicenseModelOverview(dispatch, {licenseModelId, version: newVersion});
						break;
					case enums.SCREEN.LICENSE_AGREEMENTS:
						OnboardingActionHelper.navigateToLicenseAgreements(dispatch, {licenseModelId, version: newVersion});
						break;
					case enums.SCREEN.FEATURE_GROUPS:
						OnboardingActionHelper.navigateToFeatureGroups(dispatch, {licenseModelId, version: newVersion});
						break;
					case enums.SCREEN.ENTITLEMENT_POOLS:
						OnboardingActionHelper.navigateToEntitlementPools(dispatch, {licenseModelId, version: newVersion});
						break;
					case enums.SCREEN.LICENSE_KEY_GROUPS:
						OnboardingActionHelper.navigateToLicenseKeyGroups(dispatch, {licenseModelId, version: newVersion});
						break;
					case enums.SCREEN.ACTIVITY_LOG:
						OnboardingActionHelper.navigateToLicenseModelActivityLog(dispatch, {licenseModelId, version: newVersion});
						break;
					case enums.SCREEN.VERSIONS_PAGE:
					default:
						OnboardingActionHelper.navigateToVersionsPage(dispatch, {
							itemId: licenseModelId,
							itemType: itemTypes.LICENSE_MODEL,
							itemName: licenseModel.name,
							users: usersList
						});
						break;
				}
			});
		}

		else if(screenType === screenTypes.SOFTWARE_PRODUCT) {
			const {softwareProductId, componentId, version, softwareProduct, usersList} = props;
			let itemStatusPromise = version && screen ?
				ItemsHelper.checkItemStatus(dispatch, {itemId: softwareProductId, versionId: version.id}) :
				Promise.resolve();
			itemStatusPromise.then((updatedVersion) => {
				if (updatedVersion && updatedVersion.status !== version.status) {
					dispatch({
						type: modalActionTypes.GLOBAL_MODAL_WARNING,
						data: {
							title: i18n('Commit error'),
							msg: i18n('Item version already Certified'),
							cancelButtonText: i18n('Cancel')
						}
					});
					versionPageActionHelper.fetchVersions(dispatch, {itemType: itemTypes.SOFTWARE_PRODUCT, itemId: softwareProductId});
				}

				let newVersion = updatedVersion ? updatedVersion : version;
				if (screen === screenTypes.SOFTWARE_PRODUCT_COMPONENT_DEFAULT_GENERAL) {
					OnboardingActionHelper.navigateToSoftwareProductComponentGeneralAndUpdateLeftPanel(dispatch, {
						softwareProductId,
						componentId,
						version: newVersion
					});
				}
				if (componentId) {
					switch (screen) {
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
							OnboardingActionHelper.navigateToSoftwareProductComponentGeneralAndUpdateLeftPanel(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL:
							OnboardingActionHelper.navigateToSoftwareProductComponentGeneral(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE:
							OnboardingActionHelper.navigateToComponentCompute(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING:
							OnboardingActionHelper.navigateToComponentLoadBalancing(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK:
							OnboardingActionHelper.navigateToComponentNetwork(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE:
							OnboardingActionHelper.navigateToComponentStorage(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES:
							OnboardingActionHelper.navigateToSoftwareProductComponentProcesses(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING:
							OnboardingActionHelper.navigateToSoftwareProductComponentMonitoring(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_IMAGES:
							OnboardingActionHelper.navigateToComponentImages(dispatch, {
								softwareProductId,
								componentId,
								version: newVersion
							});
							break;
					}
				}
				else {
					switch (screen) {
						case enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE:
							OnboardingActionHelper.navigateToSoftwareProductLandingPage(dispatch, {
								softwareProductId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_DETAILS:
							OnboardingActionHelper.navigateToSoftwareProductDetails(dispatch, {
								softwareProductId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS_SETUP:
							OnboardingActionHelper.navigateToSoftwareProductAttachmentsSetupTab(dispatch, {
								softwareProductId,
								version
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS_VALIDATION:
							OnboardingActionHelper.navigateToSoftwareProductAttachmentsValidationTab(dispatch, {
								softwareProductId,
								version
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
							OnboardingActionHelper.navigateToSoftwareProductProcesses(dispatch, {
								softwareProductId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT:
							OnboardingActionHelper.navigateToSoftwareProductDeployment(dispatch, {
								softwareProductId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
							OnboardingActionHelper.navigateToSoftwareProductNetworks(dispatch, {
								softwareProductId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
							OnboardingActionHelper.navigateToSoftwareProductDependencies(dispatch, {
								softwareProductId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG:
							OnboardingActionHelper.navigateToSoftwareProductActivityLog(dispatch, {
								softwareProductId,
								version: newVersion
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
							OnboardingActionHelper.navigateToSoftwareProductComponents(dispatch, {
								softwareProductId,
								version: newVersion
							});
							dispatch({
								type: SoftwareProductActionTypes.TOGGLE_NAVIGATION_ITEM,
								mapOfExpandedIds: {
									[enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS]: true
								}
							});
							break;
						case enums.SCREEN.SOFTWARE_PRODUCT_VERSIONS_PAGE:
						default:
							OnboardingActionHelper.navigateToVersionsPage(dispatch, {
								itemId: softwareProductId,
								itemType: itemTypes.SOFTWARE_PRODUCT,
								itemName: softwareProduct.name,
								users: usersList,
								additionalProps: {
									licenseModelId: softwareProduct.vendorId,
									licensingVersion: softwareProduct.licensingVersion
								}
							});
							break;
					}
				}
			});
		}
	},

	getScreenType(screen) {
		switch (screen) {
			case enums.SCREEN.LICENSE_MODEL_OVERVIEW:
			case enums.SCREEN.LICENSE_AGREEMENTS:
			case enums.SCREEN.FEATURE_GROUPS:
			case enums.SCREEN.ENTITLEMENT_POOLS:
			case enums.SCREEN.LICENSE_KEY_GROUPS:
			case enums.SCREEN.ACTIVITY_LOG:
				return screenTypes.LICENSE_MODEL;
			case screenTypes.SOFTWARE_PRODUCT_COMPONENT_DEFAULT_GENERAL:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_GENERAL:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_COMPUTE:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_LOAD_BALANCING:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_NETWORK:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_STORAGE:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_MONITORING:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_IMAGES:
			case enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE:
			case enums.SCREEN.SOFTWARE_PRODUCT_DETAILS:
			case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS:
			case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
			case enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT:
			case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
			case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
			case enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG:
			case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
				return screenTypes.SOFTWARE_PRODUCT;
		}
	},

	loadLandingScreen(dispatch, {previousScreenName, screenType, props: {licenseModelId, softwareProductId, version}}) {
		let selectedScreenType = screenType ? screenType : this.getScreenType(previousScreenName);
		let screen = selectedScreenType === screenTypes.SOFTWARE_PRODUCT ?
			enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE :
			enums.SCREEN.LICENSE_MODEL_OVERVIEW;
		let props = {licenseModelId, softwareProductId, version};
		return this.loadScreen(dispatch, {screen, screenType: selectedScreenType, props});
	}
};

export default ScreensHelper;