#!/usr/bin/env ruby
PAGETITLE = "Member Meeting Activity Status" # Wvisible:meeting
$LOAD_PATH.unshift '/srv/whimsy/lib'

require 'whimsy/asf'
require 'wunderbar/bootstrap'
require 'date'
require 'json'
require 'tmpdir'
require_relative 'meeting-util'

# produce HTML
_html do
  _head_ do
    _style :system
    _style %{
      div.status, .status form {margin-left: 16px}
      .btn {margin: 4px}
      form {margin-bottom: 1em}
      .transcript {margin: 0 16px}
      .transcript pre {border: none; line-height: 0}
      pre._hilite {background-color: yellow}
      form p {margin-top: 1em}
      textarea {width: 100%; height: 8em}
      textarea:disabled {background-color: #EEEEEE}
    }    
  end
  _body? do
    MEETINGS = ASF::SVN['Meetings']
    attendance = MeetingUtil.get_attendance(MEETINGS)
    latest = MeetingUtil.get_latest(MEETINGS).untaint
    # determine user's name as found in members.txt
    name = ASF::Member.find_text_by_id($USER).to_s.split("\n").first
    matrix = attendance['matrix'][name]
    begin
      tracker = JSON.parse(IO.read(File.join(latest, 'non-participants.json')))
    rescue Errno::ENOENT => err
      # Fallback to reading previous meeting's data, and reset variable
      latest = MeetingUtil.get_previous(MEETINGS).untaint
      tracker = JSON.parse(IO.read(File.join(latest, 'non-participants.json')))
    end
    # defaults for active users
    tracker[$USER] ||= {
      'missed' => 0,
      'status' => 'active - attended meetings recently'
    }
    active = (tracker[$USER]['missed'] == 0) && (ENV['QUERY_STRING'] == '')
    _whimsy_body(
      title: PAGETITLE,
      subtitle: active ? 'Your Attendance Status' : 'Poll Of Inactive Members',
      relatedtitle: 'More About Meetings',
      related: {
        'https://www.apache.org/foundation/governance/meetings' => 'How Meetings & Voting Works',
        '/members/proxy' => 'Assign A Proxy For Next Meeting',
        '/members/non-participants' => 'Members Not Participating',
        ASF::SVN.svnpath!('foundation','members.txt') => 'See Official Members.txt File',
        MeetingUtil::RECORDS => 'Official Past Meeting Records'
      },
      helpblock: -> {
        _p do
          _ "This page shows your personal attendance record at past Member's meetings, as of meeting #{latest}."
          _ %{
            It is also a poll of members who have not participated in
            ASF Members Meetings or Elections in the past three years, and 
            if you have been inactive, asks you if you wish to remain active or go emeritus.  Inactive members 
            (only) will see a form below and can
            indicate their choice and provide feedback on meetings by pushing one of the buttons below.
          }
        end
      }
    ) do

      _p_ do
        _span "#{name}, your current meeting attendance status is: "
        _code tracker[$USER]['status']
      end
      if active
        att = miss = 0
        if !matrix.nil?
          matrix.each do |date, status|
            if %w(A V P).include? status
              att += 1
            else
              miss += 1
            end
          end
        end

        if 0 == miss && 0 == att
          _p.text_success "No attendance for Member's meetings found yet"
        else
          _p.text_success "Great! Thanks for attending Member's meetings recently! Overall attends: #{att} Non-attends: #{miss}"
          if 0 == miss
            _p.text_success "WOW! 100% attendance rate - thanks!"
          end
        end
      end

      if not active
        _p.alert.alert_warning "Dear #{name}, You have missed the last " + 
          tracker[$USER]['missed'].to_s + " meetings."

        if _.post? and @status
          _h3_ 'Session Transcript'

          # setup authentication
          if $PASSWORD
            auth = {user: $USER, password: $PASSWORD}
          else
            auth = {}
          end

          # apply and commit changes
          Dir.mktmpdir do |dir|
            _div_.transcript do
              work = ASF::SVN.getInfoItem(latest,'url')
              ASF::SVN.svn_('checkout', [work, dir], _, {depth: 'empty'}.merge(auth))
              json = File.join(dir, 'non-participants.json')
              ASF::SVN.svn_('update', json, _, auth)
              tracker = JSON.parse(IO.read(json))
              tracker[$USER]['status'] = @status
              tracker[$USER]['status'] = @suggestions
              IO.write(json, JSON.pretty_generate(tracker))
              ASF::SVN.svn_('diff', json, _, {verbose: true, sysopts: {hilite: [/"status":/]}})
              ASF::SVN.svn_('commit', json, _, {msg: @status}.merge(auth))
            end
          end
        end
        
        _div.status do
          _form method: 'post' do
            _p %{
              Please let us know how the ASF could make it easier
              for you to participate in Member's Meetings:
            }

            _textarea name: 'suggestions', disabled: active

            _p 'Update your status (if you are inactive):'
            _button.btn.btn_success 'I wish to remain active',
              name: 'status', value: 'remain active',
              disabled: tracker[$USER]['missed'] == 0 or 
                tracker[$USER]['status'] == 'remain active'
            _button.btn.btn_warning 'I would like to go emeritus',
              name: 'status', value: 'go emeritus',
              disabled: tracker[$USER]['missed'] == 0 or 
                tracker[$USER]['status'] == 'remain active'
          end

          _p_ %{
            If you haven't attended or voted in meetings recently, please consider participating, at
            least by proxy, in the upcoming membership meeting.  See the links
            above for more information; submitting a proxy is a simple web form.
          }
        end
      end

      _h1_ 'Your Attendance history', id: 'attendance'
      if not name
        _p.alert.alert_danger "#{$USER} not found in members.txt"
      elsif not matrix
        _p.alert.alert_danger "#{name} not found in attendance matrix"
      else
        _table.table.table_sm style: 'margin: 0 24px; width: auto' do
          _thead do
            _tr do
              _th 'Date'
              _th 'Status'
            end
          end
          matrix.sort.reverse.each do |date, status|
            next if status == ' '
            color = 'bg-danger'
            color = 'bg-warning' if %w(e).include? status
            color = 'bg-success' if %w(A V P).include? status
            _tr_ class: color do
              _td do
                _a date, href:
                  ASF::SVN.svnpath!('Meetings') + date
              end
              case status
              when 'A'
                _td 'Attended'
              when 'V'
                _td 'Voted but did not attend'
              when 'P'
                _td 'Attended via proxy'
              when '-'
                _td 'Did not attend'
              when 'e' 
                _td 'Went emeritus'
              else
                _td status
              end
            end
          end
        end
      end
    end
  end
end
