extends Spatial

var dir = Vector3()
const GRAVITY = -24.8
var vel = Vector3()
const MAX_SPEED = 20
const ACCEL= 4.5
const FLY_SPEED = 7

const DEACCEL= 16
const MAX_SLOPE_ANGLE = 40

var camera_rotation
var camera
var flashlight

var MOUSE_SENSITIVITY = 0.05


func _ready():
    camera_rotation = $Character/Camera_rotation_helper
    camera = $Character/Camera_rotation_helper/Camera
    camera.make_current()
    flashlight = $Character/MeshInstance/Flashlight
    
func _process(delta):
    process_input(delta)
    process_movement(delta)


func process_input(delta):
    if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
        # ----------------------------------
        # Walking
        dir = Vector3()
        var cam_xform = camera.get_global_transform()
    
        var input_movement_vector = Vector3()
        var cam_scroll = 0.0
    
        if Input.is_action_pressed("move_up"):
            input_movement_vector.z += 1
        if Input.is_action_pressed("move_down"):
            input_movement_vector.z -= 1
        if Input.is_action_pressed("move_left"):
            input_movement_vector.x -= 1
        if Input.is_action_pressed("move_right"):
            input_movement_vector.x += 1
    
        input_movement_vector = input_movement_vector.normalized()
    
        dir += -cam_xform.basis.z.normalized() * input_movement_vector.z
        dir += cam_xform.basis.x.normalized() * input_movement_vector.x
        
        if Input.is_action_pressed("fly_up"):
            vel.y = FLY_SPEED
        elif Input.is_action_pressed("fly_down"):
            vel.y = -FLY_SPEED
        else:
            vel.y = 0


    
func process_movement(delta):
    
    if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
        dir.y = 0
        dir = dir.normalized()
    
    #    vel.y += delta*GRAVITY
    
        var hvel = vel
        hvel.y = 0
    
        var target = dir
        target *= MAX_SPEED
    
        var accel
        if dir.dot(hvel) > 0:
            accel = ACCEL
        else:
            accel = DEACCEL
    
        hvel = hvel.linear_interpolate(target, accel*delta)
        vel.x = hvel.x
        vel.z = hvel.z

        var collision_info = $Character.move_and_collide(vel * delta)
        if collision_info:
            vel = vel.bounce(collision_info.normal)
            var obj = collision_info.collider
            if obj.is_class( "RigidBody" ):
                obj.sleeping = false
                obj.apply_impulse( collision_info.position, -collision_info.normal*delta   )
                if not obj.get_node( "MeshInstance" ).get_surface_material(0).get("albedo_color") == null:
                    obj.get_node( "MeshInstance" ).get_surface_material(0).albedo_color = Color( 1, 0, 1, 1 )
                    $Character.get_node( "../../GUI/HUD/Jauges/douleur/ProgressBar" ).value += 0.25
                    if  $Character.get_node( "../../GUI/HUD/Jauges/douleur/ProgressBar" ).value >= 100:
                         $Character.get_node( "../../GUI/HUD/Jauges/trauma/ProgressBar" ).value += 0.25
                    if  $Character.get_node( "../../GUI/HUD/Jauges/trauma/ProgressBar" ).value >= 100:
                         $Character.get_node( "../../GUI/HUD/Jauges/oubli/ProgressBar" ).value += 0.25
            
            

func _input(event):
    if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
        if event is InputEventMouseMotion :
            camera_rotation.rotate_x(deg2rad(event.relative.y * MOUSE_SENSITIVITY * -1))
            $Character.rotate_y(deg2rad(event.relative.x * MOUSE_SENSITIVITY * -1))

            var camera_rot = camera_rotation.rotation_degrees
            camera_rot.x = clamp(camera_rot.x, -30, 30)
            camera_rotation.rotation_degrees = camera_rot


        if event is InputEventMouseButton:

            # to prevent the cam sliding effect when clamp limit reached.
            var old_x_translation = camera.translation.x
            var old_y_translation = camera.translation.y

            var cam_scroll = Vector3( 0.0, 0.0, 0.0 )
            if event.button_index == BUTTON_WHEEL_UP:
                cam_scroll.z = -1.0 * MOUSE_SENSITIVITY
            if event.button_index == BUTTON_WHEEL_DOWN:
                cam_scroll.z = 1.0 * MOUSE_SENSITIVITY

            camera.translate( cam_scroll )

            camera.translation.x = old_x_translation
            camera.translation.y = old_y_translation
            camera.translation.z = clamp(camera.translation.z, 0, 5)
            
    # TODO trouver pourquoi cela ne se fait plus:
    if Input.is_action_just_pressed("game_flashlight"):
#       flashlight.visible = not flashlight.visible
        if flashlight.is_visible_in_tree():
            flashlight.hide()
        else:
            flashlight.show()

    if Input.is_action_pressed( "hide_char" ):
        $MeshInstance.visible = not $MeshInstance.visible