/*
 * Copyright © 2016-2018 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 { connect } from 'react-redux';

import i18n from 'nfvo-utils/i18n/i18n.js';
import TabulatedEditor from 'src/nfvo-components/editor/TabulatedEditor.jsx';
import ScreensHelper from 'sdc-app/common/helpers/ScreensHelper.js';
import { enums, screenTypes } from 'sdc-app/onboarding/OnboardingConstants.js';

import PermissionsActionHelper from './../permissions/PermissionsActionHelper.js';
import RevisionsActionHelper from './../revisions/RevisionsActionHelper.js';

import LicenseModelActionHelper from './LicenseModelActionHelper.js';
import { actionTypes as modalActionTypes } from 'nfvo-components/modal/GlobalModalConstants.js';
import { modalContentMapper } from 'sdc-app/common/modal/ModalContentMapper.js';
import { CommitModalType } from 'nfvo-components/panel/versionController/components/CommitCommentModal.jsx';

const buildNavigationBarProps = (licenseModel, screen) => {
    const { id, vendorName, version } = licenseModel;
    const meta = { version };

    const groups = [
        {
            id,
            name: vendorName,
            items: [
                {
                    id: enums.SCREEN.LICENSE_MODEL_OVERVIEW,
                    name: i18n('Overview'),
                    meta
                },
                {
                    id: enums.SCREEN.LICENSE_AGREEMENTS,
                    name: i18n('License Agreements'),
                    meta
                },
                {
                    id: enums.SCREEN.FEATURE_GROUPS,
                    name: i18n('Feature Groups'),
                    meta
                },
                {
                    id: enums.SCREEN.ENTITLEMENT_POOLS,
                    name: i18n('Entitlement Pools'),
                    meta
                },
                {
                    id: enums.SCREEN.LICENSE_KEY_GROUPS,
                    name: i18n('License Key Groups'),
                    meta
                },
                {
                    id: enums.SCREEN.ACTIVITY_LOG,
                    name: i18n('Activity Log'),
                    meta
                }
            ]
        }
    ];

    return {
        activeItemId: screen,
        groups
    };
};

const buildVersionControllerProps = ({
    licenseModelEditor = { data: {} },
    versions,
    currentVersion,
    userInfo,
    usersList,
    permissions,
    isArchived,
    itemPermission,
    isReadOnlyMode
}) => {
    const { isValidityData = true } = licenseModelEditor;
    return {
        version: currentVersion,
        viewableVersions: versions,
        isFormDataValid: isValidityData,
        permissions,
        userInfo,
        usersList,
        isArchived,
        itemName: licenseModelEditor.data.vendorName,
        itemPermission,
        isReadOnlyMode
    };
};

const mapStateToProps = (
    {
        users: { userInfo, usersList },
        licenseModel: { licenseModelEditor },
        versionsPage: { permissions, versionsList: { versions } }
    },
    {
        currentScreen: {
            screen,
            itemPermission,
            props: { isReadOnlyMode, version: currentVersion }
        }
    }
) => {
    return {
        versionControllerProps: buildVersionControllerProps({
            licenseModelEditor,
            versions,
            currentVersion,
            userInfo,
            permissions,
            usersList,
            isArchived: itemPermission.isArchived,
            itemPermission,
            isReadOnlyMode
        }),
        navigationBarProps: buildNavigationBarProps(
            licenseModelEditor.data,
            screen
        )
    };
};

const mapActionsToProps = (
    dispatch,
    { currentScreen: { screen, props: { licenseModelId, version } } }
) => {
    return {
        onVersionControllerAction: (action, version, comment) =>
            LicenseModelActionHelper.performVCAction(dispatch, {
                licenseModelId,
                action,
                version,
                comment
            }).then(updatedVersion => {
                ScreensHelper.loadScreen(dispatch, {
                    screen,
                    screenType: screenTypes.LICENSE_MODEL,
                    props: { licenseModelId, version: updatedVersion }
                });
            }),

        onOpenCommentCommitModal: ({ onCommit, title }) =>
            dispatch({
                type: modalActionTypes.GLOBAL_MODAL_SHOW,
                data: {
                    modalComponentName: modalContentMapper.COMMIT_COMMENT,
                    modalComponentProps: {
                        onCommit,
                        type: CommitModalType.COMMIT
                    },
                    title
                }
            }),

        onVersionSwitching: version => {
            ScreensHelper.loadScreen(dispatch, {
                screen,
                screenType: screenTypes.LICENSE_MODEL,
                props: { licenseModelId, version }
            });
        },

        onManagePermissions() {
            PermissionsActionHelper.openPermissonsManager(dispatch, {
                itemId: licenseModelId,
                askForRights: false
            });
        },

        onMoreVersionsClick: ({ itemName, users }) => {
            ScreensHelper.loadScreen(dispatch, {
                screen: enums.SCREEN.VERSIONS_PAGE,
                screenType: screenTypes.LICENSE_MODEL,
                props: {
                    licenseModelId,
                    licenseModel: { name: itemName },
                    usersList: users
                }
            });
        },

        onOpenPermissions: ({ users }) => {
            return PermissionsActionHelper.fetchItemUsers(dispatch, {
                itemId: licenseModelId,
                allUsers: users
            });
        },

        onOpenRevisionsModal: () => {
            return RevisionsActionHelper.openRevisionsView(dispatch, {
                itemId: licenseModelId,
                version: version,
                itemType: screenTypes.LICENSE_MODEL
            });
        },

        onNavigate: ({ id }) => {
            ScreensHelper.loadScreen(dispatch, {
                screen: id,
                screenType: screenTypes.LICENSE_MODEL,
                props: { licenseModelId, version }
            });
        }
    };
};

export default connect(mapStateToProps, mapActionsToProps)(TabulatedEditor);