extends RefCounted
class_name VestMockHandler

## Manages mock instances

var _answers: Array[VestMockDefs.Answer] = []
var _calls: Array[VestMockDefs.Call] = []
var _unhandled_calls: Array[VestMockDefs.Call] = []

## Take over a mock instance, recording its calls and providing its answers
func take_over(what: Object):
	what.__vest_mock_handler = self

## Register an answer
func add_answer(answer: VestMockDefs.Answer):
	_answers.append(answer)

## Get all recorded mock calls
func get_calls() -> Array[VestMockDefs.Call]:
	return _calls

## Get all recorded mock calls to which there were no registered answers
func get_unhandled_calls() -> Array[VestMockDefs.Call]:
	return _unhandled_calls

func _handle(method: Callable, args: Array):
	var call_data := VestMockDefs.Call.new()
	call_data.method = method
	call_data.args = args

	var possible_answers = _answers\
		.filter(func(it): return it._is_answering(method, args))
	possible_answers.sort_custom(func(a, b): return a._get_specificity() > b._get_specificity())

	if possible_answers.is_empty():
		_unhandled_calls.append(call_data)
		return

	var answer := possible_answers.front() as VestMockDefs.Answer
	_calls.append(call_data)

	return answer._get_answer(args)
