extends PanelContainer
class_name UnitFrame
## Character portrait/unit frame displayed in top-left corner

# References
@onready var character_name: Label = $MarginContainer/VBoxContainer/NameLabel
@onready var health_bar_bg: ColorRect = $MarginContainer/VBoxContainer/HealthBarContainer/Background
@onready var health_bar_fill: ColorRect = $MarginContainer/VBoxContainer/HealthBarContainer/Background/Fill
@onready var health_text: Label = $MarginContainer/VBoxContainer/HealthBarContainer/HealthText
@onready var level_label: Label = $MarginContainer/VBoxContainer/HBoxContainer/LevelLabel

# Player reference
var player: Character = null

# Smoothing
var target_health_width: float = 0.0
var current_health_width: float = 0.0
const HEALTH_LERP_SPEED: float = 10.0

# Colors
const COLOR_HEALTH_HIGH = Color(0.0, 0.8, 0.0, 1.0)    # Green (>60%)
const COLOR_HEALTH_MID = Color(1.0, 0.8, 0.0, 1.0)     # Yellow (30-60%)
const COLOR_HEALTH_LOW = Color(0.8, 0.0, 0.0, 1.0)     # Red (<30%)

func _ready():
	# Initialize
	if health_bar_fill:
		current_health_width = health_bar_fill.size.x
		target_health_width = health_bar_fill.size.x

	print("[UnitFrame] Unit frame initialized")

func _process(delta):
	# Smooth health bar animation
	if health_bar_fill and abs(current_health_width - target_health_width) > 0.1:
		current_health_width = lerp(current_health_width, target_health_width, HEALTH_LERP_SPEED * delta)
		health_bar_fill.size.x = current_health_width

## Set player reference and display info
func set_player(p: Character):
	player = p
	if not player:
		return

	# Get player name from Network
	var player_id = player.name.to_int()  # Player nodes are named with their peer_id
	if Network.players.has(player_id):
		var player_data = Network.players[player_id]
		if character_name:
			character_name.text = player_data["nick"]
	else:
		if character_name:
			character_name.text = "Player"

	# Set level (hardcoded for now)
	if level_label:
		level_label.text = "Lv 1"

	# Update health
	update_health(player.current_health, player.max_health)

## Update health bar
func update_health(current: float, maximum: float):
	if not health_bar_fill or not health_bar_bg or not health_text:
		return

	var health_percent = current / maximum if maximum > 0 else 0.0
	health_percent = clamp(health_percent, 0.0, 1.0)

	# Update fill width
	var max_width = health_bar_bg.size.x
	target_health_width = max_width * health_percent

	# Update color based on health percentage
	if health_percent > 0.6:
		health_bar_fill.color = COLOR_HEALTH_HIGH
	elif health_percent > 0.3:
		health_bar_fill.color = COLOR_HEALTH_MID
	else:
		health_bar_fill.color = COLOR_HEALTH_LOW

	# Update text
	health_text.text = "%d / %d" % [int(current), int(maximum)]
