#
# Server side setup for whimsy/project
#

require 'whimsy/asf'
require 'whimsy/lockfile'

require 'wunderbar/sinatra'
require 'wunderbar/vue'
require 'wunderbar/bootstrap/theme'
require 'ruby2js/filter/functions'
require 'ruby2js/filter/require'
require 'json'
require 'mail'

ASF::Mail.configure

disable :logging # suppress log of requests to stderr/error.log

helpers do
  def projectsForUser(userName)
    user = ASF::Person.find(userName)
    committees = user.committees.map(&:name)
    project_owners = user.project_owners.map(&:name) # includes podlings and GUINEA_PIGS

    # allData is a hash where the key is the name of the PMC/PPMC and
    # the value is a hash of the data for the PMC/PPMC
    pmcData = ASF::Committee.pmcs. # get PMCs
      select {|pmc| committees.include?(pmc.name)}. # keep the ones relevant to the user
      sort_by{|p| p.name}.
      map{|p| [p.name, {pmc: true, display_name: p.display_name, mail_list: p.mail_list}]}.to_h  # convert to hash of data items
    ppmcData =   
      ASF::Podling.list.select {|podling| podling.status == 'current'}. # get the podlings
      select {|p| committees.include?('incubator') || project_owners.include?(p.name)}. # keep the ones relevant to the user
      sort_by{|p| p.name}.
      map{|p| [p.name, {pmc: false, display_name: p.display_name, mail_list: p.mail_list}]}.to_h # convert to hash of data items
    pmcData.merge(ppmcData)
  end
  def loadProgress(token)
    if token
      data = nil
      # read the file corresponding to the token
      # the file name is '/srv/<token>.json
      filename = '/srv/icla/' + token + '.json'
      begin
        LockFile.lockfile(filename) do |f| # shared read
          data = JSON.parse(File.read(f))
        end
      rescue SystemCallError => e
        {
          phase: 'error', errorMessage: e.message, errorCode: e.errno
        }
      rescue JSON::ParserError => e
        {
          phase: 'error', errorMessage: e.message, errorCode: 999
        }
      end
      data
    end
  end
  def getMember(userId)
    mockId = params['mock']
    if ASF::Person[mockId] != nil
      # if mock is set, set member to mock value
      return mockId
    else
     return userId
    end
  end
end

#
# Sinatra routes
#


get '/' do
  @token = params['token']
  @mock = params['mock']
  @extra = @mock ? "&mock=" + @mock : ''
  @progress = loadProgress(@token) if @token
  @phase = @progress['phase'] if @progress
  if @phase == 'discuss'
    redirect to("/discuss?token=" + @token + @extra)
  elsif @phase == 'vote'
    redirect to("/vote?token=" + @token + @extra)
  else
    redirect to("/invite")
  end
end

get '/invite' do
  @view = 'invite'


  # server data sent to client
  @user = env.user
  @member = getMember(@user)
  # get a complete list of PMC and PPMC names and mail lists
  @allData = projectsForUser(@member)

  @cssmtime = File.mtime('public/css/icla.css').to_i
  @appmtime = Wunderbar::Asset.convert("#{settings.views}/app.js.rb").mtime.to_i

  # render the HTML for the application
  _html :app
end

get '/discuss' do
  @view = 'discuss'

  # server data sent to client
  @debug = params['debug']
  @user = env.user
  @member = getMember(@user)
  @token = params['token']
  @progress = loadProgress(@token) if @token

  # not needed for this form but required for other forms
  @allData = {}

  @cssmtime = File.mtime('public/css/icla.css').to_i
  @appmtime = Wunderbar::Asset.convert("#{settings.views}/app.js.rb").mtime.to_i

  _html :app
end

get '/vote' do
  @view = 'vote'

# server data sent to client
  @debug = params['debug']
  @user = env.user
  @member = getMember(@user)
  @token = params['token']
  @progress = loadProgress(@token) if @token

  # not needed for this form but required for other forms
  @allData = {}

  @cssmtime = File.mtime('public/css/icla.css').to_i
  @appmtime = Wunderbar::Asset.convert("#{settings.views}/app.js.rb").mtime.to_i

  _html :app
end

get '/form' do
  @view = 'interview'
  _html :app
end

# posted actions
post '/actions/:file' do
  _json :"actions/#{params[:file]}"
end
