'use strict';

import React from 'react';
import classnames from 'classnames';

import { AclInformationText } from '../../constants/acl_information_text';
import { replaceSubstringAtIndex, sanitize, intersectLists } from '../../utils/general_utils';
import { getLangText } from '../../utils/lang_utils';


let AclInformation = React.createClass({
    propTypes: {
        verbs: React.PropTypes.arrayOf(React.PropTypes.string),
        aim: React.PropTypes.string.isRequired,
        aclObject: React.PropTypes.object,

        // Must be inserted from the outside
        buttonListSize: React.PropTypes.number.isRequired
    },

    getDefaultProps() {
        return {
            buttonListSize: 400
        };
    },

    getInitialState() {
        return { isVisible: false };
    },

    onOff() {
        if(!this.state.isVisible) {
            this.setState({ isVisible: true });
        }
        else {
            this.setState({ isVisible: false });
        }
    },

    getInfoText(title, info, example){
        const aim = this.props.aim;

        if(aim) {
            if(aim === 'form') {
                return (
                    <p>
                        <span className="info">
                            {replaceSubstringAtIndex(info.slice(2), 's ', ' ')}
                        </span>
                        <span className="example">
                            {' ' + example}
                        </span>
                    </p>
                );
            }
            else if(aim === 'button') {
                return (
                    <p>
                        <span className="title">
                            {title}
                        </span>
                        <span className="info">
                            {info + ' '}
                        </span>
                        <span className="example">
                            {example}
                        </span>
                    </p>
                );
            }
        }
        else {
            console.log('Aim is required when you want to place information text');
        }
    },

    produceInformationBlock() {
        const { titles, informationSentences, exampleSentences } = AclInformationText;
        const { verbs, aim } = this.props;

        const availableInformations = intersectLists(verbs, Object.keys(titles));

        // sorting is not needed, as `this.props.verbs` takes care of sorting already
        // So we assume a user of `AclInformationButton` puts an ordered version of
        // `verbs` into `propTypes`
        let verbsToDisplay = [];


        if(aim === 'form' && availableInformations.length > 0) {
            verbsToDisplay = verbsToDisplay.concat(verbs);
        } else if(aim === 'button' && this.props.aclObject) {
            const { aclObject } = this.props;
            const sanitizedAclObject = sanitize(aclObject, (val) => !val);
            verbsToDisplay = verbsToDisplay.concat(intersectLists(verbs, Object.keys(sanitizedAclObject)));
        }

        return verbsToDisplay.map((verb) => {
            const title = titles[verb];
            const informationSentence = informationSentences[verb];
            const exampleSentence = exampleSentences[verb];

            if (title && informationSentence && exampleSentence) {
                return this.getInfoText(getLangText(title), getLangText(informationSentence), getLangText(exampleSentence));
            }
        });
    },

    getButton() {
        return this.props.aim === 'button' ?
            <button
                style={{ marginTop: 0 }}
                className="btn btn-transparent glyphicon glyphicon-question-sign" onClick={this.onOff} /> :
            null;
    },

    render() {
        const { aim, buttonListSize, verbs } = this.props;
        const { isVisible } = this.state;

        /* Lets just fucking get this widget out... */
        const aclInformationSize = buttonListSize - 30;

        return (
            <span >
                {this.getButton()}
                <div
                    style={{
                        width: verbs.length > 1 && aclInformationSize > 300 ? aclInformationSize : verbs.length === 1 ? null : '100%',
                        marginLeft: verbs.length === 1 ? '.25em' : null
                    }}
                    className={classnames({'acl-information-dropdown-list': true, 'hidden': aim === 'button' && !isVisible})}>
                    <span>{this.produceInformationBlock()}</span>
                </div>
            </span>
        );
    }
});

export default AclInformation;