/*!
 * 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 classnames from 'classnames';
import Collapse from 'react-bootstrap/lib/Collapse.js';

class NavigationSideBar extends React.Component {
    static PropTypes = {
        activeItemId: PropTypes.string.isRequired,
        onSelect: PropTypes.func,
        onToggle: PropTypes.func,
        groups: PropTypes.array,
        disabled: PropTypes.bool
    };

    constructor(props) {
        super(props);
        this.state = {
            activeItemId: null
        };
        this.handleItemClicked = this.handleItemClicked.bind(this);
    }

    render() {
        let { groups, activeItemId, disabled = false } = this.props;

        return (
            <div
                className={`navigation-side-content ${
                    disabled ? 'disabled' : ''
                }`}>
                {groups.map(group => (
                    <NavigationMenu
                        menu={group}
                        activeItemId={activeItemId}
                        onNavigationItemClick={this.handleItemClicked}
                        key={'menu_' + group.id}
                    />
                ))}
            </div>
        );
    }

    handleItemClicked(event, item) {
        event.stopPropagation();
        if (this.props.onToggle) {
            this.props.onToggle(this.props.groups, item.id);
        }
        if (item.onSelect) {
            item.onSelect();
        }
        if (this.props.onSelect) {
            this.props.onSelect(item);
        }
    }
}

class NavigationMenu extends React.Component {
    static PropTypes = {
        activeItemId: PropTypes.string.isRequired,
        onNavigationItemClick: PropTypes.func,
        menu: PropTypes.array
    };

    render() {
        const { menu, activeItemId, onNavigationItemClick } = this.props;
        return (
            <div className="navigation-group" key={menu.id}>
                <NavigationMenuHeader title={menu.name} />
                <NavigationMenuItems
                    items={menu.items}
                    activeItemId={activeItemId}
                    onNavigationItemClick={onNavigationItemClick}
                />
            </div>
        );
    }
}

function NavigationMenuHeader(props) {
    return (
        <div className="group-name" data-test-id="navbar-group-name">
            {props.title}
        </div>
    );
}

function getItemDataTestId(itemId) {
    return itemId.split('|')[0];
}
function NavigationMenuItems(props) {
    const { items, activeItemId, onNavigationItemClick } = props;
    return (
        <div className="navigation-group-items">
            {items &&
                items.map(item => (
                    <NavigationMenuItem
                        key={'menuItem_' + item.id}
                        item={item}
                        activeItemId={activeItemId}
                        onNavigationItemClick={onNavigationItemClick}
                    />
                ))}
        </div>
    );
}

function NavigationMenuItem(props) {
    const { onNavigationItemClick, item, activeItemId } = props;
    const isGroup = item.items && item.items.length > 0;
    return (
        <div
            className={classnames('navigation-group-item', {
                'selected-item': item.id === activeItemId
            })}
            key={'item_' + item.id}>
            <NavigationLink
                item={item}
                activeItemId={activeItemId}
                onClick={onNavigationItemClick}
            />
            {isGroup && (
                <Collapse
                    in={item.expanded}
                    data-test-id={
                        'navigation-group-' + getItemDataTestId(item.id)
                    }>
                    <div>
                        {item.items.map(subItem => (
                            <NavigationMenuItem
                                key={'menuItem_' + subItem.id}
                                item={subItem}
                                onNavigationItemClick={onNavigationItemClick}
                                activeItemId={activeItemId}
                            />
                        ))}
                    </div>
                </Collapse>
            )}
        </div>
    );
}

function NavigationLink(props) {
    const { item, activeItemId, onClick } = props;
    // todo should this be button
    return (
        <div
            key={'navAction_' + item.id}
            className={classnames('navigation-group-item-name', {
                selected: item.id === activeItemId,
                disabled: item.disabled,
                'bold-name': item.expanded,
                hidden: item.hidden
            })}
            onClick={event => onClick(event, item)}
            data-test-id={'navbar-group-item-' + getItemDataTestId(item.id)}>
            {item.name}
        </div>
    );
}

export default NavigationSideBar;