#!/usr/bin/env ruby
# Encapsulate (most) display of website checks between projects|podlings
require 'wunderbar'
require 'wunderbar/bootstrap'
require_relative '../whimsy/asf/themes'

# Display data for a single project's checks
# @param project id of project
# @param links site data for that specific project
# @param columns list of check types to report on
# @param analysis complete scan data
# @param tlp true if project (default); podling otherwise
def display_project(project, links, analysis, checks, tlp = true)
  _whimsy_panel_table(
    title: "Site Check For #{tlp ? 'Project' : 'Podling'} - #{links['display_name']}",
    helpblock: -> {
      _a href: '../', aria_label: 'Home to site checker' do
        _span.glyphicon.glyphicon_home :aria_hidden
      end
      _span.glyphicon.glyphicon_menu_right
      _ "Results for #{tlp ? 'Project' : 'Podling'} "
      _a links['display_name'], href: links['uri']
      _ '. '
      if !tlp
        _ 'Reminder: Incubation is the process of becoming an Apache project - podlings are not required to meet these checks until graduation.  See '
        _a "this project's incubation status.", href: "http://incubator.apache.org/projects/#{project}"
      end
      _br
      _ 'Check Results column is the actual text or URL found on the homepage for this check (when applicable).'
    }
  ) do
    _table.table.table_striped do
      _thead do
        _tr do
          _th! 'Check Type'
          _th! 'Check Results'
          _th! 'Check Description'
        end
      end
      _tbody do
        checks.keys.each do |col|
          cls = SiteStandards.label(analysis, links, col, project)
          _tr do
            _td do
              _a col.capitalize, href: "../check/#{col}"
            end
            if links[col] =~ /^https?:/
              _td class: cls do
                _a links[col], href: links[col]
              end
            else
              _td links[col], class: cls
            end
            _td do
              if cls != SiteStandards::SITE_PASS
                if checks.keys.include? col
                  if checks[col][SiteStandards::CHECK_TYPE]
                    _ 'URL expected to match regular expression: '
                    _code checks[col][SiteStandards::CHECK_VALIDATE].source
                  else
                    _ 'Text of a link expected to match regular expression: '
                    _code checks[col][SiteStandards::CHECK_TEXT].source
                  end
                    _br
                    _a checks[col][SiteStandards::CHECK_DOC], href: checks[col][SiteStandards::CHECK_POLICY]
                else
                  _ ''
                end
              end
            end
          end
        end
      end
    end
  end
end

# Display data for a single check across all projects/podlings
# @param col id of check to display
# @param sites site data for all projects
# @param analysis complete scan data
# @param checks complete set of checks performed
# @param tlp true if project (default); podling otherwise
def display_check(col, sites, analysis, checks, tlp = true)
  _whimsy_panel_table(
    title: "Site Check Of Type - #{col.capitalize}",
    helpblock: -> {
      _a href: '../', aria_label: 'Home to site checker' do
        _span.glyphicon.glyphicon_home :aria_hidden
      end
      _span.glyphicon.glyphicon_menu_right
      if checks.keys.include? col
        if checks[col][SiteStandards::CHECK_TYPE]
          _ 'Check Results URL expected to match regular expression: '
          _code checks[col][SiteStandards::CHECK_VALIDATE].source
        else
          _ 'Check Results Text of a link expected to match regular expression: '
          _code checks[col][SiteStandards::CHECK_TEXT].source
        end
        if checks.include? col
          _br
          _a checks[col][SiteStandards::CHECK_DOC], href: checks[col][SiteStandards::CHECK_POLICY]
        end
        _li.small " Click column badges to sort"
      else
        _span.text_danger "WARNING: the site checker may not understand type: #{col}, results may not be complete/available."
      end
    }
  ) do
    _table.table.table_condensed.table_striped do
      _thead do
        _tr do
          _th! "#{tlp ? 'Project' : 'Podling'}", data_sort: 'string-ins'
          _th! data_sort: 'string' do 
            _ 'Check Results'
            _br
            analysis[0][col].each do |cls, val|
              _ ' '
              _span.label val, class: cls
            end
          end
        end
      end
      _tbody do
        sites.each do |n, links|
          _tr do
            _td do 
              _a links['display_name'], href: "../project/#{n}"
            end
            if links[col] =~ /^https?:/
              _td class: SiteStandards.label(analysis, links, col, n) do
                _a links[col], href: links[col]
              end
            else
              _td links[col], class: SiteStandards.label(analysis, links, col, n) 
            end
          end
        end
      end
    end
  end
end

# Display an overview of all checks/sites
# @param sites site data for all projects
# @param analysis complete scan data
# @param checks complete set of checks performed
# @param tlp true if project (default); podling otherwise
def display_overview(sites, analysis, checks, tlp = true)
  _whimsy_panel_table(
    title: "Site Check - All #{tlp ? 'Project' : 'Podling'} Results",
    helpblock: -> {
      _ul.list_inline do
        _li.small "Data key: "
        analysis[1].each do |cls, desc|
          _li.label desc, class: cls
        end
        _li.small " Click column badges to sort"
      end
    }
  ) do
    _table.table.table_condensed.table_striped do
      _thead do  
        _tr do
          _th! "#{tlp ? 'Project' : 'Podling'}", data_sort: 'string-ins'
          checks.keys.each do |col|
            _th! data_sort: 'string' do 
              _a col.capitalize, href: "check/#{col}"
              _br
              analysis[0][col].each do |cls, val|
                _ ' '
                _span.label val, class: cls
              end
            end
          end
        end
      end
      sort_order = {
        SiteStandards::SITE_PASS => 1,
        SiteStandards::SITE_WARN => 2,
        SiteStandards::SITE_FAIL => 3
      }
      _tbody do
        sites.each do |n, links|
          _tr do
            _td do 
              _a "#{links['display_name']}", href: "project/#{n}"
            end
            checks.keys.each do |c|
              cls = SiteStandards.label(analysis, links, c, n)
              _td '', class: cls, data_sort_value: sort_order[cls]
            end
          end
        end
      end
    end
  end
end

# Display an error page if a suburl we're given isn't supported
def display_error(path)
  _whimsy_panel_table(
    title: "ERROR - bad url provided",
    helpblock: -> {
      _a href: '../', aria_label: 'Home to site checker' do
        _span.glyphicon.glyphicon_home :aria_hidden
      end
      _span.glyphicon.glyphicon_menu_right
      _span.text_danger "ERROR: The path #{path} is not a recognized command for this tool, sorry! "
    }
  ) do
    _a.bold 'ERROR - please try again.', href: '../'
  end
end

# Display our application's data - handles / and project/id|check/id paths
def display_application(path, sites, analysis, checks, tlp = true)
  if path =~ %r{/project/(.+)} # Display a single project
    if sites[$1]
      display_project($1, sites[$1], analysis, checks, tlp)
    else
      display_error(path)
    end
  elsif path =~ %r{/check/(.+)} # Display a single check
    if checks[$1]
      display_check($1, sites, analysis, checks, tlp)
    else
      display_error(path)
    end
  else
    display_overview(sites, analysis, checks, tlp)
  end
end

