import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s\t%(levelname)s\t%(message)s')

import snd
import time
from datetime import date
import threading
from pydispatch import dispatcher
import wave
import serial
#python -m serial.tools.miniterm -p COM20 -e -b 115200 --cr
import psycopg2
import csv
import sys
import os


sys.path.insert(0, os.path.join(os.path.dirname(__file__) or '.', 'pynma'))
import pynma

filename = "demo.wav"
last_call = (None, None, None)
MIN_LENGTH = 90000
lock = threading.RLock()


def get_call():
    global lock
    with lock:
        ser.write("GLG\r")
        line = ser.readline()   # read a '\n' terminated line
        print line
        reader = csv.reader([line])
        for row in reader:
            #GLG,40078,NFM,0,0,CanberraBlackMnt,AustralianCapita,SES Ops 1,1,0
            #,NONE,NONE,NONE
            if (row[0] != 'GLG' or row[1] == ''):
                print "uh oh"
                return (None, None, None)
            if (row[1] != ''):
                tgid = row[1]
                #nma.push("scannr", "ping", filename, "http://www.google.com")
                tgname = row[7]
                sitename = row[5]
                return (tgid, tgname, sitename)


def log_recording(tgid, tgname, sitename, filename, length):
    cur = conn.cursor()
    cur.execute("INSERT INTO recordings \
    (tgid, tgname, sitename, filename, length)\
     VALUES (%s, %s, %s, %s, %s)",( tgid, tgname, sitename, filename, length))
    conn.commit()
    cur.close()


def tgid_worker():
    global last_call
    last_call = get_call()


def save_worker(filename, length):
    global last_call
    """thread worker function
    http://www.doughellmann.com/PyMOTW/threading/
    https://github.com/uskr/pynma
ffmpeg -i 2012-09-29-1348911268.34-demo.wav -ar 8000 -ab 4.75k test.3gp
http://stackoverflow.com/questions/2559746/getting-error-while-converting-
wav-to-amr-using-ffmpeg
"""
    print 'Worker for ' + filename
    (oldtgid, oldtgname, oldsitename) = last_call
    (tgid, tgname, sitename) = get_call()
    if oldtgid == tgid:
        if tgid == None or tgid == '':
            print filename + " has no TGID"
        else:
            log_recording(tgid, tgname, sitename, filename, length)
    else:
        if tgid == None or tgid == '':
            print filename + " has no TGID"
        else:
            log_recording(tgid, tgname, sitename, filename, length)
        if oldtgid == None or oldtgid == '':
            print filename + " has no old TGID"
        else:
            log_recording(oldtgid, oldtgname, oldsitename, filename, length)
    return


def filenameMaker():
    global filename
    filename = date.today().isoformat()+'-'+str(time.time())+'-demo.wav'

def do_record():
    sample_width, data = snd.record()
    thr = threading.Thread(target=record_to_async_file, args=(sample_width,data,filename))
    thr.start()


def record_to_async_file(sample_width,data,filename):
    "Records from the microphone and outputs the resulting data to `filename`"
    print "Recording complete"
    if len(data) > MIN_LENGTH:
        print "Recording being saved..."
        dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename, length=len(data))
        print str(len(data))
        data = snd.pack('<' + ('h'*len(data)), *data)
        path = "./data/"+filename
        wf = wave.open(path, 'wb')
        wf.setnchannels(2)
        wf.setsampwidth(sample_width)
        wf.setframerate(snd.RATE)
        wf.writeframes(data)
        wf.close()
        del wf
        print("done - result "+str(len(data))+" frames written to "+path)
    del data

dispatcher.connect( filenameMaker, signal='SND_STARTED', sender=dispatcher.Any )
dispatcher.connect( tgid_worker, signal='SND_STARTED', sender=dispatcher.Any )
dispatcher.connect( save_worker, signal='FILE_CREATED', sender=dispatcher.Any )

print "Opening serial port..."
if sys.platform.startswith('darwin'):
	ser = serial.Serial('/dev/tty.usbserial-FTB3VL83', 112500, timeout=1)
elif sys.platform.startswith('win32'):
	ser = serial.Serial('COM20', 112500, timeout=1)
print "Loading notifymyandroid..."
nma = pynma.PyNMA( "a6f50f76119eda33befe4325b4b9e1dd25eef7bad2868e4f")
print "Connecting database..."
conn = psycopg2.connect("dbname=scannr user=postgres password=snmc")
print "Scannr started."
while True:
    print "ready to record again"
    do_record()
ser.close()



