
.namespace SpriteMover


--TODO à centraliser
---------------------------copier coller de "progressive action"-------------------------------------------------------
CurrentAction={}
TIMER=0.015 --valeur que l'on peut changer aprés, selon la fluidité
g_timer = nil

function Act() --function spécifique à chaque script
	return
end

function CheckEnd()
	return false
end

function Finish()

end

function StartTimer()
    g_timer=GlobalFunctions.CreateTimerSystem(self.Name,TIMER,false,true,false, self)
    g_timer.Enabled=true
    g_timer.Start()
	self.CanTimeOut=true
end

--a appelé lors du lancement
function CheckTimer()
	if g_timer == nil then
		StartTimer()
	end
end

function OnUpdateUnit()

end

function OnUpdate(dt)
	self.CanTimeOut=true
	OnUpdateUnit(dt)
end

function OnTimeOut()
	
	if self.CanTimeOut then
		if CurrentAction==nil then
			OPLog.Log('erreur ! CurrentAction=nil '..self.Name)
		end
		if table.getn(CurrentAction) == 0 then
			OPUnitFactory.CloseUnit(g_timer)
			g_timer = nil
		end
		
		for u,action in pairs(CurrentAction) do
			if not CheckEnd(action) then
				newact = Act(action)
				if newact~=nil then
					CurrentAction[u] = newact
				end
			else
				table.remove(CurrentAction,u)
				Finish(action)
			end
		end
		self.CanTimeOut=false
	end
end

--------------------------------------------------------------------------

--on utilise les vecteurs 2d
function Move(ut,posfinal,speed,utnotify,acceleration,speedmax)
    --si c'est acceleration c'est speedmax
    --sinon c'est speedmin
    local action={}
    
    --on normalise le vecteur avant
    vecdir=posfinal-Vector:new(ut)
    --vecdir:display()
	if vecdir:norm()==0 then
		--peut etre mettre appeler l'event de fin ?
		return
	end
    vecdir=vecdir:normalize()
    --vecdir:display()

    if acceleration==nil then
        acceleration=-1
	else
		acceleration=acceleration^2
    end
	
	if speedmax~=nil then
		speedmax=speedmax
	end
	
	speed=speed
    
    --on vérifie d'abord si cette unit n'est pas dans la liste des action--
    for u,v in pairs(CurrentAction) do
        if v.ut.Name==ut.Name then
            v.speed=speed
            v.posfinal=posfinal
            v.vecdir=vecdir
            v.utnotify=utnotify
            v.acceleration=acceleration
            v.speedmax=speedmax
            v.vecpos=Vector:new(ut)
			return true
        end
    end
    
    action.ut=ut
    action.speed=speed
    action.posfinal=posfinal
    action.utnotify=utnotify
    action.vecdir=vecdir
    action.acceleration=acceleration
    action.speedmax=speedmax
    action.vecpos=Vector:new(ut)
    
    --OPLog.Log(posfinal.x..' '..posfinal.y)
    --vecdir:display()
    table.insert(CurrentAction,action)
    
    --if GetVariables('DebugMode')==true then
	--Load('GUITextMover').Text= GlobalFunctions.Display(CurrentAction)
   -- end
   
   CheckTimer()
end

function Act(action)
	vecdir=action.vecdir
	--accélération--
	if (action.acceleration ~= -1) then
		if action.speedmax==nil then
			action.speed=action.speed+action.acceleration
		else
			if action.acceleration>0 then
				action.speed=math.min(action.speedmax,action.speed+action.acceleration)
			else
				action.speed=math.max(action.speedmax,action.speed+action.acceleration)
			end
		end
	end			
	action.vecpos=action.vecpos+vecdir:scale(action.speed)
	vecdiff=action.posfinal-action.vecpos
	SetPosAccordingToType(action)
	--action.vecpos:set(action.ut)
end

function SetPosAccordingToType(action)
	if action.ut.ClassName == "Camera" then
		action.ut.Up_X = action.vecpos.x
		action.ut.Up_Z = action.vecpos.y
	else
		action.vecpos:set(action.ut)
	end
end

function CheckEnd(action)
	local vecdiff=action.posfinal-action.vecpos
	if (vecdiff*action.vecdir<=0 ) then
		return true
	end
	return false
end

function Finish(action)
	action.vecpos=action.posfinal
	
	--on cale l'unit sur l'arrivée
	action.ut.Position_X=action.posfinal.x
	action.ut.Position_Y=action.posfinal.y
	
	if action.utnotify~=nil then
		action.utnotify.OnMoveEnd(action.ut,action.speed)
	end
end

function StopMove(ut)
    for u,v in pairs(CurrentAction) do
        if (v.ut.Name==ut.Name) then
            table.remove(CurrentAction,u)
        end
    end
    return nil
end

function GetAngle(ut)
    for u,v in pairs(CurrentAction) do
        if (v.ut.Name==ut.Name) then
            local angle=v.vecdir:getangle()
            return angle
        end
    end
    return nil
end
