#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 18 13:57:57 2017

@author: jfiser

read data from one day riometer file
return time series of measured data as a list (t,y)
"""
import numpy as np
from datetime import datetime, timedelta
import shutil as sh
import os

def read_file(path,dt,sel): #path to file; dt=sampling PERIOD;sel=instrument identificator;
    siz1=1440
    siz2=siz1*1500
    try:
        tmp=os.path.basename(path)+".tmp"
        sh.copyfile(path,tmp)
        f=open(tmp,"rb")
    except:
        return False
    i=-1
    t=np.zeros(siz2)
    y=np.zeros(siz2)
    synch=np.zeros(siz1)
    counter=np.zeros(siz1)
    timesync=np.zeros(siz1)
    time0p=np.zeros(siz1)
    lastind=0
    while True:
        i+=1
        block1=np.fromfile(f,'uint8',48) #read header block
        if any(block1):
#            header=block1[0:7]
#            id=block1[8]
            counter[i]=256**3*np.int64(block1[12])+256**2*np.int64(block1[11])+256*np.int64(block1[10])+block1[9]
        else:
            f.close()
            os.remove(tmp)
            return [t[0:lastind],y[0:lastind]]  #return if correct eof

        blockdata=np.fromfile(f,'uint16',1500) #read data.block
        if any(blockdata):
            for j in range (0,1500):
                y[1500*i+j]=blockdata[j]
                lastind=1500*i+j
        else:
            f.close()
            os.remove(tmp)
            return False

        block3=np.fromfile(f,'uint8',24) #read tail block
        if any(block3):
            block3=np.int64(block3)
            synch[i]=256**3*block3[3]+256**2*block3[2]+256*block3[1]+block3[0]
            year=int(2000+10*np.bitwise_and(block3[4],240)/16+np.bitwise_and(block3[4],15))
            month=int(10*np.bitwise_and(block3[5],240)/16+np.bitwise_and(block3[5],15))
            day=int(10*np.bitwise_and(block3[6],240)/16+np.bitwise_and(block3[6],15))
            hour=int(10*np.bitwise_and(block3[7],240)/16+np.bitwise_and(block3[7],15))
            minute=int(10*np.bitwise_and(block3[8],240)/16+np.bitwise_and(block3[8],15))
            if i==0:
                zyear=year; zmonth=month; zday=day;
            timesync[i]=86400*(datenum(datetime(year,month,day,hour,minute,0))-datenum(datetime(zyear,zmonth,zday)))
            time0p[i]=timesync[i]+dt*(counter[i]-synch[i])
            for j in range (0,1500):
                t[1500*i+j]=time0p[i]+dt*j
        else:
            f.close()
            os.remove(tmp)
            return False

def datenum(d):
    mdn = d + timedelta(days = 366)
    frac = (d-datetime(d.year,d.month,d.day,0,0,0)).seconds / (24.0 * 60.0 * 60.0)
    return mdn.toordinal() + frac