import sys
from datetime import datetime
mycall="K1JT"
mygrid="FN20"

# Keyed with hiscall:
Freq={}
T0={}
RcvdExch={}
Grid={}

# Keyed with hiscall_band:
Staged={}
TimeLogged={}
QSOinProgress={}
# QSOinProgress bit values:
#  1 He called me
#  2 I called him
#  4 Received his exchange
#  8 Received his Roger
# 16 Sent Roger
# 32 Staged for logging

def isGrid(g):
    """Return True if g is a valid grid4 and not RR73"""
    if len(g)!=4 or g=="RR73": return False
    if ord(g[0:1])<ord('A') or ord(g[0:1])>ord('R'): return False
    if ord(g[1:2])<ord('A') or ord(g[1:2])>ord('R'): return False
    if ord(g[2:3])<ord('0') or ord(g[2:3])>ord('9'): return False
    if ord(g[3:4])<ord('0') or ord(g[3:4])>ord('9'): return False
    return True

if len(sys.argv)!=4:
    print "Usage:   python all2cab.py <mycall> <mygrid> <infile>"
    print "Example: python all2cab.py K1JT FN20 all_wwdigi_2019.txt"
    exit()

f=open(sys.argv[3],mode='r')
ss=f.readlines()
f.close
dt0=datetime.strptime(ss[0][0:13],"%y%m%d_%H%M%S")
iz=len(ss)
nqso=0
hiscall_band=""

for i in range(iz):
    s=ss[i][0:80].strip()
    dt=datetime.strptime(s[0:13],"%y%m%d_%H%M%S")
    tx=" Tx " in s              #True if this is my transmission
    w=s.split()
    if len(w)<10: continue
    if w[7]=="CQ":
        cq=True
        if w[8].isalpha():
            s=s.replace(" CQ "," CQ_")
            w=s.split()
    if len(w)<10: continue
    c1=w[7]
    c2=w[8]
    c3=w[9]
    roger = c3=="R"
    if roger: c3=w[10]
    cq = (c1=="CQ" or c1[0:3]=="CQ_")
    if cq:
        Grid[c2]=c3

    hiscall=""
    if tx and not cq:
        hiscall=c1
    if c1==mycall:
        freq=int(1000.0*float(s[13:23])) + int((int(s[42:47]))/1000)
        hiscall=c2
        Freq[hiscall]=freq
        MHz="%3d" % int(float(s[13:23]))
        hiscall_band=hiscall+MHz
        n=QSOinProgress.get(hiscall_band,0)
        n = n | 1                                 #He called me
        if roger or c3=="RR73" or c3=="RRR" or c3=="73":
            n = n | 8                             # Rcvd Roger
        if isGrid(c3):
            hisgrid=c3
            RcvdExch[hiscall]=hisgrid
            n = n | 4                             #Received his exchange
        else:
            g=Grid.get(hiscall,"")
            if isGrid(g):
                RcvdExch[hiscall]=g
                n = n | 4                         #Received his exchange
        QSOinProgress[hiscall_band]=n
        
    if len(hiscall)>=3:
        MHz="%3d" % int(float(s[13:23]))
        hiscall_band=hiscall+MHz
        if tx:
            n=QSOinProgress.get(hiscall_band,0)
            n = n | 2                             #I called him
            if roger or c3=="RR73" or c3=="RRR" or c3=="73":
                n = n | 4 | 16                    #Rcvd Exch, Sent Roger
            if c3=="RR73" or c3=="RRR" or c3=="73":
                n = n | 8                         #Rcvd Exch, Sent Roger
            QSOinProgress[hiscall_band]=n
        T0[hiscall]=dt

    if len(hiscall_band)<5 or len(hiscall)<3: continue
    
    if QSOinProgress.get(hiscall_band,0)>=31:
        n=QSOinProgress.get(hiscall_band,0)
        n = n | 32
        QSOinProgress[hiscall_band]=n
        t=str(T0[hiscall])[0:16]
        t=t[0:13] + t[14:16]
        buf="QSO: %5d DG %s %-10s    %s       %-10s    %s" % (Freq[hiscall],t,\
                mycall,mygrid,hiscall,RcvdExch.get(hiscall,"    "))
        MHz="%3d" % int(float(s[13:23]))
        hiscall_band=hiscall+MHz
        t=Staged.get(hiscall_band,"")
        time_diff=-1
        if TimeLogged.get(hiscall_band,0)!=0:
            time_diff=(T0[hiscall] - TimeLogged[hiscall_band]).total_seconds()
        if time_diff == -1 or time_diff > 180:    #Log only once within 3 min
            Staged[hiscall_band]=buf              #Staged for logging
            nqso=nqso+1
            TimeLogged[hiscall_band]=T0[hiscall]
            print buf                             #For now, log anything staged
            del QSOinProgress[hiscall_band]