/* global Immutable, React */
(function () {
    // NOTE: used by memento.rst
    'use strict';

    function highlight(primary, secondary) {
        return {
            className: React.addons.classSet({
                related: primary,
                secondary: secondary
            })
        };
    }
    var AccountsTable = React.createClass({
        render: function () {
            return React.DOM.div(
                { style: { marginTop: '0' } },
                React.DOM.div(// P&L
                    highlight(this.props.current === 'p-l'),
                    React.DOM.h4(null, "Profit & Loss"),
                    React.DOM.div(
                        null,
                        React.DOM.h5(
                            highlight(null, this.props.current === 'retained'),
                            "Net Profit"),
                        React.DOM.div(
                            highlight(null, this.props.current === 'gross-profit'),
                            React.DOM.h5(
                                highlight(this.props.current === 'gross-profit'),
                                "Gross Profit"),
                            React.DOM.dl(
                                null,
                                React.DOM.dt(null, "Revenue"),
                                React.DOM.dd(
                                    null,
                                    "Revenue"
                                ),
                                React.DOM.dt(null, "Less ", "Costs of Revenue"),
                                React.DOM.dd(
                                    null,
                                    "Cost of Goods Sold"
                                )
                            )
                        ),
                        React.DOM.div(
                            highlight(this.props.current === 'opex'),
                            React.DOM.h5(null, "Operating Income or Loss"),
                            React.DOM.dl(
                                null,
                                React.DOM.dt(
                                    null,
                                    "Less ", "Operating Expenses"),
                                React.DOM.dd(
                                    null,
                                    "R&D", React.DOM.br(),
                                    "Sales, General & Administrative"
                                )
                            )
                        ),
                        React.DOM.dl(
                            null,
                            React.DOM.dt(null, "Plus ", "Other Income"),
                            React.DOM.dd(
                                null,
                                "Foreign Exchange Gains", React.DOM.br(),
                                "Asset write-downs"
                            ),
                            React.DOM.dt(
                                null,
                                "Less ", "Other Expenses"),
                            React.DOM.dd(
                                null,
                                "Interest on debt", React.DOM.br(),
                                "Depreciation"
                            )
                        )
                    )
                ),
                React.DOM.div(//Balance Sheet
                    highlight(this.props.current === 'balance'),
                    React.DOM.h4(null, "Balance Sheet"),
                    React.DOM.div(
                        null,
                        React.DOM.h5(null, "Net Assets"),
                        React.DOM.div(
                            null,
                            React.DOM.h5(highlight(this.props.current === 'assets'), "Total Assets"),
                            React.DOM.dl(
                                highlight(null, this.props.current === 'assets'),
                                React.DOM.dt(null, "Current Assets"),
                                React.DOM.dd(
                                    null,
                                    "Cash & Bank Accounts", React.DOM.br(),
                                    "Accounts Receivable", React.DOM.br(),
                                    "Deferred Tax Assets"
                                ),
                                React.DOM.dt(null, "Plus ", "Non-current Assets"),
                                React.DOM.dd(
                                    null,
                                    "Land & buildings", React.DOM.br(),
                                    "Intangible Assets"
                                )
                            )
                        ),
                        React.DOM.dl(
                            highlight(this.props.current === 'liabilities'),
                            React.DOM.dt(null, "Less ", "Current Liabilities"),
                            React.DOM.dd(
                                null,
                                "Accounts Payable", React.DOM.br(),
                                "Deferred Revenue", React.DOM.br(),
                                "Deferred Tax Liabilities"),
                            React.DOM.dt(null, "Less ", "Non-current liabilities"),
                            React.DOM.dd(
                                null,
                                "Long-term loans")
                        )
                    ),
                    React.DOM.div(
                        highlight(null, this.props.current === 'equity'),
                        React.DOM.h5(highlight(this.props.current === 'equity'), "Total Equity"),
                        React.DOM.dl(
                            null,
                            React.DOM.dt(null, "Equity"),
                            React.DOM.dd(
                                null,
                                "Common Stock"
                            ),
                            React.DOM.dt(
                                highlight(this.props.current === 'retained'),
                                "Plus ", "Retained Earnings"
                            )
                        )
                    )
                )
            );
        }
    });

    document.addEventListener('DOMContentLoaded', function () {
        var target = document.querySelector('.accounts-table');
        if (!target) { return; }
        function render(current) {
            React.render(
                React.createElement(AccountsTable, { current: current }),
                target);
        }

        var list = document.querySelectorAll('.intro-list p');
        Array.prototype.forEach.call(list, function (node) {
            node.addEventListener('mouseover', function (e) {
                if (!e.currentTarget.contains(e.target)) { return; }

                e.currentTarget.classList.add('secondary');
                render(e.currentTarget.className.split(/\s+/).reduce(function (acc, cls) {
                    if (acc) { return acc; }
                    var m = /^intro-(.*)$/.exec(cls);
                    return m && m[1];
                }, null));
            });
            node.addEventListener('mouseout', function (e) {
                // mouseout always precedes mousenter even when going into a
                // child element. Since re-render should be pretty fast (just
                // setting or unsetting a pair of classes) don't try to avoid
                // any thrashing, things should be fast enough either way. If
                // they're not, batch operations on requestAnimationFrame
                // instead.
                e.currentTarget.classList.remove('secondary');
                render(null);
            });
        });

        render(null);
    });
})();