## Describes a row in a timesheet
## Has a beginning and an end
class_name TimeEntry


var name := ""
var is_closed := false
var start_time := TimeStamp.new()
var end_time := TimeStamp.new()


func start_recording() -> TimeEntry:
	# warning-ignore:return_value_discarded
	start_time.from_current_time()
	# warning-ignore:return_value_discarded
	end_time.from_current_time()
	return self


func update() -> void:
	# warning-ignore:return_value_discarded
	end_time.from_current_time()


func close() -> void:
	update()
	is_closed = true


func get_elapsed_seconds() -> int:
	var elapsed := end_time.get_difference(start_time)
	return elapsed


func get_period() -> String:
	var time_in_secs := get_elapsed_seconds()
	return time_to_period(time_in_secs)


static func time_to_period(time_in_secs: int) -> String:
	# warning-ignore:integer_division
	var seconds := time_in_secs%60
	# warning-ignore:integer_division
	var minutes := (time_in_secs/60)%60
	# warning-ignore:integer_division
	var hours := (time_in_secs/60)/60
	return "%02d:%02d:%02d" % [hours, minutes, seconds]


func to_csv_line() -> PoolStringArray:
	return PoolStringArray([
		name,
		start_time,
		end_time,
		str(get_elapsed_seconds()) if is_closed else tr(Consts.ONGOING)
	])


static func is_csv_line_valid(line: PoolStringArray) -> bool:
	return line.size() > 3


func from_csv_line(line: PoolStringArray) -> TimeEntry:
	name = line[0]
	
	var start_time_string = line[1]
	# warning-ignore:return_value_discarded
	start_time.from_string(start_time_string)
	
	var elapsed_seconds = int(line[3]) if line[3].is_valid_integer() else 0
	is_closed = elapsed_seconds > 0
	
	if is_closed == true:
		var end_time_string = line[2]
		# warning-ignore:return_value_discarded
		end_time.from_string(end_time_string)
	else:
		# warning-ignore:return_value_discarded
		end_time.from_current_time()
	return self


func to_dict() -> Dictionary:
	return {
		start_time = start_time,
		closed = is_closed, 
	}


func _to_string() -> String:
	return "%s\t%s\t%s"%[name, tr(Consts.ONGOING) if is_closed == false else end_time.to_string(), start_time]
