/*!
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 *
 * 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 ReactDOM from 'react-dom';
import classnames from 'classnames';
import i18n from 'nfvo-utils/i18n/i18n.js';
import { notificationType } from './UserNotificationsConstants.js';
import ShowMore from 'react-show-more-text';

const Notification = ({
    notification,
    users,
    onActionClicked,
    getNotificationTypeDesc
}) => {
    const { eventType, read, eventAttributes, dateTime } = notification;
    const {
        itemName,
        userId,
        description,
        versionName,
        permission,
        granted
    } = eventAttributes;
    const { fullName: userName } = users.find(user => user.userId === userId);
    return (
        <div className={classnames('notification', { unread: !read })}>
            <div className="notification-data">
                <div className="item-name">
                    {itemName}
                    {versionName && (
                        <span>&nbsp;&nbsp;&nbsp;v{versionName}</span>
                    )}
                    {!read && <div className="unread-circle-icon" />}
                </div>
                <div className="flex-items">
                    <div className="type">
                        {getNotificationTypeDesc(
                            eventType,
                            permission,
                            granted
                        )}
                    </div>
                    <div className="separator" />
                    <div className="user-name">{`${i18n(
                        'By'
                    )} ${userName}`}</div>
                </div>
                {(description || versionName) && (
                    <div className="description">
                        {description && (
                            <ShowMore
                                anchorClass="more-less"
                                lines={2}
                                more={i18n('More')}
                                less={i18n('Less')}>
                                {description}
                            </ShowMore>
                        )}
                        {eventType === notificationType.ITEM_CHANGED.SUBMIT && (
                            <div>
                                <div>
                                    {i18n(
                                        'Version {versionName} was submitted.',
                                        { versionName: versionName }
                                    )}
                                </div>
                            </div>
                        )}
                    </div>
                )}
                <div className="date">{dateTime}</div>
            </div>
            <div className="notification-action">
                <div
                    className={classnames('action-button', { hidden: read })}
                    onClick={() => onActionClicked(notification)}>
                    {eventType === notificationType.PERMISSION_CHANGED ||
                    eventType === notificationType.ITEM_DELETED ||
                    eventType === notificationType.ITEM_ARCHIVED ||
                    eventType === notificationType.ITEM_RESTORED
                        ? i18n('OK')
                        : i18n('Sync')}
                </div>
            </div>
        </div>
    );
};

function getNotificationTypeDesc(eventType, permission, granted) {
    switch (eventType) {
        case notificationType.PERMISSION_CHANGED:
            const grantedStr = granted ? i18n('Granted') : i18n('Taken');
            return `${i18n('Permission')} ${grantedStr}: ${permission}`;
        case notificationType.ITEM_CHANGED.COMMIT:
            return i18n('Your Copy Is Out Of Sync');
        case notificationType.ITEM_CHANGED.SUBMIT:
            return i18n('Version Submitted');
        case notificationType.ITEM_DELETED:
            return i18n('Item was deleted');
        case notificationType.ITEM_ARCHIVED:
            return i18n('Item was archived');
        case notificationType.ITEM_RESTORED:
            return i18n('Item was restored from archive');
    }
}

class UserNotifications extends React.Component {
    static propTypes = {
        currentScreen: PropTypes.object,
        notificationsList: PropTypes.array,
        usersList: PropTypes.array,
        lastScanned: PropTypes.string,
        endOfPage: PropTypes.string,
        onLoadPrevNotifications: PropTypes.func,
        onSync: PropTypes.func,
        updateNotification: PropTypes.func,
        onLoadItemsLists: PropTypes.func
    };

    render() {
        const {
            notificationsList = [],
            usersList,
            lastScanned,
            endOfPage
        } = this.props;

        return (
            <div className="user-notifications">
                <div className="notifications-title">
                    {i18n('Notifications')}
                </div>
                <div
                    className="notifications-list"
                    ref="notificationList"
                    onScroll={() =>
                        this.loadPrevNotifications(lastScanned, endOfPage)
                    }>
                    {notificationsList.map(notification => (
                        <Notification
                            key={notification.eventId}
                            notification={notification}
                            users={usersList}
                            onActionClicked={notification =>
                                this.onActionClicked(notification)
                            }
                            getNotificationTypeDesc={getNotificationTypeDesc}
                        />
                    ))}
                </div>
            </div>
        );
    }

    onActionClicked(notification) {
        const {
            onSync,
            updateNotification,
            currentScreen,
            onLoadItemsLists
        } = this.props;
        const {
            eventType,
            eventAttributes: { itemId, itemName, versionId, versionName }
        } = notification;
        if (
            eventType !== notificationType.PERMISSION_CHANGED &&
            eventType !== notificationType.ITEM_DELETED &&
            eventType !== notificationType.ITEM_ARCHIVED &&
            eventType !== notificationType.ITEM_RESTORED
        ) {
            onSync({ itemId, itemName, versionId, versionName, currentScreen });
        } else {
            onLoadItemsLists();
        }
        updateNotification(notification);
    }

    loadPrevNotifications(lastScanned, endOfPage) {
        if (endOfPage && lastScanned) {
            let element = ReactDOM.findDOMNode(this.refs['notificationList']);
            const { onLoadPrevNotifications } = this.props;

            if (
                element &&
                element.clientHeight + element.scrollTop ===
                    element.scrollHeight
            ) {
                onLoadPrevNotifications(lastScanned, endOfPage);
            }
        }
    }
}

export default UserNotifications;
