extends Panel
class_name ShopUI

@onready var score_button: ScoreButton = $Rows/UpperButtons/ScoreButton

## Emitted when the Score button is pressed.
signal score_button_pressed

## Emitted when the Delete button is pressed.
signal delete_button_pressed 

## Emitted when the Back button is presesd.
signal back_button_pressed

## Emitted when any purchase has started.
signal purchase_begin(what: PurchasableItem)

## Emitted when any purchase is cancelled.
signal purchase_cancel(what: PurchasableItem)

## Emitted when any purchase is completed.
##
## Emitted by complete_purchase().
signal purchase_success(what: PurchasableItem)

## Array of all PurchasableItems that this ShopUI should control.
@onready var purchasable_items: Array[Node] = find_children("*", "PurchasableItem")


func _ready():
	for item in purchasable_items:
		item.purchase_begin.connect(_on_any_purchase_begin.bind(item))
		item.purchase_cancel.connect(_on_any_purchase_cancel.bind(item))
		item.purchase_success.connect(_on_any_purchase_success.bind(item))

func _on_any_purchase_begin(what: Node):
	if not what is PurchasableItem:
		push_error("Purchase began outside a PurchasableItem")
		return
	purchase_begin.emit(what)
	for item in purchasable_items:
		if item == what:
			continue
		item.can_buy = false

func _on_any_purchase_cancel(what: Node):
	if not what is PurchasableItem:
		push_error("Purchase cancelled outside a PurchasableItem")
		return
	purchase_cancel.emit(what)
	for item in purchasable_items:
		if item == what:
			continue
		item.can_buy = true

func _on_any_purchase_success(what: Node):
	if not what is PurchasableItem:
		push_error("Purchase succeeded outside a PurchasableItem")
		return
	purchase_success.emit(what)
	for item in purchasable_items:
		if item == what:
			continue
		item.can_buy = true

func _on_game_score_changed(total: int):
	score_button.set_score(total)
		
func _on_score_button_pressed():
	score_button_pressed.emit()
	
func _on_delete_button_pressed():
	delete_button_pressed.emit()

func _on_back_button_pressed():
	back_button_pressed.emit()


@export var copper_coin_scene: PackedScene
@export var silver_coin_scene: PackedScene
@export var gold_coin_scene: PackedScene


signal upgraded_auto_spawn(scene: PackedScene, period: float)

func _on_buy_auto_copper_purchase_success():
	print("[ShopUI] Upgrading to Auto Copper * 2...")
	upgraded_auto_spawn.emit(copper_coin_scene, 0.5)
	$Rows/PaddedScrollable/Scrollable/ScrollableItems/ManualCategory/BuyHeliCopper.has_unlocked = true

func _on_buy_heli_copper_purchase_success():
	print("[ShopUI] Upgrading to Auto Copper * 8...")
	upgraded_auto_spawn.emit(copper_coin_scene, 0.125)
	$Rows/PaddedScrollable/Scrollable/ScrollableItems/ManualCategory/BuyAutoSilver.has_unlocked = true

func _on_buy_auto_silver_purchase_success():
	print("[ShopUI] Upgrading to Auto Silver * 2...")
	upgraded_auto_spawn.emit(silver_coin_scene, 0.5)
	$Rows/PaddedScrollable/Scrollable/ScrollableItems/ManualCategory/BuySuperSilver.has_unlocked = true

func _on_buy_super_silver_purchase_success():
	print("[ShopUI] Upgrading to Auto Silver * 8...")
	upgraded_auto_spawn.emit(silver_coin_scene, 0.125)
	$Rows/PaddedScrollable/Scrollable/ScrollableItems/ManualCategory/BuyAutoGold.has_unlocked = true

func _on_buy_auto_gold_purchase_success():
	print("[ShopUI] Upgrading to Auto Gold * 2...")
	upgraded_auto_spawn.emit(gold_coin_scene, 0.5)
	$Rows/PaddedScrollable/Scrollable/ScrollableItems/ManualCategory/BuyMidasTouch.has_unlocked = true

func _on_buy_midas_touch_purchase_success():
	print("[ShopUI] Upgrading to Auto Gold * 8...")
	upgraded_auto_spawn.emit(gold_coin_scene, 0.125)


signal upgraded_manual_spawn(scene: PackedScene)

func _on_buy_silver_star_purchase_success():
	print("[ShopUI] Upgrading to Manual Silver...")
	upgraded_manual_spawn.emit(silver_coin_scene)

func _on_buy_gold_star_purchase_success():
	print("[ShopUI] Upgrading to Manual Gold...")
	upgraded_manual_spawn.emit(gold_coin_scene)