import matplotlib
# Allow running headless from the command line
matplotlib.use("agg")

import pylab as pl
import numpy as np
import pandas as pd
import mutils as m
import os
import io
from PIL import Image
import psutil
import sys
import datetime


if(len(sys.argv) != 3):
  BaseStr  = 'Alloy'
  RoverStr = 'NetR9'
else:
  BaseStr  = sys.argv[1]
  RoverStr = sys.argv[2]
  print('Got stations',BaseStr,RoverStr)

thresh = 86000

def savePlot(directory,name):
  # Save the data as a PNG file
  if not os.path.exists(directory):
    os.makedirs(directory)

  # Save the png to memory
  ram = io.BytesIO()
  pl.savefig(ram,format='png',dpi=150)
  ram.seek(0)
  # Compress the png data before saving to the file system, the
  # matplotlib png's are not well compressed
  im = Image.open(ram)
  im2 = im.convert('RGB').convert('P', palette=Image.ADAPTIVE)
  im2.save(directory + "/" + name,format='PNG')

# Override pylab find() to avoid deprecation warning
# pylint: disable=function-redefined
def find(x):
  return pl.where(x)[0]

sysData = [ {"sysName":"GPS", "sys":0, "sigStr":"L1 C/A" , "start":1, "stop":32},
            {"sysName":"SBAS", "sys":1, "sigStr":"L1 C/A" , "start":120 , "stop":158},
            {"sysName":"GLONASS", "sys":2, "sigStr":"L1 C/A" , "start":1 , "stop":24},
            {"sysName":"GALILEO", "sys":3, "sigStr":"L1 MBOC(1,1)" ,"start":1 , "stop":36},
            {"sysName":"QZSS", "sys":4, "sigStr":"L1 C/A" , "start":193 , "stop":202},
            {"sysName":"IRNSS", "sys":9, "sigStr":"L5 C/A" , "start":1 , "stop":14},
            {"sysName":"BDS", "sys":10, "sigStr":"B1I" , "start":1 , "stop":63} ]

data = np.genfromtxt('results.txt',delimiter=',') 

for sysNum in range(len(sysData)):
  sys = sysData[sysNum]['sys']

  fig1=pl.figure()
  ax1=fig1.add_subplot(111)

  fig2=pl.figure()
  ax2=fig2.add_subplot(111)

  num = 0
  for sv in range(sysData[sysNum]['start'],sysData[sysNum]['stop']+1):
    j = find( (data[:,3] == sv) & (data[:,4] == sys) & (data[:,16] >= thresh) & (data[:,17] >= thresh) )
    if(len(j) > 0):
      print(sv,sys,len(j))

      # Plot the per satellite data
      startTime = datetime.datetime(2020,1,1)
      dayNum = []
      for i in range(len(j)):
        now = datetime.datetime(int(data[j[i],0]),int(data[j[i],1]),int(data[j[i],2]))
        dayNum.append((now-startTime).days)

      # Plot FLL + PLL and then a plot of PLL only
      for track in range(2):
        delta = track*2 # Offset in data fields between FLL+PLL & PLL  

        fig=pl.figure()
        ax=fig.add_subplot(311)
        pl.plot(dayNum,data[j,12+delta],'o-',label=BaseStr)
        pl.plot(dayNum,data[j,13+delta],'o-',label=RoverStr)
        pl.grid(True)
        ax.get_xaxis().get_major_formatter().set_useOffset(False)
        ax.get_yaxis().get_major_formatter().set_useOffset(False)
        pl.legend(loc='best')
        pl.ylabel('Num. Epochs')

        if(track == 0):
          trackMode = 'PLL+FLL'
        else:
          trackMode = 'PLL'

        pl.title(trackMode + ' - ' + sysData[sysNum]['sysName'] + ' ' + str(sv) + ' ' + sysData[sysNum]['sigStr'] + ': 7 deg. elev. filter')

        ax=fig.add_subplot(312)
        ratio = 100.0 * (data[j,12+delta] - data[j,13+delta]) / (0.5 * (data[j,12+delta] + data[j,13+delta]))
        pl.plot(dayNum,ratio,'ro-')
        pl.grid(True)
        pl.ylabel('Relative Epochs[%]')
        pl.title(BaseStr + ' vs ' + RoverStr + ' Epochs (+ = more ' + BaseStr + ' Epochs)')

        ax=fig.add_subplot(313)
        pl.plot(dayNum,data[j,8+delta],'ro-',label=(r'$\mu$'))
        pl.plot(dayNum,data[j,9+delta],'bo-',label=(r'$\sigma$'))
        pl.grid(True)
        pl.ylabel('dBHz')
        pl.title('Common Epochs C/No difference')
        pl.xlabel('Time since 2020-01-01 [Days]')
        pl.legend(loc='best')

        pl.tight_layout()
        if(track == 0):
          savePlot('.',sysData[sysNum]['sysName'] + '-SV-' + str(sv) + '.png')
        else:
          savePlot('.','PLL_' + sysData[sysNum]['sysName'] + '-SV-' + str(sv) + '.png')
        pl.close() 
        
      # Build up a plot with combined data
      pl.figure(fig1.number)
      if(num<10):
        pl.plot(data[j,12],data[j,13],'o',label=str(sv))
      elif(num<20):
        pl.plot(data[j,12],data[j,13],'s',label=str(sv))
      elif(num<30):
        pl.plot(data[j,12],data[j,13],'^',label=str(sv))
      else:
        pl.plot(data[j,12],data[j,13],'v',label=str(sv))

      x = np.ones(len(j)) * sv
      pl.figure(fig2.number)
      if(num<10):
        pl.plot(x,ratio,'o',label=str(sv))
      elif(num<20):
        pl.plot(x,ratio,'s',label=str(sv))
      elif(num<30):
        pl.plot(x,ratio,'^',label=str(sv))
      else:
        pl.plot(x,ratio,'v',label=str(sv))

      num+=1


  if(num > 0):
    # Base vs Rover Epochs
    pl.figure(fig1.number)
    pl.xlabel(BaseStr + ' Epochs')
    pl.ylabel(RoverStr + ' Epochs')
    pl.title(sysData[sysNum]['sysName'] + ' ' + sysData[sysNum]['sigStr'] + ' Comp. (7 deg. elev. filter)')

    # Setup the same axis
    left, right = pl.xlim()
    bottom, top = pl.ylim()
    minAxis = min(left,bottom)
    maxAxis = min(right,top)
    pl.xlim(minAxis,maxAxis)
    pl.ylim(minAxis,maxAxis)
    ax1.set_aspect('equal')

    pl.grid(True)
    # Prevent the axis numers having an offset
    ax1.get_xaxis().get_major_formatter().set_useOffset(False)
    ax1.get_yaxis().get_major_formatter().set_useOffset(False)
    if(sysData[sysNum]['sysName'] == 'GLONASS'):
      pl.legend(ncol=3,title=(sysData[sysNum]['sysName'] + ' Almanac Number'),bbox_to_anchor=(0.85, 0), loc='lower left', borderaxespad=0.)
    else:
      pl.legend(ncol=3,title=(sysData[sysNum]['sysName'] + ' PRN Number'),bbox_to_anchor=(0.85, 0), loc='lower left', borderaxespad=0.)
    pl.tight_layout()
    savePlot('.',sysData[sysNum]['sysName'] + '-Epochs.png')
    pl.close() # The figure

    # SV vs. Base/Rover ratio
    pl.figure(fig2.number)
    if(sysData[sysNum]['sysName'] == 'GLONASS'):
      pl.xlabel(sysData[sysNum]['sysName'] + ' Almanac Number')
    else:
      pl.xlabel(sysData[sysNum]['sysName'] + ' PRN')
    pl.ylabel('Relative Number of Epochs[%]')
    pl.title(BaseStr + ' vs ' + RoverStr + ' Epochs (+ = more ' + BaseStr + ' Epochs)')

    pl.grid(True)
    # Prevent the axis numers having an offset
    ax2.get_xaxis().get_major_formatter().set_useOffset(False)
    ax2.get_yaxis().get_major_formatter().set_useOffset(False)
    if(sysData[sysNum]['sysName'] == 'GLONASS'):
      pl.legend(ncol=3,title=(sysData[sysNum]['sysName'] + ' Almanac Number'),bbox_to_anchor=(0.85, 0), loc='lower left', borderaxespad=0.)
    else:
      pl.legend(ncol=3,title=(sysData[sysNum]['sysName'] + ' PRN Number'),bbox_to_anchor=(0.85, 0), loc='lower left', borderaxespad=0.)
    pl.tight_layout()
    savePlot('.',sysData[sysNum]['sysName'] + '-Relative.png')
    pl.close() # The figure

print("Completed")
