/*!
 * 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 React from 'react';
import PropTypes from 'prop-types';
import i18n from 'nfvo-utils/i18n/i18n.js';
import ClickOutsideWrapper from 'nfvo-components/clickOutsideWrapper/ClickOutsideWrapper.jsx';
import { SVGIcon } from 'onap-ui-react';
import Overlay from 'nfvo-components/overlay/Overlay.jsx';
import Permissions from './Permissions.jsx';

const VCButton = ({ name, tooltipText, disabled, onClick, dataTestId }) => {
    let onClickAction = disabled ? () => {} : onClick;
    return (
        <div
            className={`action-button-wrapper ${
                disabled ? 'disabled' : 'clickable'
            }`}
            onClick={onClickAction}>
            <div className="action-buttons-svg">
                <SVGIcon
                    label={tooltipText}
                    labelPosition="bottom"
                    labelClassName="action-button-label"
                    data-test-id={dataTestId}
                    name={name}
                    disabled={disabled}
                />
            </div>
        </div>
    );
};

const Separator = () => <div className="vc-separator" />;

const SubmitButton = ({ onClick, disabled }) => (
    <div
        onClick={() => onClick()}
        data-test-id="vc-submit-btn"
        className={`vc-submit-button ${disabled ? 'disabled' : ''}`}>
        <SVGIcon name="check" iconClassName="vc-v-submit" disabled={disabled} />
        {i18n('Submit')}
    </div>
);

const ActionButtons = ({
    isReadOnlyMode,
    onSubmit,
    onRevert,
    onSave,
    isFormDataValid,
    onClickPermissions,
    onSync,
    onCommit,
    isArchived,
    onOpenCommentCommitModal,
    showPermissions,
    onClosePermissions,
    permissions,
    onManagePermissions,
    userInfo,
    onOpenRevisionsModal,
    isManual,
    itemPermissions: {
        isCertified,
        isCollaborator,
        isDirty,
        isOutOfSync,
        isUpToDate
    }
}) => (
    <div className="action-buttons">
        <ClickOutsideWrapper onClose={onClosePermissions}>
            <VCButton
                disabled={isManual}
                dataTestId="vc-permission-btn"
                onClick={onClickPermissions}
                name="version-controller-permissions"
                tooltipText={i18n('Permissons')}
            />
            {showPermissions && (
                <Overlay>
                    <Permissions
                        userInfo={userInfo}
                        onManagePermissions={onManagePermissions}
                        permissions={permissions}
                        onClosePermissions={onClosePermissions}
                    />
                </Overlay>
            )}
        </ClickOutsideWrapper>
        {isCollaborator &&
            !isArchived && (
                <div className="collaborator-action-buttons">
                    <Separator />
                    {onSave && (
                        <div className="vc-save-section">
                            <VCButton
                                dataTestId="vc-save-btn"
                                onClick={() => onSave()}
                                name="version-controller-save"
                                tooltipText={i18n('Save')}
                                disabled={isReadOnlyMode || !isFormDataValid}
                            />
                            <Separator />
                        </div>
                    )}
                    <VCButton
                        dataTestId="vc-sync-btn"
                        onClick={onSync}
                        name="version-controller-sync"
                        tooltipText={i18n('Sync')}
                        disabled={!isCollaborator || isUpToDate || isCertified}
                    />
                    <VCButton
                        dataTestId="vc-commit-btn"
                        onClick={() =>
                            onOpenCommentCommitModal({
                                onCommit,
                                title: i18n('Commit')
                            })
                        }
                        name="version-controller-commit"
                        tooltipText={i18n('Share')}
                        disabled={isReadOnlyMode || !isDirty || isOutOfSync}
                    />
                    {onRevert && (
                        <VCButton
                            dataTestId="vc-revert-btn"
                            onClick={onOpenRevisionsModal}
                            name="version-controller-revert"
                            tooltipText={i18n('Revert')}
                            disabled={isReadOnlyMode || isOutOfSync}
                        />
                    )}
                    {onSubmit && (
                        <div className="vc-submit-section">
                            <Separator />
                            <SubmitButton
                                onClick={onSubmit}
                                disabled={
                                    isReadOnlyMode ||
                                    isOutOfSync ||
                                    !isUpToDate ||
                                    isCertified
                                }
                            />
                        </div>
                    )}
                </div>
            )}
    </div>
);

ActionButtons.propTypes = {
    version: PropTypes.object,
    onSubmit: PropTypes.func,
    onRevert: PropTypes.func,
    onSave: PropTypes.func,
    isLatestVersion: PropTypes.bool,
    isCheckedIn: PropTypes.bool,
    isCheckedOut: PropTypes.bool,
    isFormDataValid: PropTypes.bool,
    isReadOnlyMode: PropTypes.bool
};

export default ActionButtons;