#!/usr/bin/ruby 

require "sinatra"
require "slim"

load "db_parse.rb"

DEFAULT_AVATAR = "https://robohash.org/innonaut.png?size=50x50&set=set1"

enable :sessions

db_cache = get_db() # get all the parsed data

user_creds = {}
user_avatars = Hash.new(DEFAULT_AVATAR)

get "/" do
	session[:msg] = nil
	slim(:person, locals: {persondata: db_cache})
end

get "/loginpage" do
	slim(:login)
end

get "/registerpage" do
	slim(:register)
end

post "/register" do
	userstring = params[:username].chomp.gsub(" ", "")
	if( userstring.length < 3 ) then
		session[:msg] = "Invalid username. Minimum chars=3"
		redirect "/registerpage"
	end

	username = userstring.to_sym
	if( user_creds[username] == nil ) then
		if( params[:password] == params[:password2] ) then
			user_creds[username] = params[:password]
			# user_avatars[username] = DEFAULT_AVATAR
			session[:msg] = "Account created."
			redirect "/loginpage"
		else
			session[:msg] = "Password does not match, please rewrite password."
			redirect "/registerpage"
		end
	else
		session[:msg] = "Username in use. Please pick another."
		redirect "/registerpage"
	end

end

post "/login" do
	username = params[:username]
	password = params[:password]

	if( user_creds[username.to_sym] == password ) then
		session[:username] = username
		session[:avatar] = user_avatars[username]
		session[:msg] = "Login success."
		redirect "/"
	else
		session[:msg] = "Login failed."
		redirect "/loginpage"
	end
end

get "/profile" do
	session[:msg] = nil
	if(session[:username] != nil) then
		slim(:profile)
	else
		session[:msg] = "Please login to view your profile."
		redirect "/login"
	end
end

post "/updateavatar" do
	if( session[:username] != nil ) then
		if(params[:avatar_url] != "" && params[:avatar_url] != nil) then
			user_avatars[session[:username].to_s] = params[:avatar_url]	
			session[:avatar] = params[:avatar_url]
			redirect "/profile"
		end
	else
		session[:msg] = "You need to login to update your avatar."
		redirect "/"
	end
end

post "/logout" do
	session[:username] = nil
	redirect "/"
end

get "/calc" do
	slim(:calc)
end

post "/calculate" do
	result = 0
	num1 = params[:number1].to_f
	num2 = params[:number2].to_f
	op = params[:op]

	begin
		case op
		when "+"
			result = num1 + num2
		when "-"
			result = num1 - num2
		when "*"
			result = num1 * num2
		when "/"
			result = num1 / num2
		end

	rescue ZeroDivisionError
		result = "inf"	
	end
	
	session[:calc_result] = result
	session[:history] = session[:history] || []
	session[:history] << {
		number1: num1,
		number2: num2,
		op: op,
		result: result
	}
	redirect "/calc"
end