'''
Modified 14 Nov to allow working to common json file on wildgate.org
Copyright © 2022 – WildGate Consultancy Solutions Limited – all Rights Reserved


For use only with SecureMapView and only under explicit licence with SecureMapView
Other use can be considered on request, contact WildGate Consultancy Solutions Limited via
www.securemapview.co.uk   or   email    info@wildgate.co.uk

GeoJson Track Generator.  CReates defined number of tracks, within bounded region , tracks update at defined rate


'''
import json
from geojson import Point, Feature, FeatureCollection, dump
from time import sleep
import random


##  define / set initial variables

#####  SETUP ALL VARIABLES  ##################

##  find config file location

ConfigLoc = 'TrackGenConfig.json'

### Read configs from json file
try:
    with open(ConfigLoc) as data:
        Sets = json.loads(data.read())  ## use 'load' , not 'loads'

        latmin = float(Sets[0]['Settings']['South'])
        latmax = float(Sets[0]['Settings']['North'])
        lonmin = float(Sets[0]['Settings']['West'])
        lonmax = float(Sets[0]['Settings']['East'])
        plats = int(Sets[0]['Settings']['Platforms'])
        speedscalar = int(Sets[0]['Settings']['SpeedScalar'])
        trackfile = (Sets[0]['Settings']['TrackFile'])
        verbose = int(Sets[0]['Settings']['verbose'])
        looptime = int(Sets[0]['Settings']['trackinterval'])
        print(" Read all config file values")
       
except IOError:
    ErrorStr = "Could not find Config file ," + str( ConfigLoc) + "! using defaults"
    print (ErrorStr)

    trackfile = 'LeafTrks.json'
    latmin, latmax, lonmin, lonmax = 50.5, 54, -3.6, 1.3
    speedscalar = 30
    plats = 10
    looptime = 5
    verbose = 2




'''
initialise program variables
'''
speed = (latmax-latmin) / speedscalar
features = []
lats =[]
lons = []
latvary = []
lonvary = []
varyspeed = []
callsign = []
features = []



'''
FUNCTION
update the lats and lons based upon the defined variances , variances remain static
'''
def updatelocs(lats, lons, latvary, lonvary):
    listlen = len(lats)
    for i in range (listlen):
        if lats[i] > latmax or lats[i] < latmin:
            latvary[i] = (latvary[i])*(-1)  # change direction
        if lons[i] > lonmax or lons[i] < lonmin:
            lonvary[i] = (lonvary[i])*(-1)  # change direction
        lons[i]= round((lons[i]+ lonvary[i]),6)
        lats[i]= round((lats[i]+ latvary[i]),6)
    if verbose > 1:
        print("")   
        print(lons)
        print("")
        print(lats)  

'''
FUNCTION   
## use defined lists and updated lats and lons to update geojson file
'''
def updatejson(lats, lons, varyspeed, callsign, features):
    features=[]
    listlen = len(lats)
    for i in range (listlen):
        lon = (lons[i])
        lat = (lats[i])
        point = Point((lon, lat))
        callsn = callsign[i]
        curspeed = str(varyspeed[i])
        features.append(Feature(geometry=point, properties={"color": "red", "title": callsn, "heading" : "123", "speed": curspeed}))
    feature_collection = FeatureCollection(features)
    with open(trackfile, 'w') as f:
       dump(feature_collection, f)  # output to json file
    if verbose == 1:
        print ("outputting to GeoJson")
        print("")       
    if verbose > 1:
        print (feature_collection)
        print("")


'''
MAIN PROGRAM 
SETUP

create initial track data in lists

'''

if verbose == 1:
    print ("creating lists")
    print("") 

for i in range (plats):
    lat = round(random.uniform(latmin,latmax), 6)
    lon = round(random.uniform(lonmin,lonmax), 6)
    lats.append(lat)
    lons.append(lon)
    varylat = round((round(random.uniform(-1,1), 1))*speed,3)
    varylon = round((round(random.uniform(-1,1), 1))*speed, 3)
    #tempspeed = varylat*1000
    tempspeed = (round(random.uniform(3,6), 1))*speedscalar
    latvary.append(varylat)  # one time only
    lonvary.append(varylon)  # one time only
    varyspeed.append(tempspeed)   # one time only
    callchars = chr(random.randint(65, 90)) + chr(random.randint(65, 90)) + chr(random.randint(65, 90))
    callnum = random.randint(11, 346)
    callall = callchars# + str(callnum)  - numbers removed 13 Oct 25
    callsign.append(callall)     # one time only
 
if verbose > 1:
    print (lats)
    print (lons)
    print (latvary)
    print (lonvary)
    print (callsign)

'''
MAIN PROGRAM LOOP

continual update track data

'''

##  main loop  ##
while True:
    updatelocs(lats, lons, latvary, lonvary)
    updatejson(lats, lons, varyspeed, callsign, features)
    sleep(looptime)

