#!/usr/bin/python

import datetime
import glob
import os
import re
import smtplib
import struct
import sys
import time

from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders

import Scientific.IO

from Scientific.IO import NetCDF 
from Numeric import *

from ConfigParser import ConfigParser


def parseCommandline():
    '''Analyze path given on command line'''
    if( len( sys.argv ) > 1 ):
        outFolder = sys.argv[1]
    else:
        outFolder = "."
    return outFolder

def send_mail(send_from, send_to, subject, text, files=[], server="localhost"):
  assert type(send_to)==list
  assert type(files)==list

  msg = MIMEMultipart()
  msg['From'] = send_from
  msg['To'] = COMMASPACE.join(send_to)
  msg['Date'] = formatdate(localtime=True)
  msg['Subject'] = subject

  msg.attach( MIMEText(text) )

  for f in files:
    part = MIMEBase('application', "octet-stream")
    print( f)
    part.set_payload( open(f,"rb").read() )
    Encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
    msg.attach(part)

  smtp = smtplib.SMTP(server)
  smtp.sendmail(send_from, send_to, msg.as_string())
  smtp.close()


def sendSbd():
    '''Sends the e-mail/text'''      
    sender = 'tethys@tellum.shore.mbari.org'
    receivers = ['8313347658@mms.att.net', '8318091857@vtext.com', '8319208934@mms.att.net']
    
    message = """ 
    Subject: Tethys Alert
    import os
    New default mission start detected
    """
    
    try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(sender, receivers, message)         
       print "Successfully sent failure notification"
    except:
       print "Error: unable to send notification"
    

def main():
    '''The main program'''
    outFolder = parseCommandline()

    cfg = ConfigParser()
    cfg.read("/var/www/Logs/drifters/patchTrack.properties")
    
    emailSend = cfg.get("email", "send") == "true"
    emailFrom = cfg.get("email", "from")
    emailTo = cfg.get("email", "to").split(";")
    
    drifterDeltaLatitude = float(cfg.get("drifterDelta", "latitude"))
    drifterDeltaLongitude = float(cfg.get("drifterDelta", "longitude"))
    
    offsetMinutes = float(cfg.get("offset", "minutes"))
    

    if os.path.exists(outFolder + "/stella105_pos"):
        inFile = open(outFolder + "/stella105_pos", 'r')
        lineList = inFile.readlines()
        inFile.close()
        lineCount = len(lineList)
        previousCount = 0
        m = re.match('(\d+) (\d+\.\d+) (\-\d+\.\d+) .*', lineList[lineCount-2])
        prevTime = int(m.group(1))
        prevLat = float(m.group(2))
        prevLon = float(m.group(3))
        m = re.match('(\d+) (\d+\.\d+) (\-\d+\.\d+) .*', lineList[lineCount-1])
        lastTime = int(m.group(1))
        lastLat = float(m.group(2))
        lastLon = float(m.group(3))
        dTime = lastTime - prevTime
        dLat = lastLat - prevLat
        dLon = lastLon - prevLon
        now = time.time()

        ncFile = NetCDF.NetCDFFile('/home/godin/workspace/LRAUV/Resources/cencalShoreDist.nc', 'r') 
        varLat = ncFile.variables['latitude']
        varLon = ncFile.variables['longitude']
        varDist = ncFile.variables['distance']
        distLat = varLat.getValue()
        distLon = varLon.getValue()
        dist = varDist.getValue()
        ncFile.close()

        dDistLat = distLat[1]-distLat[0]
        dDistLon = distLon[1]-distLon[0]

        emailText = "";
        emailFiles = []

        for dtMin in [ 0, 15, 30, 45, 60, 75, 90, 120 ]:
            fout = open(outFolder + "/patch%03d.txt" % dtMin, 'w' )
            fTime = now + dtMin * 60
            lat = lastLat + (fTime-lastTime) * dLat / dTime + drifterDeltaLatitude;
            lon = lastLon + (fTime-lastTime) * dLon / dTime + drifterDeltaLongitude;
            [distance,latIndex,lonIndex] = findDist( lat,lon,distLat,distLon,dist)
            while distance < 4.5:
                print("distance = %f" % distance)
                [distance,latIndex,lonIndex] = improveDist( latIndex,lonIndex,distLat,distLon,dist)
                lat = distLat[latIndex]
                lon = distLon[lonIndex]
            print("distance=%f" % distance)
            fout.write( "set track.CenterLat %f degree;set track.CenterLon %f degree" % (lat,lon))
            if dtMin == offsetMinutes:
                emailText = "set track.CenterLat %f degree;set track.CenterLon %f degree" % (lat,lon)
                emailFiles = ["%s/patch%03d.sbd" % ( outFolder, dtMin)]
            fout.close()
            os.system("/home/godin/workspace/LRAUV/bin/sbd -i %s/patch%03d.txt -o %s/patch%03d.sbd TethysEncryption" % ( outFolder, dtMin, outFolder, dtMin ))
            
        if emailSend:
            send_mail(emailFrom, emailTo, "300034012930410", emailText, emailFiles)
            
            
    else:
        print( "No "  + outFolder + "/stella105_pos" )
        

def findDist( lat,lon,distLat,distLon,dist):
    latIndex = int((lat-distLat[0])/(distLat[1]-distLat[0]) + 0.5)
    lonIndex = int((lon-distLon[0])/(distLon[1]-distLon[0]) + 0.5)
    distance = dist[latIndex,lonIndex]
    return [distance,latIndex,lonIndex]

def improveDist( latIndex,lonIndex,distLat,distLon,dist):
    maxLatIndex = 0
    maxLonIndex = 0
    maxDistance = 0
    for iLat in [latIndex-1,latIndex,latIndex+1]:
        for iLon in [lonIndex-1,lonIndex,lonIndex+1]:
            distance = dist[iLat,iLon]
            if distance > maxDistance:
                maxLatIndex = iLat
                maxLonIndex = iLon
                maxDistance = distance
    return [maxDistance,maxLatIndex,maxLonIndex]
    
if __name__ == '__main__':

    main()
    
