using RidePooling
RP = RidePooling

using RidePooling_eval
ev = RidePooling_eval
using DataFrames
using Measurements

import Base.Filesystem
FS = Base.Filesystem


path = "/scratch01.local/rhaag/comparison/drive_and_wait/combined_delays/anywt035_anydt01/"
model_path = path * "/models/"

# Values I want to calculate for every model
req_quantitys_mean = [
	
	:relative_delay,
	:delay,
	:relative_waiting_time,
	:waiting_time,
	:served,
	:requested_distance,
	:requested_time,
	:total_time,
	:travelling_time,
    :resubmitted_served_percentage,
	:dt_earliest_served,
    :dt_earliest,
	:relative_dt_earliest
	:delay
]

req_quantitys_sum = [
	:count_req,
	:resubmitted_all,
	:resubmitted_served,
]

bus_quantitys = [
	:cooldown_time,
]

model_quantitys = [
	:driven_distance,
	:efficiency,
	:quality
]


########## This is just, because the Data Frame constructor still needs unintuitive workarounds 😠
rows = [:index => Int[],
	:dt_earliest_pickup => Float64[],
	:idle_weight => Float64[],
	:resubmission_time_factor => Float64[],
	:ν => Float64[],
	:t0 => Float64[],
	:request_type => Symbol[]
	]

for quan in req_quantitys_mean
	push!(rows, quan => Measurement[])
end

for quan in req_quantitys_sum
	push!(rows, quan => Float64[])
end

for quan in bus_quantitys
	push!(rows, quan => Measurement[])
end

for quan in model_quantitys
	push!(rows, quan => Measurement[])
end

rows = NamedTuple(rows)
results = DataFrame(rows)

###########################################################
filenames = readdir(model_path, join=false) # get Filenames

# Evalkuate Models
for model_nr in filenames
	model = loadmodel(model_path*model_nr)
	row = Dict()
	
	row[:index] = parse(Int, FS.splitext(model_nr)[1])
	print(model.request_type)
	row[:dt_earliest_pickup] =  (model.request_type != :now) ? model.random_gens[model.request_type][2] : 0
	println("\t\t$(row[:dt_earliest_pickup])")
	row[:idle_weight] = model.cost_idle_weight
	row[:ν] = model.ν
	row[:t0] = model.t0
	row[:request_type] = model.request_type
	row[:resubmission_time_factor] = model.resubmission_time_factor
	for quan in req_quantitys_mean
		row[quan] = ev.quantity(quan, model)
	end
	for quan in req_quantitys_sum
		row[quan] = ev.sum(quan, model)
	end
	for quan in bus_quantitys
		row[quan] = ev.quantity(quan, model.agents, model)
	end
	for quan in model_quantitys
		f = @eval (ev.$quan)
		row[quan] = f(model)
	end
	using Serialization
	push!(results, row)
end

using Serialization
serialize(path*"results.df", results)