extends Node2D

# Списки путей к изображениям ассетов
var hilts = PackedStringArray()
var blades = PackedStringArray()
var points = PackedStringArray()
var name_1 = ["стальной", "варварский", "охотничий", "пуканорвущий", "зверский", "оркский", "сильный"]
var name_2 = ["убийственый", "острый", "скрытный"]

# Функция для загрузки всех файлов из заданной папки
func load_assets_from_dir(dir_path: String) -> PackedStringArray:
	var dir = DirAccess.open(dir_path)
	var paths = PackedStringArray()

	if dir:
		dir.list_dir_begin()
		var file_name = dir.get_next()
		while file_name:
			if file_name.ends_with(".png"):
				paths.push_back(dir_path + "/" + file_name)
			file_name = dir.get_next()
		dir.list_dir_end()
	
	return paths

# Функция загрузки случайного изображения из списка
func load_random_image(paths: PackedStringArray) -> Texture2D:
	var path = paths[randi() % paths.size()]
	return ResourceLoader.load(path) as Texture2D

# Функция получения позиции для частей меча
func get_part_position(part_name: String) -> Vector2:
	match part_name:
		"hilt":
			return Vector2(0, 0)
		"blade":
			return Vector2(0, -24)
		"point":
			return Vector2(0, -48)
		_:
			return Vector2(0, 0)

# Функция генерации меча
func generate_sword():
	# Создание новых спрайтов для каждой части меча
	var hilt_sprite = Sprite2D.new()
	var blade_sprite = Sprite2D.new()
	var point_sprite = Sprite2D.new()
	
	# Загрузка случайных изображений
	hilt_sprite.texture = load_random_image(hilts)
	blade_sprite.texture = load_random_image(blades)
	point_sprite.texture = load_random_image(points)
	
	# Создание нового узла меча
	var sword = RigidBody2D.new()

	# Задание позиций деталей
	hilt_sprite.position = get_part_position("hilt")
	blade_sprite.position = get_part_position("blade")
	point_sprite.position = get_part_position("point")

	# Добавление деталей к мечу
	sword.add_child(hilt_sprite)
	sword.add_child(blade_sprite)
	sword.add_child(point_sprite)

	# Добавление общей коллизии ко всему мечу
	add_collision_to_sword(sword, hilt_sprite, blade_sprite, point_sprite)
	
	# Добавление меча к сцене
	add_child(sword)
	
	# Генерация и добавление имени меча
	var sword_name = generate_sword_name()
	var name_label = Label.new()
	name_label.text = sword_name
	name_label.position = Vector2(0, -70) # Позиция над мечом (можно динамически вычислить)
	name_label.scale = Vector2(0.75, 0.75) 
	name_label.modulate = Color(1, 1, 1, 1) # Белый цвет для лучшей видимости
	name_label.set_autowrap(true) 
	name_label.set_custom_minimum_size(Vector2(150, 50)) 
	
	name_label.set_anchors_preset(Control.PRESET_TOP_CENTER, true) # Центрируем по верхней части меча с обновлением размеров
	sword.add_child(name_label)

# Функция генерации имени меча
func generate_sword_name() -> String:
	return name_1[randi() % name_1.size()] + " " + name_2[randi() % name_2.size()] + " меч"

# Функция добавления коллизии ко всему мечу
func add_collision_to_sword(sword: RigidBody2D, hilt_sprite: Sprite2D, blade_sprite: Sprite2D, point_sprite: Sprite2D):
	var collision_shape = CollisionShape2D.new()
	var shape = RectangleShape2D.new()
	
	var min_bound = Vector2(999999, 999999)
	var max_bound = Vector2(-999999, -999999)
	
	# Определение границ коллизии на основе позиций и размеров текстур
	var sprites = [hilt_sprite, blade_sprite, point_sprite]
	for sprite in sprites:
		var sprite_pos = sprite.position
		var sprite_size = sprite.texture.get_size() / 2
		min_bound.x = min(min_bound.x, sprite_pos.x - sprite_size.x)
		min_bound.y = min(min_bound.y, sprite_pos.y - sprite_size.y)
		max_bound.x = max(max_bound.x, sprite_pos.x + sprite_size.x)
		max_bound.y = max(max_bound.y, sprite_pos.y + sprite_size.y)
	
	shape.extents = (max_bound - min_bound) / 2
	collision_shape.shape = shape
	collision_shape.position = min_bound + shape.extents
	
	sword.add_child(collision_shape)

# Функция _ready вызывается при добавлении узла в сцену
func _ready():
	randomize() # Инициализация генератора случайных чисел
	
	# Загрузка ассетов из папок
	hilts = load_assets_from_dir("res://assets/hilts")
	blades = load_assets_from_dir("res://assets/blades")
	points = load_assets_from_dir("res://assets/points")
	
	generate_sword()

# Функция _physics_process обновляется на случай если вас требуется
func _physics_process(_delta: float):
	# Если у вас нет кода который использует delta, вы можете оставить это пустым
	pass