extends Node2D

# Списки путей к изображениям ассетов
var hilts = PackedStringArray()
var blades = PackedStringArray()
var points = PackedStringArray()

# Списки частей названий для мечей
var adjectives = ["Безбашенный", "Огромный", "Лютый", "Смешной", "Отчаянный", "Дикий", "Свирепый", "Устрашающий"]
var materials = ["стальной", "железный", "магический", "кристаллический", "титанический"]
var types = ["меч", "клинок", "палаш", "катана"]
var uniques = ["Молнии", "Огня", "Льда", "Тьмы", "Света", "Бури", "Токсинов", "Ветра", "Земли"]

# Цвета для уникальных особенностей
var unique_colors = {
	"Молнии": Color(1, 1, 0), # Желтый
	"Огня": Color(1, 0, 0),   # Красный
	"Льда": Color(0, 0, 1),   # Синий
	"Тьмы": Color(0.2, 0, 0.2), # Темно-фиолетовый
	"Света": Color(1, 1, 1),  # Белый
	"Бури": Color(0.5, 0.5, 1), # Светло-синий
	"Токсинов": Color(0, 1, 0), # Зеленый
	"Ветра": Color(0.5, 1, 1), # Аква
	"Земли": Color(0.5, 0.25, 0) # Коричневый
}

# Функция для загрузки всех файлов из заданной папки
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)
	
	# Генерация и вывод названия меча
	generate_sword_name(sword)

	# Добавление меча к сцене
	add_child(sword)

# Функция генерации названия меча и добавления его в сцену
func generate_sword_name(sword: RigidBody2D):
	var adjective = adjectives[randi() % adjectives.size()]
	var material = materials[randi() % materials.size()]
	var type = types[randi() % types.size()]
	var unique = uniques[randi() % uniques.size()]
	var sword_name = adjective + " " + material + " " + type + " " + unique
	
	# Создание текстовой метки
	var name_label = Label.new()
	name_label.text = sword_name
	name_label.set_anchors_preset(Control.PRESET_TOP_CENTER)
	name_label.horizontal_alignment = Label.ALIGN_CENTER
	
	# Расположение текста над мечом
	name_label.position = Vector2(0, -100)

	# Установка цвета текста в зависимости от уникальной особенности
	if unique in unique_colors:
		name_label.add_color_override("font_color", unique_colors[unique])

	print(sword_name)  # Печать имени в консоль

	# Добавление метки к мечу
	sword.add_child(name_label)

# Функция добавления коллизии ко всему мечу
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