$(function() {
    $("div.job").each(function() {
        var root = $(this);
        var job_key = root.attr('data-job-key');

        var job_uri = base_uri + 'job/' + job_key;
        $.ajax(job_uri, {
            'data': { 'content-type': 'application/json' },
            'success': function(item) {
                var dash = t2hui.run.build_table([item]);
                root.prepend($('<h3>Job: ' + (item.short_file || item.name) + '</h3>'), dash, $('<hr />'));
            },
        });

        var controls = $('<div class="event_controls"></div>');
        var filters = $('<ul class="event_filter"><li>Filter Tags:</li></ul>');
        controls.append(filters);
        root.append(controls);
        t2hui.job.filters.dom = filters;

        var events_uri = job_uri + '/events';
        var table = t2hui.job.build_table(events_uri);
        root.append(table);
    });
});

t2hui.job = {
    'filters': {
        seen: {},
        state: {},
        hide: {
            'PASS': true,
            'PLAN': true,
            'HARNESS': true,
        }
    },
};

t2hui.job.build_table = function(uri) {
    var columns = [
        { 'name': 'tools',   'label': 'tools',   'class': 'tools', 'builder': t2hui.job.tool_builder },
        { 'name': 'tag',     'label': 'tag',     'class': 'tag' },
        { 'name': 'message', 'label': 'message', 'class': 'message', 'builder': t2hui.job.message_builder },
    ];

    var table = new FieldTable({
        'class': 'job_table',
        'id': 'jobs_events',
        'fetch': uri,
        'sortable': false,
        'expand_item': t2hui.job.expand_item,

        'place_row': t2hui.job.place_row,
        'modify_row_hook': t2hui.job.modify_row,

        'columns': columns,
    });

    var dom = table.render();

    t2hui.job.table = table;

    return dom;
};

t2hui.job.expand_item = function(item) {
    var out = [];

    var tools = true;
    var count = 0;
    item.lines.forEach(function(line) {
        out.push({
            'tools': tools ? item.lines.length : false,
            'tag': line[1],
            'message': line[2],
            'table': line[3],
            'facet': line[0],
            'item': item,
            'set_ord': count++,
            'set_total': item.lines.length,
        });
        tools = false;
    });

    return out;
}

t2hui.job.message_builder = function(item, dest, data) {
    t2hui.job.message_inner_builder(item, dest, data);

    var indent = '' + ((item.item.nested + 1) * 2) + 'ch';
    dest.css('padding-left', indent);

    if (!item.item.is_parent) { return }

    var expand = $('<div class="stoggle">+</div>');
    dest.prepend(expand);

    expand.one('click', function() {
        expand.text('~');
        expand.addClass('running');
        expand.addClass('expanded');
        var events_uri = base_uri + 'event/' + item.item.event_id + '/events';

        t2hui.fetch(
            events_uri,
            {done: function() { expand.removeClass('running') } },
            t2hui.job.table.render_item,
        )
    });
}

t2hui.job.place_row = function(row, item, table, state) {
    if (!item.item.parent_id) { return false }

    var pid = item.item.parent_id;
    if (!state[pid]) {
        state[pid] = table.find('tr[data-event-id="' + item.item.parent_id + '"]').last();
    }

    state[pid].after(row);
    state[pid] = row;

    return true;
}

t2hui.job.message_inner_builder = function(item, dest, data) {
    if (!item.table) {
        var pre = $('<pre class="testout"></pre>');
        pre.text(item.message);
        dest.append(pre);
        return;
    }

    var data = item.table;

    var table = $('<table class="testtable"></table>');
    var header = $('<tr></tr>');
    table.append(header);

    for (var x = 0; x < data.header.length; x++) {
        var th = $('<th class="header"></th>');
        th.text(data.header[x]);
        header.append(th);
    }

    for (var x = 0; x < data.rows.length; x++) {
        var row_data = data.rows[x];
        var row = $('<tr></tr>');
        table.append(row);

        for (var y = 0; y < row_data.length; y++) {
            var col = $('<td class="' + data.header[y].toLowerCase() + '"></td>');
            col.text(row_data[y]);
            row.append(col);
        }
    }

    dest.append(table);
}

t2hui.job.tool_builder = function(item, tools, data) {
    if (!item.tools) { tools.hide(); return }

    tools.attr('rowspan', item.tools);

    if (item.item.facets) {
        var efacet = $('<div class="tool etoggle" title="See Raw Facet Data"><img src="/img/data.png" /></div>');
        tools.append(efacet);
        efacet.click(function() {
            $('#modal_body').empty();
            $('#modal_body').text("loading...");
            $('#free_modal').slideDown();

            var uri = base_uri + 'event/' + item.item.event_id;

            $.ajax(uri, {
                'data': { 'content-type': 'application/json' },
                'success': function(event) {
                    $('#modal_body').empty();
                    $('#modal_body').jsonView(event.facets, {collapsed: true});
                },
            });
        });
    }

    if (item.item.orphan) {
        var eorphan = $('<div class="tool etoggle" title="See Orphan Facet Data"><img src="/img/orphan.png" /></div>');
        tools.append(eorphan);
        eorphan.click(function() {
            $('#modal_body').empty();
            $('#modal_body').text("loading...");
            $('#free_modal').slideDown();

            var uri = base_uri + 'event/' + item.item.event_id;

            $.ajax(uri, {
                'data': { 'content-type': 'application/json' },
                'success': function(event) {
                    $('#modal_body').empty();
                    $('#modal_body').jsonView(event.orphan, {collapsed: true});
                },
            });
        });
    }
}

t2hui.job.clean_tag = function(tag) {
    var clean = tag.replace(' ', '_');
    return clean;
}

t2hui.job.modify_row = function(row, item) {
    var tag = item.tag;
    var ctag = t2hui.job.clean_tag(tag);

    row.addClass('facet_' + item.facet);
    row.addClass('tag_' + ctag);

    row.attr('data-event-id', item.item.event_id);

    if (!t2hui.job.filters.seen[tag]) {
        t2hui.job.filters.state[tag] = !t2hui.job.filters.hide[tag];
        t2hui.job.filters.seen[tag] = 1;

        var filter = $('<li class="filter">' + tag + '</li>');
        var added = false;
        t2hui.job.filters.dom.children('.filter').each(function() {
            if (added) { return false };

            var it = $(this);
            if (tag < it.text()) {
                added = true;
                it.before(filter);
                return false;
            }
        });
        if (!added) { t2hui.job.filters.dom.append(filter) }

        if (!t2hui.job.filters.state[tag]) {
            filter.addClass('off');
        }

        filter.click(function() {
            if (t2hui.job.filters.state[tag]) {
                t2hui.job.filters.state[tag] = false;
                $(this).addClass('off');
                t2hui.job.table.table.find('tr.tag_' + ctag).addClass('hidden_row');
            }
            else {
                t2hui.job.filters.state[tag] = true;
                $(this).removeClass('off');
                t2hui.job.table.table.find('tr.tag_' + ctag).removeClass('hidden_row');
            }
        })
    }

    if (!t2hui.job.filters.state[tag]) {
        row.addClass('hidden_row');
    }
}