class_name EconomicEventRecord
extends RefCounted

const SCHEMA_VERSION := 1

var data: Dictionary


func _init(record_data: Dictionary = {}) -> void:
	data = record_data.duplicate(true)


static func create(
	event_id: int,
	event_type: StringName,
	tick: int,
	actor_id: int,
	source_id: StringName,
	destination_id: StringName,
	item_id: StringName,
	amount: float
) -> EconomicEventRecord:
	return EconomicEventRecord.new(
		{
			"schema_version": SCHEMA_VERSION,
			"event_id": event_id,
			"event_type": String(event_type),
			"tick": tick,
			"actor_id": actor_id,
			"source_id": String(source_id),
			"destination_id": String(destination_id),
			"item_id": String(item_id),
			"amount": amount
		}
	)


static func from_dictionary(record_data: Dictionary) -> EconomicEventRecord:
	if int(record_data.get("schema_version", -1)) != SCHEMA_VERSION:
		return null
	if not record_data.has_all(
		[
			"event_id",
			"event_type",
			"tick",
			"actor_id",
			"source_id",
			"destination_id",
			"item_id",
			"amount"
		]
	):
		return null
	var normalized := record_data.duplicate(true)
	normalized["schema_version"] = SCHEMA_VERSION
	normalized["event_id"] = int(record_data["event_id"])
	normalized["event_type"] = String(record_data["event_type"])
	normalized["tick"] = int(record_data["tick"])
	normalized["actor_id"] = int(record_data["actor_id"])
	normalized["source_id"] = String(record_data["source_id"])
	normalized["destination_id"] = String(record_data["destination_id"])
	normalized["item_id"] = String(record_data["item_id"])
	normalized["amount"] = float(record_data["amount"])
	if (
		normalized["event_id"] < 0
		or normalized["tick"] < 0
		or normalized["event_type"].is_empty()
		or normalized["source_id"].is_empty()
		or normalized["destination_id"].is_empty()
		or normalized["item_id"].is_empty()
		or normalized["amount"] <= 0.0
	):
		return null
	return EconomicEventRecord.new(normalized)


func to_dictionary() -> Dictionary:
	return data.duplicate(true)
