# frozen_string_literal: true require "csv" module EuchreCamp module Actions module Admin module Matches class ProcessUpload < EuchreCamp::Action include Deps[repo: 'repositories.matches'] def handle(request, response) # In Hanami, file uploads are in request.params file = request.params[:csv_file] unless file && file[:tempfile] response.redirect_to("/admin/matches/upload") return end matches_created = 0 errors = [] # Parse CSV CSV.foreach(file[:tempfile].path, headers: true, header_converters: :symbol) do |row| begin # Map CSV columns to our database structure # Expected columns: played_at, team_1_p1_name, team_1_p2_name, team_1_score, team_2_p1_name, team_2_p2_name, team_2_score # Find or create players by name player_1 = find_or_create_player(row[:team_1_p1_name]) player_2 = find_or_create_player(row[:team_1_p2_name]) player_3 = find_or_create_player(row[:team_2_p1_name]) player_4 = find_or_create_player(row[:team_2_p2_name]) played_at = begin Time.parse(row[:played_at]) rescue Time.now end match_data = { played_at: played_at, team_1_p1_id: player_1[:id], team_1_p2_id: player_2[:id], team_1_score: row[:team_1_score].to_i, team_2_p1_id: player_3[:id], team_2_p2_id: player_4[:id], team_2_score: row[:team_2_score].to_i, status: 'completed' } match = repo.create(match_data) EuchreCamp::Jobs::CalculateEloJob.perform_later(match[:id]) matches_created += 1 rescue => e errors << "Row #{row}: #{e.message}" end end response.flash[:message] = "Created #{matches_created} matches.#{' Errors: ' + errors.join(', ') if errors.any?}" response.redirect_to("/admin/matches") end private def find_or_create_player(name) rom = EuchreCamp::App["persistence.rom"] return nil unless name name = name.strip player = rom.relations[:players].where(name: name).one if player player else rom.relations[:players].insert(name: name, rating: 0, current_elo: 1000) rom.relations[:players].where(name: name).one end end end end end end end