'''
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
updated tracks are fed to .json files in relevant folders in "maplist"


'''
import json
from geojson import Point, Feature, FeatureCollection, dump
from time import sleep
import random

maplist = ["GoogleDriver", "LeafletFollower", "GoogleDriverforGarr", "GreyFollowerLeaflet"]

##  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 = './json/Trks.json'
    latmin, latmax, lonmin, lonmax = 50.5, 54, -3.6, 1.3
    speedscalar = 30
    plats = 3
    looptime = 10
    verbose = 2


'''
initialise program variables
'''
speed = (latmax-latmin) / speedscalar
features = []
lats =[]
lons = []
latvary = []
lonvary = []
varyspeed = []
callsign = []
calllist = []
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(trackfile, 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 = 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
       print ("outputting to ", trackfile)
    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("") 
  # create initial variables
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
    
    # need to create callsign list for number of maplists
maplistlen = len(maplist)
for l in range (maplistlen):
    callsign=[]
    for i in range (plats):
        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)
        callsign.append(callall)     # creates one callsign list
    print(l)
    print(callsign)
    calllist.append(callsign) # add to list of callsign list

print(calllist)

sleep(5) 
 
if verbose > 1:
    print (lats)
    print (lons)
    print (latvary)
    print (lonvary)
    print (callsign)

'''
MAIN PROGRAM LOOP

continual update track data

'''

##  main loop  ##
while True:
    for item in maplist:
        trackfile = '\\' + item + '\json\Trks.json'
        print ('updating against..', maplist.index(item))
        print ('updating file..', trackfile)
        updatelocs(lats, lons, latvary, lonvary)
        updatejson(trackfile, lats, lons, varyspeed, calllist[maplist.index(item)], features)
    sleep(looptime)

