extends Node2D

var hovered = false
var dragged = false
var drag_offset

export var id = "" setget set_id
export var command = "" setget set_command
export var description = "" setget set_description
export var energy = 0 setget set_energy

var _first_argument = null
var _home_position = null
var _home_rotation = null

onready var energy_label = $Sprite/Energy

func _ready():
	set_process_unhandled_input(true)
	set_energy(energy)
	
func _process(delta):
	if game.energy >= energy:
		energy_label.modulate = Color(0.5, 1, 0.5)
	else:
		energy_label.modulate = Color(1, 1, 1)
		modulate = Color(1, 0.5, 0.5)
	
	if dragged:
		var mousepos = get_viewport().get_mouse_position()
		global_position = mousepos - drag_offset
	
	var target_scale = 1
	
	if hovered and not dragged:
		target_scale = 1.5
	
	scale = lerp(scale, Vector2(target_scale, target_scale), 10*delta)

func _unhandled_input(event):
	if event is InputEventMouseButton:
		if event.button_index == BUTTON_LEFT and event.pressed and hovered:
			dragged = true
			game.dragged_object = self
			_turn_on_highlights()
			$PickupSound.play()
			drag_offset = get_viewport().get_mouse_position() - global_position
			get_tree().set_input_as_handled()
			modulate.a = 0.5
		elif event.button_index == BUTTON_LEFT and !event.pressed and dragged:
			dragged = false
			game.dragged_object = null
			_turn_off_highlights()
			modulate.a = 1
			
			if "[string]" in command:
				var dialog = preload("res://scenes/input_dialog.tscn").instance()
				add_child(dialog)
				dialog.popup_centered()
				dialog.connect("entered", self, "entered_string")
				dialog.connect("popup_hide", self, "move_back")
				hide()
			elif "[" in command:
				move_back()
			else:
				try_play(command)
				
func _turn_on_highlights():
	var arg_regex = RegEx.new()
	arg_regex.compile("\\[(.*)\\]")
	var m = arg_regex.search(command)
	if m:
		var types = Array(m.get_string(1).split(","))
		for type in types:
			for area in get_tree().get_nodes_in_group("drop_areas"):
				area.highlight(type.strip_edges())
		
func _turn_off_highlights():
	for area in get_tree().get_nodes_in_group("drop_areas"):
		area.highlighted = false
				
func _mouse_entered():
	hovered = true
	z_index = 1

func _mouse_exited():
	hovered = false
	z_index = 0
	
func set_command(new_command):
	command = new_command
	var commands = new_command.split("[", true, 1)
	var args = ''
	if commands.size() > 1:
		args = commands[1].replace("]", "")
		args = args.replace(", ", "/")
		args = args.replace("ref", " [img=20]images/ref.svg[/img] ")
		args = args.replace("commit", " [img=20]images/commit.svg[/img] ")
		args = args.replace("string", " [img=20]images/string.svg[/img] ")
		args = args.replace("head", " [img=20]images/head.svg[/img] ")
		args = args.replace("file", " [img=20]images/file.svg[/img] ")
		args = args.replace("remote", " [img=20]images/remote.svg[/img] ")
	$Label.bbcode_text = commands[0] + args
	#$Label.text = command

func set_description(new_description):
	description = new_description
	$Description.text = description
	
func set_energy(new_energy):
	energy = new_energy
	if energy_label:
		energy_label.text = str(energy)

func set_id(new_id):
	id = new_id
	var art_path = "res://cards/%s.svg" % new_id
	var file = File.new()
	#if file.file_exists(art_path):
	var texture = load(art_path)
	if texture:
		$Image.texture = texture
	$Panel/Glow.visible = not id in game.state["played_cards"]
	
func move_back():
	position = _home_position
	rotation_degrees = _home_rotation
	$ReturnSound.play()
	show()

func dropped_on(other):
	if "[" in command:
		var argument
		if other.type == "file" or other.type == "remote":
			argument = other.label
		else:
			argument = other.id
			
		if (command.begins_with("git checkout") or command.begins_with("git rebase") or command.begins_with("git branch -D")) and argument.begins_with("refs/heads"):
			argument = Array(argument.split("/")).pop_back()
			
		var arg_regex = RegEx.new()
		arg_regex.compile("\\[(.*)\\]")
		var full_command = arg_regex.sub(command, argument)
		try_play(full_command)

func try_play(full_command):
	if game.energy >= energy:
		var terminal = $"../../../..".terminal
		terminal.send_command(full_command)
		#yield(terminal, "command_done")
		game.used_cards = true
		$PlaySound.play()
		var particles = preload("res://scenes/card_particles.tscn").instance()
		particles.position = position
		get_parent().add_child(particles)
		move_back()
		game.energy -= energy
		if not id in game.state["played_cards"]:
			game.state["played_cards"].push_back(id)
			game.save_state()
			$Panel/Glow.hide()
	else:
		move_back()

func entered_string(string):
	try_play(command.replace("[string]", "'"+string+"'"))