extends Path3D

@export_group("Impostazioni Treno")
@export var velocita_treno: float = 6.0
@export var in_movimento: bool = true

@export_group("Costruzione Rotaie")
@export var distanza_traversine: float = 1.0 # Ogni quanti metri mettere un asse di legno

var nodo_treno: PathFollow3D

func _ready() -> void:
	# Controlla se hai disegnato il percorso
	if curve == null or curve.get_baked_length() == 0:
		print("ATTENZIONE: Devi prima disegnare i punti del Path3D!")
		return
		
	_costruisci_rotaie_da_zero()
	_costruisci_treno_da_zero()

func _costruisci_rotaie_da_zero() -> void:
	# 1. Creiamo i materiali (Colori) per le rotaie
	var mat_legno = StandardMaterial3D.new()
	mat_legno.albedo_color = Color(0.35, 0.2, 0.1) # Marrone scuro
	
	var mat_ferro = StandardMaterial3D.new()
	mat_ferro.albedo_color = Color(0.6, 0.6, 0.65) # Grigio metallico
	mat_ferro.metallic = 0.8
	
	# 2. Creiamo le forme geometriche base (Box)
	var mesh_traversina = BoxMesh.new()
	mesh_traversina.size = Vector3(1.8, 0.1, 0.3)
	
	var mesh_binario = BoxMesh.new()
	# La lunghezza del binario è uguale alla distanza tra le traversine per connettersi perfettamente
	mesh_binario.size = Vector3(0.1, 0.15, distanza_traversine + 0.05) 
	
	# 3. Calcoliamo quanti pezzi servono
	var lunghezza_totale = curve.get_baked_length()
	var numero_pezzi = int(lunghezza_totale / distanza_traversine)
	
	# 4. Piazziamo i pezzi lungo la curva
	for i in range(numero_pezzi):
		var distanza = i * distanza_traversine
		var transform_punto = curve.sample_baked_with_rotation(distanza, true, true)
		
		# Nodo "Pezzo" che fa da raggruppamento
		var pezzo_binario = Node3D.new()
		pezzo_binario.transform = transform_punto
		add_child(pezzo_binario)
		
		# Creiamo la traversina in legno
		var traversina = MeshInstance3D.new()
		traversina.mesh = mesh_traversina
		traversina.material_override = mat_legno
		pezzo_binario.add_child(traversina)
		
		# Creiamo il binario sinistro
		var binario_sx = MeshInstance3D.new()
		binario_sx.mesh = mesh_binario
		binario_sx.material_override = mat_ferro
		binario_sx.position = Vector3(-0.6, 0.1, 0) # Spostato a sinistra e leggermente in alto
		pezzo_binario.add_child(binario_sx)
		
		# Creiamo il binario destro
		var binario_dx = MeshInstance3D.new()
		binario_dx.mesh = mesh_binario
		binario_dx.material_override = mat_ferro
		binario_dx.position = Vector3(0.6, 0.1, 0) # Spostato a destra e leggermente in alto
		pezzo_binario.add_child(binario_dx)


func _costruisci_treno_da_zero() -> void:
	# 1. Creiamo il PathFollow che gestisce il movimento
	nodo_treno = PathFollow3D.new()
	nodo_treno.rotation_mode = PathFollow3D.ROTATION_Y # IMPORTANTE: Evita che il treno si inclini di lato
	nodo_treno.cubic_interp = false # Rende la velocità costante ed elimina i tremolii
	nodo_treno.loop = true
	add_child(nodo_treno)
	
	# 2. Materiali del treno
	var mat_carrozzeria = StandardMaterial3D.new()
	mat_carrozzeria.albedo_color = Color(0.8, 0.15, 0.15) # Rosso acceso
	
	var mat_vetro = StandardMaterial3D.new()
	mat_vetro.albedo_color = Color(0.2, 0.8, 1.0) # Azzurro
	
	# 3. Costruiamo la Base del treno
	var base_treno = MeshInstance3D.new()
	var mesh_base = BoxMesh.new()
	mesh_base.size = Vector3(1.4, 0.8, 3.0)
	base_treno.mesh = mesh_base
	base_treno.material_override = mat_carrozzeria
	base_treno.position = Vector3(0, 0.6, 0) # Alzato per stare sopra le rotaie
	nodo_treno.add_child(base_treno)
	
	# 4. Costruiamo la Cabina del macchinista
	var cabina = MeshInstance3D.new()
	var mesh_cabina = BoxMesh.new()
	mesh_cabina.size = Vector3(1.4, 1.0, 1.2)
	cabina.mesh = mesh_cabina
	cabina.material_override = mat_vetro
	cabina.position = Vector3(0, 1.5, -0.8) # Messa dietro e in alto
	nodo_treno.add_child(cabina)
	
	# 5. Costruiamo la Ciminiera (davanti)
	var ciminiera = MeshInstance3D.new()
	var mesh_ciminiera = CylinderMesh.new()
	mesh_ciminiera.top_radius = 0.2
	mesh_ciminiera.bottom_radius = 0.3
	mesh_ciminiera.height = 0.8
	ciminiera.mesh = mesh_ciminiera
	ciminiera.material_override = mat_carrozzeria
	ciminiera.position = Vector3(0, 1.2, 1.0)
	nodo_treno.add_child(ciminiera)


func _process(delta: float) -> void:
	# Se in movimento, fa avanzare automaticamente il nodo_treno lungo la curva
	if in_movimento and nodo_treno:
		nodo_treno.progress += velocita_treno * delta
