#!/usr/bin/env ruby
PAGETITLE = "Server error log listing" # Wvisible:debug
$LOAD_PATH.unshift '/srv/whimsy/lib'
require 'json'
require 'whimsy/asf'
require 'wunderbar'
require 'wunderbar/bootstrap'
require 'whimsy/logparser'

# Emit table of interesting error logs
def display_errors(current)
  _whimsy_panel_table(
    title: 'Partial error listing',
    helpblock: -> {
      _ "This only includes a subset of possibly interesting error log entries from the #{current ? 'current day' : 'past week'}."
      _a 'See the full server logs directory (by date, descending)', href: '/members/log?C=M;O=D'
    }
  ) do
    logs = LogParser.get_errors(current)
    _table.table.table_hover.table_striped do
      _thead_ do
        _tr do
          _th 'Date/Time'
          _th ''
          _th 'Error text or array of errors'
        end
        _tbody do
          logs.each do | key, val |
            _tr_ do
              _td :class => 'nowrap' do
                _ key
              end
              _td do
                if val.is_a?(Array)
                  _span.glyphicon.glyphicon_remove_circle :aria_hidden, aria_label: 'List of code errors'
                elsif /Passenger/ =~ val
                  _span.glyphicon.glyphicon_briefcase :aria_hidden, aria_label: 'Passenger server message'
                else
                  _span.glyphicon.glyphicon_remove_sign :aria_hidden, aria_label: 'stderr line from code'
                end
              end
              _td do
                if val.is_a?(Array)
                  val.each do |i|
                    _ i
                    _br
                  end
                else
                  _ val
                end
              end
            end
          end
        end
      end
    end
  end
end

# Emit table of interesting access logs (optional, with ?access)
def display_access()
  apps, misses = LogParser.get_access_reports()
  _p do
    _ 'This only includes a subset of possibly interesting access log entries from the current day, roughly categorized by major application (board, roster, etc.)'
    _a 'See the full server logs directory.', href: '/members/log'
  end 
  _h2 'Access Log Synopsis - by Path or Tool'
  listid = 'applist'
  _div.panel_group id: listid, role: 'tablist', aria_multiselectable: 'true' do
    apps.each_with_index do |(name, data), n|
      itemtitle = LogParser::WHIMSY_APPS[name] ? LogParser::WHIMSY_APPS[name] : 'All Other URLs'
      itemtitle << " (#{data['remote_user'].sum{|k,v| v}})" if data['remote_user']
      _whimsy_accordion_item(listid: listid, itemid: name, itemtitle: "#{itemtitle}", n: n, itemclass: 'panel-info') do
        _table.table.table_hover.table_striped do
          _thead_ do
            _tr do
              _th 'User list'
              _th 'URLs hit (total)'
            end
            _tbody do
              _tr_ do
                _td do
                  data['remote_user'].each do |remote_user|
                    _ remote_user
                  end
                end
                _td do
                  data['uri'].sort.each do |uri|
                    _ uri
                    _br
                  end
                end
              end
            end
          end
        end
      end
    end
  end
  _whimsy_panel('Access Log Synopsis - Error URLs', style: 'panel-warning') do
    _p 'This is a simplistic listing of all URLs with 4xx/5xx error codes (excluding obvious bot URLs).'
    erruri = {}
    errref = {}
    misses.each do |h|
      erruri[h['uri']] = ''
      errref[h['referer']] = ''
    end
    _h3 'URIs hit that returned 4xx/5xx errors'
    _ul do
      erruri.keys.sort.each do |u|
        _li u
      end
    end
    _h3 'Referrers for all above 4xx/5xx errors'
    _ul do
      errref.keys.sort.each do |u|
        _li u
      end
    end
  end
end

_html do
  _style %{
    .nowrap {
      white-space: nowrap;
    }
  }
  _body? do
    _whimsy_body(
      title: PAGETITLE,
      subtitle: 'Simplified listing of interesting log entries',
      relatedtitle: 'More Useful Links',
      related: {
        '/members/log' => 'Full server error and access logs',
        '/docs' => 'Whimsy code and API documentation',
        '/status' => 'Whimsy production server status',
        "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => 'See This Source Code'
      },
      helpblock: -> {
        _p 'This parses error.log and whimsy_error.log and displays a condensed version, in time order (approximate) of today\'s entries.'
        _p do
          _a 'Append "?week"', href: "#{ENV['SCRIPT_NAME']}?week"
          _ ' to the URL to get error results for the last week, and '
          _a 'append "?access"', href: "#{ENV['SCRIPT_NAME']}?access"
          _ ' to parse the access logs instead.'
        end
        _p do
          _span.text_warning 'Reminder: '
          _span.glyphicon.glyphicon_lock :aria_hidden
          _ ' Log data is private to ASF Members; do not distribute any logs.'
        end
      }
    ) do
      # Display whimsy_access.log data if requested (takes longer)
      if ENV['QUERY_STRING'].include? 'access'
        display_access()
      else
        # Append ?week to search all *.log|*.log.gz in dir
        display_errors(!ENV['QUERY_STRING'].include?('week'))
      end
    end
  end
end