#!/usr/bin/env ruby
PAGETITLE = "Incubator/Podling crosscheck" # Wvisible:incubator

$LOAD_PATH.unshift '/srv/whimsy/lib'
require 'json'
require 'whimsy/asf'
require 'wunderbar'
require 'wunderbar/bootstrap'

def get_data(defaults: {})
  return {
    "Sample data processing here" => "row 1",
    "This could come from a file" => "row B"
  }
end

_html do
  _body? do
    _whimsy_body(
      title: PAGETITLE,
      related: {
        "/committers/tools" => "Whimsy Tool Listing",
        "https://incubator.apache.org/images/incubator_feather_egg_logo_sm.png" => "Incubator Logo, to show that graphics can appear",
        "https://community.apache.org/" => "Get Community Help",
        "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => "See This Source Code"
      },
      helpblock: -> {
        _p! do
          _ 'This script cross-checks '
          _a 'Incubator PMC lists in LDAP',
            href: '../../roster/committee/incubator'
          _ ', '
          _a 'mentor lists in podlings.xml',
            href: 'https://svn.apache.org/repos/asf/incubator/public/trunk/content/podlings.xml'
          _ ',  and '
          _a 'Podling lists in LDAP',
            href: '../../roster/ppmc'
          _ '.'
        end
      }
    ) do


      ASF.init_ldap

      ipmc = ASF::Project.find('incubator').owners
      incubator = ASF::Project.find('incubator').members

      podlings = ASF::Podling.current.map {|podling| podling.id}
      podling_committers = ASF::Project.preload.
        select {|project, members| podlings.include? project.name}.
        map {|project,members| project.members}.flatten.uniq

      #
      ### Podling mentors vs IPMC
      #
      _whimsy_panel_table(
        title: "Podling Mentors that are not IPMC members",
      ) do
        _table.table.table_hover.table_striped do
          _thead_ do
            _tr do
              _th 'Podling'
              _th 'Mentor'
            end
            _tbody do
              ASF::Podling.list.each do |podling|
                next unless podling.status == 'current'
                mentors = podling.mentors.map {|id| ASF::Person.find(id)}
                orphans = podling.members - incubator
                unless orphans.empty?
                  orphans.each do |person|
                    if 
                      podling.mentors.include? person.id
                    then
                      _tr_ do
                        _td do
                          _a podling.display_name, 
                            href: "../../roster/ppmc/#{podling.id}"
                        end
                        _td do
                          if person.asf_member?
                            _b do
                              _a person.public_name,
                                href: "../../roster/committer/#{person.id}"
                            end
                          else
                            _a person.public_name,
                              href: "../../roster/committer/#{person.id}"
                          end
                        end
                      end
                    end
                  end
                end
              end
            end
          end
        end
      end

      #
      ### PPMC committers vs incubator committers 
      #
      _whimsy_panel_table(
        title: "Podling Committers that are not Incubator committers",
      ) do
        _table.table.table_hover.table_striped do
          _thead_ do
            _tr do
              _th 'Podling'
              _th 'Committer'
            end
            _tbody do
              ASF::Podling.list.each do |podling|
                next unless podling.status == 'current'
                mentors = podling.mentors.map {|id| ASF::Person.find(id)}
                orphans = podling.members - incubator
                unless orphans.empty?
                  orphans.each do |person|
                    if 
                      not podling.mentors.include? person.id
                    then
                      _tr_ do
                        _td do
                          _a podling.display_name, 
                            href: "../../roster/ppmc/#{podling.id}"
                        end
                        _td do
                          if person.asf_member?
                            _b do
                              _a person.public_name,
                                href: "../../roster/committer/#{person.id}"
                            end
                          else
                            _a person.public_name,
                              href: "../../roster/committer/#{person.id}"
                          end
                        end
                      end
                    end
                  end
                end
              end
            end
          end
        end
      end

      #
      ### Incubator committers vs Podling committers
      #
      _whimsy_panel_table(
        title: "Incubator committers that are not on the IPMC and are not 
                listed as a committer of any podling"
      ) do
        _table.table.table_hover.table_striped do
          _thead_ do
            _tr do
              _th 'Committer'
            end
            _tbody do
              incubator.sort_by {|person| person.public_name}.each do |person|
                next if ipmc.include? person
                next if podling_committers.include? person
                _tr_ do
                  _td do
                    if person.asf_member?
                      _b do
                        _a person.public_name,
                       href: "../../roster/committer/#{person.id}"
                      end
                    else
                      _a person.public_name,
                        href: "../../roster/committer/#{person.id}"
                    end
                  end
                end
              end
            end
          end
        end
      end

    end
  end
end
