extends Area2D

signal update_display # tells parent to update points display
signal refund # will tell parent a refund is occuring, for display
signal shooting_speed_upgrade # signals that a shooting speed upgrade has occured
signal ship_speed_upgrade 
signal shooting_speed_fully_upgraded
signal ship_speed_fully_upgraded

export (PackedScene) var Laser

#Default ship strengths and costs
const BULLET_DELAY_TIER1 = 0.8
const BULLET_DELAY_TIER2 = 0.5
const BULLET_DELAY_TIER3 = 0.2
const BULLET_DELAY_TIER4 = 0.1
const BULLET_DELAY_TIER5 = 0.05
const SHOOTING_SPEED_UPGRADE_DEFAULT = 1500
const BULLET_DELAY_MINIMUM = 0.01
const BULLET_DELAY_TIER2_COST = 100
const BULLET_DELAY_TIER3_COST = 200
const BULLET_DELAY_TIER4_COST = 400
const BULLET_DELAY_TIER5_COST = 1000

const SHIP_SPEED_TIER1 = 150
const SHIP_SPEED_TIER2 = 200
const SHIP_SPEED_TIER3 = 300
const SHIP_SPEED_TIER4 = 500
const SHIP_SPEED_TIER5 = 800
const SHIP_SPEED_UPGRADE_DEFAULT = 1500
const SHIP_SPEED_MAXIMUM = 1200
const SHIP_SPEED_TIER2_COST = 200
const SHIP_SPEED_TIER3_COST = 400
const SHIP_SPEED_TIER4_COST = 600
const SHIP_SPEED_TIER5_COST = 800

var screensize

var ship_speed = SHIP_SPEED_TIER1

var bullet_delay = BULLET_DELAY_TIER1
var bullet_delay_tier = 1
var laser_penetration = 0
var double_laser = false

var ship_value = 0
var refund_percentage = 1
var money = 100

var shooting_speed_upgrade = SHOOTING_SPEED_UPGRADE_DEFAULT
var ship_speed_upgrade = SHIP_SPEED_UPGRADE_DEFAULT

func upgradeMenu():
	var upgmenu = preload("res://UpgradeMenu.tscn").instance()
	add_child(upgmenu)
	upgmenu.connect("refund", self, "_refund_button")
	upgmenu.connect("bullet_delay_upgrade", self, "upgradeBulletDelay_button")
	get_tree().paused = true

func upgradeBulletDelay_button():
	upgradeBulletDelay()
	emit_signal("update_display")
	get_tree().paused = true

func upgradeBulletDelay():
	if (bullet_delay == BULLET_DELAY_TIER1 && money >= BULLET_DELAY_TIER2_COST):
		bullet_delay = BULLET_DELAY_TIER2
		money -= BULLET_DELAY_TIER2_COST
		ship_value += BULLET_DELAY_TIER2_COST
	elif (bullet_delay == BULLET_DELAY_TIER2 && money >= BULLET_DELAY_TIER3_COST):
		bullet_delay = BULLET_DELAY_TIER3
		money -= BULLET_DELAY_TIER3_COST
		ship_value += BULLET_DELAY_TIER3_COST
	elif (bullet_delay == BULLET_DELAY_TIER3 && money >= BULLET_DELAY_TIER4_COST):
		bullet_delay = BULLET_DELAY_TIER4
		money -= BULLET_DELAY_TIER4_COST
		ship_value += BULLET_DELAY_TIER4_COST
	elif (bullet_delay == BULLET_DELAY_TIER4 && money >= BULLET_DELAY_TIER5_COST):
		bullet_delay = BULLET_DELAY_TIER5
		money -= BULLET_DELAY_TIER5_COST
		ship_value += BULLET_DELAY_TIER5_COST
	elif (bullet_delay <= BULLET_DELAY_MINIMUM):
		emit_signal("bullet_delay_fully_upgraded")
	elif (bullet_delay <= BULLET_DELAY_TIER5 && money >= shooting_speed_upgrade):
		bullet_delay = bullet_delay*0.95
		money -= shooting_speed_upgrade
		ship_value += shooting_speed_upgrade
		shooting_speed_upgrade *= 1.1
	timer.set_wait_time(bullet_delay)
	prints(bullet_delay)

func upgradeShipSpeed():
	if (ship_speed == SHIP_SPEED_TIER1 && money >= SHIP_SPEED_TIER2_COST):
		ship_speed = SHIP_SPEED_TIER2
		money -= SHIP_SPEED_TIER2_COST
		ship_value += SHIP_SPEED_TIER2_COST
	elif (ship_speed == SHIP_SPEED_TIER2 && money >= SHIP_SPEED_TIER3_COST):
		ship_speed = SHIP_SPEED_TIER3
		money -= SHIP_SPEED_TIER3_COST
		ship_value += SHIP_SPEED_TIER3_COST
	elif (ship_speed == SHIP_SPEED_TIER3 && money >= SHIP_SPEED_TIER4_COST):
		ship_speed = SHIP_SPEED_TIER4
		money -= SHIP_SPEED_TIER4_COST
		ship_value += SHIP_SPEED_TIER4_COST
	elif (ship_speed == SHIP_SPEED_TIER4 && money >= SHIP_SPEED_TIER5_COST):
		ship_speed = SHIP_SPEED_TIER5
		money -= SHIP_SPEED_TIER5_COST
		ship_value += SHIP_SPEED_TIER5_COST
	elif (ship_speed >= SHIP_SPEED_MAXIMUM):
		emit_signal("ship_speed_fully_upgraded")
	elif (ship_speed >= SHIP_SPEED_TIER5 && money >= ship_speed_upgrade):
		ship_speed = ship_speed*1.05
		money -= ship_speed_upgrade
		ship_value += ship_speed_upgrade
		ship_speed_upgrade *= 1.1
	prints(ship_speed)

func _ready():
	timer = Timer.new()
	timer.set_one_shot(true)
	timer.set_wait_time(bullet_delay)
	timer.connect("timeout", self, "on_timeout_complete")
	add_child(timer)
	
	position.x = 100
	position.y = 250
	
	screensize = get_viewport_rect().size
	$AnimatedSprite.play()

func _refund_button():
	bullet_delay = BULLET_DELAY_TIER1
	timer.set_wait_time(bullet_delay)
	ship_speed = SHIP_SPEED_TIER1
	shooting_speed_upgrade = SHOOTING_SPEED_UPGRADE_DEFAULT
	money += ship_value*refund_percentage
	prints("Refunded ", ship_value*refund_percentage)
	ship_value = 0
	emit_signal("update_display")
	get_tree().paused = true

var timer = null

var can_shoot = true 
var going_up = false
var going_down = false
var shoot_down = false

func on_timeout_complete():
	can_shoot = true

#func _unhandled_input(event):
#	if (event is InputEventScreenTouch):
#		gravity_point = true
#		gravity_vec = Vector2(0.5, 0.5)

func _process(delta):
	var velocity = Vector2() # the player's movement vector
	if (Input.is_action_pressed("ui_right")):
		velocity.x += 1
	if (Input.is_action_pressed("ui_left")):
		velocity.x -= 1
	if (Input.is_action_pressed("ui_down") || going_down == true):
		velocity.y += 1
	if (Input.is_action_pressed("ui_up") || going_up == true):
		velocity.y -= 1
	if (velocity.length() > 0):
		velocity = velocity.normalized() * ship_speed
	
	position += velocity * delta
	position.x = clamp(position.x, 0, screensize.x)
	position.y = clamp(position.y, 0, screensize.y)
	
	if ((Input.is_action_pressed("ui_accept") || shoot_down == true) && can_shoot == true):
		shoot()
	if (Input.is_action_pressed("ui_select") && can_shoot == true):
		upgradeBulletDelay()
	if (Input.is_action_pressed("ui_reset") && can_shoot == true):
		#upgradeShipSpeed()
		upgradeMenu()

func _on_Player_body_entered(body):
	prints("hit")

func upPressed():
	going_up = true
func upDepressed():
	going_up = false

func downPressed():
	going_down = true
func downDepressed():
	going_down = false

func shootDown():
	shoot_down = true
func shootUp():
	shoot_down = false

func shoot():
	var laser = Laser.instance()
	get_node("../").add_child(laser)
	laser.current_pen = laser_penetration
	laser.position.y = position.y - 27
	laser.position.x = position.x + 46
	
	#MAYBE THE LASERS SHOULD BE THEIR OWN NODES
	#Would allow for more simple additions in the future
	if double_laser == true:
		var laser2 = Laser.instance()
		get_node("../").add_child(laser2)
		laser2.position.y = position.y + 28
		laser2.position.x = position.x + 46
		laser2.current_pen = laser_penetration
	
	can_shoot = false
	timer.start()