class_name M2BuildJob
extends RefCounted

## Holds one M2 build cursor, grouped transforms and a strong root reference.
## Releasing this record never frees the referenced Node.

var _tile_key: String
var _root: Node3D
var _groups: Dictionary
var _group_keys: Array
var _group_index: int = 0
var _transform_offset: int = 0
var _batch_serial: int = 0


func _init(tile_key: String, root: Node3D, groups: Dictionary) -> void:
	_tile_key = tile_key
	_root = root
	_groups = groups
	_group_keys = groups.keys()


## Returns the immutable tile identity used by the queue.
func tile_key() -> String:
	return _tile_key


## Returns the strongly referenced M2 scene root without transferring ownership.
func root() -> Node3D:
	return _root


## Returns the exact grouped-transform Dictionary supplied at enqueue time.
func groups() -> Dictionary:
	return _groups


## Returns the insertion-order group-key snapshot created at enqueue time.
func group_keys() -> Array:
	return _group_keys


## Returns the current model-path group cursor.
func group_index() -> int:
	return _group_index


## Returns the current transform offset within the selected model-path group.
func transform_offset() -> int:
	return _transform_offset


## Returns the next static/animated batch serial used for node naming.
func batch_serial() -> int:
	return _batch_serial


## Atomically adopts all progress values after one planned build operation.
func adopt_progress(
	next_group_index: int,
	next_transform_offset: int,
	next_batch_serial: int
) -> void:
	_group_index = next_group_index
	_transform_offset = next_transform_offset
	_batch_serial = next_batch_serial


## Returns detached scalar/count diagnostics without engine-object references.
func diagnostic_snapshot() -> Dictionary:
	return {
		"tile_key": _tile_key,
		"group_index": _group_index,
		"transform_offset": _transform_offset,
		"batch_serial": _batch_serial,
		"group_count": _group_keys.size(),
		"has_root": _root != null,
	}
