class_name Inventory extends Control

const MIN_ARMOR_RATING: float = 0.0
const MAX_ARMOR_RATING: float = 80.0

@onready var level_label: Label = %LevelLabel
@onready var strength_label: Label = %StrengthScore
@onready var agility_label: Label = %AgilityScore
@onready var speed_label: Label = %SpeedScore
@onready var endurance_label: Label = %EnduranceScore
@onready var attack_damage_value: Label = %AttackDamageValue
@onready var armor_protection_value: Label = %ArmorProtectionValue
@onready var items_grid: GridContainer = %ItemsGrid
@onready var gold_label: Label = %GoldLabel
@onready var gold: int = 0:
	set(value):
		gold = value
		gold_label.text = "%dg" % gold
@onready var weapon_slot: CenterContainer = %WeaponSlot
@onready var shield_slot: CenterContainer = %ShieldSlot
@onready var armor_slot: CenterContainer = %ArmorSlot

@export var player: Player

func _ready() -> void:
	update_stats()

func update_stats() -> void:
	level_label.text = "Level %d" % player.stats.level
	strength_label.text = "%d" % player.stats.strength.score
	agility_label.text = "%d" % player.stats.agility.score
	speed_label.text = "%d" % player.stats.speed.score
	endurance_label.text = "%d" % player.stats.endurance.score

func update_gear_stats() -> void:
	attack_damage_value.text = "%d" % [player.stats.strength.get_modifier() + get_weapon_damage()]
	armor_protection_value.text = "%d%%" % get_armor_protection()

func get_weapon_damage() -> float:
	var damage: float = 0.0
	var weapon: WeaponIcon = get_weapon()
	if weapon:
		damage += weapon.power
	return damage

func get_armor_protection() -> float:
	var protection: float = 0.0
	var armor: ArmorIcon = get_armor()
	if armor:
		protection += armor.protection
	var shield: ShieldIcon = get_shield()
	if shield:
		protection += shield.protection
	protection = clampf(protection, MIN_ARMOR_RATING, MAX_ARMOR_RATING)
	return protection

func add_item(item: ItemIcon) -> void:
	disconnect_item_connections(item)

	if item is CurrencyIcon:
		gold += item.value
		item.queue_free()
	else:
		items_grid.add_child(item)
		item.interact.connect(equip_item)

func equip_item(item: ItemIcon) -> void:
	var item_slot: CenterContainer

	if item is WeaponIcon:
		item_slot = weapon_slot
	elif item is ArmorIcon:
		item_slot = armor_slot
	elif item is ShieldIcon:
		item_slot = shield_slot
	else:
		return

	for child in item_slot.get_children():
		child.get_parent().remove_child(child)
		add_item(child)

	item.get_parent().remove_child(item)
	item_slot.add_child(item)
	if item is WeaponIcon:
		player.rig.equip_weapon(item.item_model)
	# elif item is ArmorIcon:
		# player.rig.equip_weapon(item.item_model)
	elif item is ShieldIcon:
		player.rig.equip_offhand(item.item_model)
	else:
		return

	disconnect_item_connections(item)
	update_gear_stats()

func disconnect_item_connections(item: ItemIcon) -> void:
	for connection: Dictionary in item.interact.get_connections():
		item.interact.disconnect(connection.callable)

func get_weapon() -> WeaponIcon:
	if weapon_slot.get_child_count() != 1:
		return null
	return weapon_slot.get_child(0)

func get_armor() -> ArmorIcon:
	if armor_slot.get_child_count() != 1:
		return null
	return armor_slot.get_child(0)

func get_shield() -> ShieldIcon:
	if shield_slot.get_child_count() != 1:
		return null
	return shield_slot.get_child(0)
