/*!
 * 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 i18n from 'nfvo-utils/i18n/i18n.js';
import ListEditorView from 'nfvo-components/listEditor/ListEditorView.jsx';
import ListEditorItemView from 'nfvo-components/listEditor/ListEditorItemView.jsx';
import LimitEditor from './LimitEditor.js';
import { NEW_LIMIT_TEMP_ID, selectValues } from './LimitEditorConstants.js';

const LimitItem = ({ isReadOnlyMode, limit, onDelete, onSelect }) => {
    const {
        name,
        description,
        value,
        metric,
        aggregationFunction = '',
        time = ''
    } = limit;
    const timeLabel = time ? `per ${time}` : '';
    let metricOption = selectValues.METRIC.find(item => item.enum === metric);
    metricOption = metricOption ? metricOption.title : metric;

    return (
        <ListEditorItemView
            onDelete={onDelete}
            onSelect={onSelect}
            isReadOnlyMode={isReadOnlyMode}>
            <div className="list-editor-item-view-field limit-name">
                <div className="text name">{name}</div>
            </div>

            <div className="list-editor-item-view-field limit-description">
                <div className="text description">{description}</div>
            </div>

            <div className="list-editor-item-view-field limit-metric-details">
                <div className="text description">{`${metricOption} ${value} ${aggregationFunction} ${timeLabel}`}</div>
            </div>
        </ListEditorItemView>
    );
};

class Limits extends React.Component {
    state = {
        localFilter: ''
    };

    render() {
        const {
            isReadOnlyMode = false,
            limitEditor,
            limitsList = [],
            onCloseLimitEditor,
            selectedLimit
        } = this.props;
        let limitsNames = {};
        for (let i = 0; i < limitsList.length; i++) {
            limitsNames[limitsList[i].name.toLowerCase()] = limitsList[i].id;
        }
        return (
            <div className="license-model-limits-view">
                <ListEditorView isReadOnlyMode={isReadOnlyMode}>
                    {this.props.selectedLimit === NEW_LIMIT_TEMP_ID &&
                        limitEditor.data && (
                            <LimitEditor
                                limitsNames={limitsNames}
                                onCancel={onCloseLimitEditor}
                                onSubmit={() => this.submit()}
                                isReadOnlyMode={isReadOnlyMode}
                            />
                        )}
                    {limitsList.length === 0 &&
                        !limitEditor.data && (
                            <div className="no-limits-text">
                                {i18n('There are no limits')}
                            </div>
                        )}
                    {limitsList.map(limit => (
                        <div key={limit.id} className="limit-item-wrapper">
                            <LimitItem
                                onDelete={() => this.deleteLimit(limit)}
                                onSelect={
                                    selectedLimit
                                        ? undefined
                                        : () => this.props.onSelectLimit(limit)
                                }
                                clickable={!selectedLimit}
                                isReadOnlyMode={isReadOnlyMode}
                                limit={limit}
                            />
                            {limit.id === selectedLimit &&
                                limitEditor.data && (
                                    <LimitEditor
                                        limitsNames={limitsNames}
                                        onCancel={onCloseLimitEditor}
                                        onSubmit={() => this.submit()}
                                        isReadOnlyMode={isReadOnlyMode}
                                    />
                                )}
                        </div>
                    ))}
                </ListEditorView>
            </div>
        );
    }

    submit() {
        let {
            onSubmit,
            onCloseLimitEditor,
            parent,
            limitEditor,
            licenseModelId,
            version,
            limitType
        } = this.props;
        onSubmit(
            { type: limitType, ...limitEditor.data },
            parent,
            licenseModelId,
            version
        ).then(() => onCloseLimitEditor());
    }

    deleteLimit(limit) {
        let {
            onDelete,
            parent,
            licenseModelId,
            version,
            onCloseLimitEditor,
            selectedLimit
        } = this.props;
        onDelete({
            limit,
            parent,
            licenseModelId,
            version,
            onCloseLimitEditor,
            selectedLimit
        });
    }

    filterList() {
        let { limitsList = [] } = this.props;
        let { localFilter } = this.state;
        if (localFilter.trim()) {
            const filter = new RegExp(escape(localFilter), 'i');
            return limitsList.filter(({ name = '', description = '' }) => {
                return (
                    escape(name).match(filter) ||
                    escape(description).match(filter)
                );
            });
        } else {
            return limitsList;
        }
    }
}

export default Limits;
