/*
 * 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;