class_name TickProcess
extends Node

# Dependency injection - can be overridden for simulation
var unlocks_provider: Node = null
var inventory_provider: Node = null

func _ready():
	# Default to singletons if not explicitly set
	if unlocks_provider == null:
		unlocks_provider = Unlocks
	if inventory_provider == null:
		inventory_provider = Inventory

func set_providers(unlocks, inventory):
	"""Set custom providers for simulation (bypasses singletons)"""
	unlocks_provider = unlocks
	inventory_provider = inventory

func tick():
	# Log.pr("Tick Process Ticking...")
	do_autowood()
	do_whittling()
	do_selling()

func do_autowood():
	# If the autowood unlock is unlocked then automatically gain wood based on the modifier 	
	var autowood_unlock = Unlocks.get_unlock_by_id(Global.autowood_unlock_id)
	if autowood_unlock and autowood_unlock.is_unlocked:
		# Log.pr("Autowood modifier", str(Unlocks.get_modifier_value("autowood_modifier")))
		var wood_to_gather = max(Unlocks.get_wood_per_click() * Unlocks.get_modifier_value("autowood_modifier"), 1)
		Inventory.add_wood(wood_to_gather)
		# Log.pr("Auto-gathered", str(wood_to_gather), "wood via autowood unlock.")

func do_whittling():
	# If there's more than 1 whole wood available, then whittle based on the efficiency modifier 
	if Inventory.get_wood() >= 1:
		whittle_max_wood_possible()

	## If multicraft is unlocked, whittle additional wood based on multicraft unlock
	var multicraft_unlock = Unlocks.get_unlock_by_id(Global.multicraft_unlock_id)
	if multicraft_unlock and multicraft_unlock.is_unlocked:
		var additional_whittles = multicraft_unlock.current_rank # Each rank allows one additional whittling action
		for i in range(additional_whittles):
			if Inventory.get_wood() >= 1:
				whittle_max_wood_possible()
			else:
				break

func do_selling():
	# If the wholesale unlock is purchased, sell blocks of 100 whittled wood if possible 
	var wholesale_unlock = Unlocks.get_unlock_by_id(Global.wholesale_unlock_id)
	if wholesale_unlock and wholesale_unlock.is_unlocked:
		while Inventory.get_stock() >= Global.wholesale_bundle_size:
			Inventory.spend_stock(Global.wholesale_bundle_size)
			var currency_earned = Global.wholesale_bundle_size * Unlocks.get_sale_price_per_item() * Global.wholesale_discount_multiplier
			Inventory.add_currency(currency_earned)
			# Log.pr("Sold 100 whittled wood for", str(currency_earned), "currency via wholesale unlock.")


	# If there's whittled wood available to sell, sell it for currency
	if Inventory.get_stock() > 0:
		var whittle_wood_to_sell = Inventory.get_stock()
		# Sell whatever people are willing to buy 
		var purchase_rate = Global.base_purchase_rate * Unlocks.get_modifier_value("purchase_rate_modifier")
		var max_stock_to_sell = floor(purchase_rate)
		
		# Sell up to the max stock to sell this tick, but no more than available stock
		# We should always sell at least one, up to the max 
		var actual_stock_to_sell = min(whittle_wood_to_sell, max(1, max_stock_to_sell))
		
		Inventory.spend_stock(actual_stock_to_sell)
		var currency_earned = actual_stock_to_sell * Unlocks.get_sale_price_per_item()
		Inventory.add_currency(currency_earned)

	
func whittle_max_wood_possible():
	# Get the items that can be produced per tick 
	var items_produced_per_tick = Unlocks.get_items_produced_per_tick()
	# Log.pr("Items produced per tick:", str(items_produced_per_tick))
	var wood_needed = ceil(items_produced_per_tick)

	# Whittle as much wood as possible this tick, up to the max allowed by efficiency
	var wood_to_whittle = min(Inventory.get_wood(), wood_needed)
	var actual_items_produced = wood_to_whittle

	Inventory.spend_wood(wood_to_whittle)
	Inventory.add_stock(actual_items_produced)
	# Log.pr("Whittled", str(wood_to_whittle), "wood into", str(actual_items_produced), "whittle wood.")
