local function convertDotNetTickTimeToLuaTimestamp(theDotNetStamp)
   return (tonumber(theDotNetStamp) - 621355968000000000) / 10000000 
end

local function convertLuaTimestampToDotNetTickTime(theUnixStamp)
   return 621355968000000000 + (tonumber(theUnixStamp) * 10000000)
end

local function convertTimeToTravelSeconds(distanceNMi,knotspeed)
  return distanceNMi / ( (knotspeed * (1852/3600)) / 1852) --1852 meters in a international NMi, 3600 seconds in a hour.
end

--finds existing specified trigger, removes it from event removes it.
--recreates it with original name and specified time and reassociates it back
--to original event. Upon not finding the original it will create new one.
local function DeleteAndReCreateTimeTrigger(theEvent,theTrigger,theTime)
    local e,p = pcall(ScenEdit_GetEvent,theEvent);
    if((theTime~=nil) and type(theTime) == 'number') then --convert unix time to .net tick time.
        theTime = convertLuaTimestampToDotNetTickTime(theTime);
    end
    if(e == true and p ~=nil)  then
        local triggerID;
        for k,v in pairs(p.triggers) do --find matching if multiple.
            if ((v.Time ~= nil) and v.Time.Description==theTrigger) then
                if(theTime == nil) then theTime = tonumber(v.Time.Time); end
                triggerID = v.Time.ID; break;
            end
        end
        if triggerID ~=nil then  --if found remove.else just create.
           ScenEdit_SetEventTrigger(theEvent,{Mode='remove',Description=triggerID});
           ScenEdit_SetTrigger({Description=triggerID, Mode='remove'});
        end
        ScenEdit_SetTrigger({name=theTrigger, mode='add',Type="Time",Time=theTime});
        ScenEdit_SetEventTrigger(theEvent,{mode='add',Description=theTrigger});
    else print('DeleteAndReCreateTimeTrigger(): Error event not obtainable. details: ' .. tostring(p));
    end
    e,p = nil,nil;

end

local function GetOffsetTime(munitionknots)
  --distance Gwadar to CVN Ford
  --group location {name='DF-100 Gwadar', guid='2QQSQX-0HM6ANAKVHMQE'} {name='CVN Ford', guid='2QQSQX-0HLUU70QJ4VPA'}
  local dist_gwadartoford = Tool_Range('2QQSQX-0HM6ANAKVHMQE','2QQSQX-0HLUU70QJ4VPA')
  --distance Djibouti to CVN Ford
  --group location {name='DF-100 Djibouti', guid='2QQSQX-0HM6ANAKVHMQS'}?? {name='CVN Ford', guid='2QQSQX-0HLUU70QJ4VPA'}
  local dist_djiboutitoford = Tool_Range('2QQSQX-0HM6ANAKVHMQS','2QQSQX-0HLUU70QJ4VPA')
  local delta= dist_gwadartoford - dist_djiboutitoford
  --print(delta)
  print("delta: " ..delta);
  if delta == 0 then
    return 0; 
  else 
    return math.ceil(convertTimeToTravelSeconds(delta,munitionknots)); 
  end
end

--INPUT VARIABLES HERE

local striketime = ScenEdit_CurrentTime() 
local adjustedtime = striketime --default value just so it's never null
local retval = GetOffsetTime(3000); -- speed of df100 is 3000kts\h 
if retval > 0 then
  -- GWadar further, launches first.
  adjustedtime = striketime + retval 
  DeleteAndReCreateTimeTrigger('activate-strike DF-100 Gwadar','time trigger DF-100 Gwadar',striketime)
  DeleteAndReCreateTimeTrigger('activate-strike DF-100 Djibouti','time trigger DF-100 Djibouti',adjustedtime)
elseif retval < 0 then 
  -- GWadar closer, launches last.
  adjustedtime = striketime + (retval * -1) 
  DeleteAndReCreateTimeTrigger('activate-strike DF-100 Gwadar','time trigger DF-100 Gwadar',adjustedtime)
  DeleteAndReCreateTimeTrigger('activate-strike DF-100 Djibouti','time trigger DF-100 Djibouti',striketime)
else
  DeleteAndReCreateTimeTrigger('activate-strike DF-100 Djibouti','time trigger DF-100 Djibouti',striketime)
  DeleteAndReCreateTimeTrigger('activate-strike DF-100 Gwadar','time trigger DF-100 Gwadar',striketime)
end
