/*
 * Copyright © 2016-2017 European Support Limited
 *
 * 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 RestAPIUtil from 'nfvo-utils/RestAPIUtil.js';
import showFileSaveDialog from 'nfvo-utils/ShowFileSaveDialog.js';
import i18n from 'nfvo-utils/i18n/i18n.js';
import isEqual from 'lodash/isEqual.js';
import cloneDeep from 'lodash/cloneDeep.js';
import {actionTypes as modalActionTypes} from 'nfvo-components/modal/GlobalModalConstants.js';
import {modalContentMapper} from 'sdc-app/common/modal/ModalContentMapper.js';
import {actionTypes as softwareProductsActionTypes} from '../onboarding/softwareProduct/SoftwareProductConstants.js';
import {actionTypes as HeatSetupActions} from '../onboarding/softwareProduct/attachments/setup/HeatSetupConstants.js';



const options = {
	headers: {
		USER_ID: 'validationOnlyVspUser'
	}
};

function fetchVspIdAndVersion() {

	let vspId = sessionStorage.getItem('validationAppVspId');
	let versionId = sessionStorage.getItem('validationAppVersionId');
	if (vspId) {
		return  Promise.resolve({value: vspId, versionId});
	}else {
		return RestAPIUtil.fetch('/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/validation-vsp', options)
			.then(response => {
				sessionStorage.setItem('validationAppVspId', response.itemId);
				sessionStorage.setItem('validationAppVersionId', response.version.id);
				return Promise.resolve({value: response.itemId, versionId: response.version.id});
			});
	}

}


function uploadFile(formData) {
	return fetchVspIdAndVersion()
		.then(response => {
			return RestAPIUtil.post(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/${response.versionId}/orchestration-template-candidate`, formData, options);
		});
}

function loadSoftwareProductHeatCandidate(dispatch){
	return fetchVspIdAndVersion()
		.then(response => {
			return RestAPIUtil.fetch(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/${response.versionId}/orchestration-template-candidate/manifest`, options)
				.then(response => dispatch({
					type: HeatSetupActions.MANIFEST_LOADED,
					response
				}));
		});
}

function updateHeatCandidate(dispatch, heatCandidate) {
	return fetchVspIdAndVersion()
		.then(response => {
			return RestAPIUtil.put(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/${response.versionId}/orchestration-template-candidate/manifest`,
				heatCandidate.heatData, options)
				.then(null, error => {
					dispatch({
						type: modalActionTypes.GLOBAL_MODAL_ERROR,
						data: {
							title: i18n('Save Failed'), 
							modalComponentName: modalContentMapper.SUMBIT_ERROR_RESPONSE,							
							modalComponentProps: {
								validationResponse: error.responseJSON
							},					
							cancelButtonText: i18n('Ok')
						}
					});
					return Promise.reject(error);
				});
		});
}

function fetchSoftwareProduct() {
	return fetchVspIdAndVersion()
		.then(response => {
			return RestAPIUtil.fetch(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/${response.versionId}`, options);
		});
}

function downloadHeatFile() {
	return fetchVspIdAndVersion()
		.then(response => {
			RestAPIUtil.fetch(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/${response.versionId}/orchestration-template-candidate`, {
				...options,
				dataType: 'binary'
			})
				.done((response) => showFileSaveDialog({
					blob: response.blob,
					headers: response.headers,
					defaultFilename: 'HEAT_file.zip',
					addTimestamp: true
				}));
		});
}

function processAndValidateHeatCandidate(dispatch) {
	return fetchVspIdAndVersion()
		.then(response => {
			return RestAPIUtil.put(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/${response.versionId}/orchestration-template-candidate/process`, {}, options)
				.then(response => {
					if (response.status === 'Success') {
						fetchSoftwareProduct().then(response => {
							dispatch({
								type: softwareProductsActionTypes.SOFTWARE_PRODUCT_LOADED,
								response
							});
						});
					}
				});
		});
}

const UploadScreenActionHelper = {
	uploadFile(dispatch, formData) {

		return Promise.resolve()
			.then(() => uploadFile(formData))
			.then(response => {
				dispatch({
					type: softwareProductsActionTypes.SOFTWARE_PRODUCT_LOADED,
					response
				});
				dispatch({
					type: HeatSetupActions.FILL_HEAT_SETUP_CACHE,
					payload:{}
				});
				loadSoftwareProductHeatCandidate(dispatch);
			})
			.catch(error => {
				dispatch({					
					type: modalActionTypes.GLOBAL_MODAL_ERROR,
					data: {
						title: i18n('File Upload Failed'), 													
						msg: error.responseJSON.message,					
						cancelButtonText: i18n('Ok')
					}
				});
			});
	},

	processAndValidateHeat(dispatch, heatData, heatDataCache){
		return isEqual(heatData, heatDataCache) ? Promise.resolve() :
			updateHeatCandidate(dispatch, heatData)
				.then(() => processAndValidateHeatCandidate(dispatch))
				.then(() => dispatch({type: HeatSetupActions.FILL_HEAT_SETUP_CACHE, payload: cloneDeep(heatData)}));
	},

	downloadHeatFile(){
		return downloadHeatFile();
	},
};

export default UploadScreenActionHelper;