#!/usr/bin/ruby

if ARGV.empty?
	puts "Usage: ./split.rb file.csv [parts [part_length]]"
	exit
end

in_file = ARGV[0]
parts = (ARGV[1] || 8).to_i
part_length = (ARGV[2] || 3).to_i

raise "Part length (#{part_length}) must be at most number of parts (#{parts})" unless part_length <= parts
raise "File #{in_file} does not exist" unless File.exists? in_file

h = File.open(in_file, 'r')
column_names = h.readline.strip.split(',')
evt_columns = [*1..8].map { |i| column_names.index("event#{i}") }

first_event_pos = nil
first_event_row = nil
last_event_pos = nil
last_event_row = nil
row_count = 0

puts evt_columns.inspect

while not h.eof?
	r = h.readline.strip.split(',')
	row_count += 1
#	puts (evt_columns.map { |ec| r[ec] }).inspect
	if (evt_columns.any? { |ec| r[ec].to_i != 0 })
		if first_event_pos.nil?
			first_event_pos = h.pos
			first_event_row = row_count
		end
		last_event_pos = h.pos
		last_event_row = row_count
	end
end

puts "rc: #{row_count}"
puts "#{last_event_row}"

h.seek first_event_pos
rows = last_event_row - first_event_row
#parts, part_length
row_count = 0
last_part = -1
file_prefix = (in_file.split('.')[0...-1]).join('.')
handles = []

while (not h.eof?) && row_count < rows
	part = parts * row_count / rows
	if last_part < part
		if part + part_length <= parts
			new_h = File.open("#{file_prefix}_#{part + 1}-#{part + part_length}_of_#{parts}.csv", 'w')
			new_h.write "#{column_names.join(',')}\n"
			handles << new_h
		end
		if part >= part_length
			handles.delete_at 0
		end
		last_part = part
	end
	
	r = h.readline
	handles.each { |oh|
		oh.write r
	}

	row_count += 1
end
