# python readmail.py --noauth_local_webserver 

import base64
import datetime
import time
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import data2sheets
import gspread
#from googleapiclient.errors import HttpError

scope = ['https://www.googleapis.com/auth/gmail.readonly',
         'https://www.googleapis.com/auth/gmail.labels',
         'https://mail.google.com/']

def updateTable():
  store = file.Storage('token.json')
  creds = store.get()
  if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('credentials.json', scope)
    creds = tools.run_flow(flow, store)
  service = build('gmail', 'v1', http=creds.authorize(Http()))

  # Now get the google sheet credentials
  credentials = data2sheets.authenticate()
  gc = gspread.authorize(credentials)

  # Open the spreadsheet using the file ID
  wks = gc.open_by_key("1MPBpfSR9Avu3lH7x8t7O9-iteSRqWMhjNKiiH5sBe7k")
  sheet = wks.get_worksheet(0)

  yesterday = datetime.datetime.today() - datetime.timedelta(1)
  query = "after:{0}".format(yesterday.strftime('%Y/%m/%d'))
  print(query)

  apiCount = 0
  start = True
  nextPageToken = 'Start'
  while(nextPageToken):
    if(start == True):
      results = service.users().messages().list(userId='me',q=query, labelIds = ['Label_15']).execute()
      start = False
    else:
      results = service.users().messages().list(userId='me',q=query, labelIds = ['Label_15'], pageToken = nextPageToken).execute()
    
    messages = results.get('messages', [])
    nextPageToken = results.get('nextPageToken', [])

    for message in messages:
      msg = service.users().messages().get(userId='me', id=message['id']).execute()
      gotDate = False

      fromAddr = ''
      subj     = ''
      year = 0
      month = 0
      day = 0
      hour = 0
      mins = 0
      secs = 0

      for i in range(len(msg['payload']['headers'])):
        if(msg['payload']['headers'][i]['name'] == 'From'):
          fromAddr = msg['payload']['headers'][i]['value']
        if(msg['payload']['headers'][i]['name'] == 'Subject'):
          subj = msg['payload']['headers'][i]['value'].split()[4]
        if(gotDate == False and msg['payload']['headers'][i]['name'] == 'Received'):
          if(msg['payload']['headers'][i]['value'].startswith('by')):
            gotDate = True
            rxStr = msg['payload']['headers'][i]['value'].split(';')[1].lstrip().split("(")[0].rstrip()
            received = datetime.datetime.strptime(rxStr, '%a, %d %b %Y %H:%M:%S %z')
            year = received.year
            month = received.month
            day = received.day
            hour = received.hour
            mins = received.minute
            secs = received.second

      error = ''
      timeSecs = ''
      week = ''
      fw = ''
      rxType = ''
      try:
        msg_str = base64.urlsafe_b64decode(msg['payload']['body']['data'])
        #print(msg_str)
        decodedMsg = str(msg_str,'utf-8').split('\r\n')
        for i in range(len(decodedMsg)):
          if(decodedMsg[i].startswith('Error')):
            #print(decodedMsg[i])
            error = decodedMsg[i].split()[2]
          if(decodedMsg[i].startswith('Time')):
            #print(decodedMsg[i])
            timeSecs = decodedMsg[i].split()[2]
          if(decodedMsg[i].startswith('Week')):
            #print(decodedMsg[i])
            week = decodedMsg[i].split()[2]
          if(decodedMsg[i].startswith('FW Version')):
            # print(decodedMsg[i])
            fw = decodedMsg[i].split()[3]
          if(decodedMsg[i].startswith('Type')):
            # print(decodedMsg[i])
            rxType = decodedMsg[i].split()[2]

        if(year == yesterday.year and month == yesterday.month and day == yesterday.day):
          print("%d-%d-%d, %s, %s, %s, %s, %s, %s, %s" % (year,month,day,rxType,error,fw,week,timeSecs,subj[:-1],fromAddr))
          apiCount += 1
          if(apiCount >= 100):
            print("API sleep to avoid exceeding limit")
            time.sleep(100)
            apiCount = 0

          # Now add a row of data to the google sheet
          ErrData = []
          ErrData.append(str("{0}/{1}/{2}".format(year,month,day)))
          ErrData.append("{}".format(rxType))
          ErrData.append("{}".format(error))
          try:
            ErrData.append(float(fw))
          except:
            ErrData.append(fw)
          ErrData.append(int(week))
          ErrData.append(int(timeSecs))
          ErrData.append("{}".format(subj[:-1]))
          ErrData.append("{}".format(fromAddr))
          ret = sheet.append_row(ErrData, value_input_option='RAW')
          print(ret)


      except:
        #except HttpError as err:
        #print(err)
        print("exception")
        print(msg['snippet'])
        pass

while(True):
  tomorrow = datetime.datetime.replace(datetime.datetime.now() + datetime.timedelta(days=1), 
                                       hour=0, minute=0, second=0)
  delta = tomorrow - datetime.datetime.now()
  print("Sleeping %d seconds" % (delta.seconds + 60))
  time.sleep(delta.seconds + 60)
  updateTable()


