# -*- coding: utf-8 -*-

import sys,os
import glob
from datetime import datetime,timedelta

class batch_process_class:
    def __init__(self,year,doy,work_dir,input_dir,output_dir,check_leoid):
        self.year,self.doy,self.work_dir,self.input_dir,self.output_dir=year,doy,work_dir,input_dir,output_dir
        self.check_leoid=check_leoid

        self.opnGns_output=os.path.join(self.output_dir,'opnGns',self.year,self.doy)
        self.podCrx_output=os.path.join(self.output_dir,'podCrx',self.year,self.doy)
        self.scnRaw_output=os.path.join(self.output_dir,'scnRaw',self.year,self.doy)
        self.opnScn_output=os.path.join(self.output_dir,'opnScn',self.year,self.doy)
        self.goxSOH_output=os.path.join(self.output_dir,'goxSOH',self.year,self.doy)

        os.makedirs(self.opnGns_output, exist_ok=True)
        os.makedirs(self.podCrx_output, exist_ok=True)
        os.makedirs(self.scnRaw_output, exist_ok=True)
        os.makedirs(self.opnScn_output, exist_ok=True)
        os.makedirs(self.goxSOH_output, exist_ok=True)

    def sort_key(self,fname):
        base=os.path.basename(fname)
        gps=base.split('.')
        hr,minute,leoid=int(gps[2]),int(gps[3]),int(gps[4])
        return (hr,minute,leoid)

    def decode_L0_L1A(self):
        # only check LEO001 or *all
        #check_leoid='001'
        if self.check_leoid=='all':
            fnames=glob.glob(os.path.join(input_dir,'trgLv0_'+year+'.'+doy+'.*.*.*.*_tlm.gz'))
        else:
            fnames=glob.glob(os.path.join(input_dir,'trgLv0_'+year+'.'+doy+'.*.*.'+self.check_leoid+'.*_tlm.gz'))
        #fnames=glob.glob(os.path.join(input_dir,'trgLv0_'+year+'.'+doy+'.*.*.'+check_leoid+'.*_tlm.gz'))
        #print(fnames)
        #sys.exit()

        if len(fnames)==0:
            print('No L0 files available, pls check!')
            sys.exit()

        fnames_sorted=sorted(fnames,key=self.sort_key)
        
        
        for ifile,fname in enumerate(fnames_sorted):
            #if ifile>0: return
            print(fname,'=================================')
            gps=os.path.basename(fname).split('.')
            hr,minute,leoid,groundstation=gps[2],gps[3],gps[4],gps[5].split('_')[0]
    
            command=f'/usr/bin/perl {self.work_dir}/trigZero2one_star.pl \
                                    {fname} \
                                    {self.opnGns_output}\
                                    {self.podCrx_output}\
                                    {self.scnRaw_output}\
                                    {self.opnScn_output}\
                                    {self.goxSOH_output}'
            os.system(command)
            #sys.exit()


    def L1A_bin_ascii(self):
        #process_folders=[self.opnGns_output,self.opnScn_output]
        #process_tabs=['bin','rnx']

        process_folders=[self.opnGns_output]
        #process_folders=[self.opnScn_output]
        process_tabs=['bin']

        # for ucar l1A => ascii------------------
        #self.opnGns_output='/data3/jzhou128/GNSSRO_Archive/COSMIC2_L0_to_L1A/ucar_l1a/2025/350/'
        #process_folders=[self.opnGns_output]
        #process_tabs=['bin']
        # --------------------------------------

        for (folder,tab) in zip(process_folders,process_tabs):
            folder_ascii=os.path.join(folder,'ascii')
            os.makedirs(folder_ascii, exist_ok=True)
            fnames=glob.glob(os.path.join(folder,'*'+tab))
            #print(os.path.join(folder,'*'+tab))
            #print(fnames)
            if len(fnames)==0:
                continue

            for fname in fnames:
                outfile=os.path.join(folder_ascii,os.path.basename(fname).replace(tab,'txt'))
                print(outfile)

                command=f'/usr/bin/perl {self.work_dir}/dump_opnGns_external_Tom.pl {fname} > {outfile}'
                os.system(command)

    def L1A_bin_ascii_ucar(self):
        #process_folders=[self.opnGns_output,self.opnScn_output]
        #process_tabs=['bin','rnx']
        ucar_dir='/GNSSRO_data2/xinjiaz/data_GPSRO/UCAR/cosmic2/level1a/opnGns/2026/060/'
        process_folders=[ucar_dir]
        #process_folders=[self.opnScn_output]
        process_tabs=['bin']
        output_dir='/data3/jzhou128/GNSSRO_Archive/COSMIC2_L0_to_L1A/ucar_l1a/2026/060/'

        # --------------------------------------

        for (folder,tab) in zip(process_folders,process_tabs):
            folder_ascii=os.path.join(output_dir,'ascii')
            os.makedirs(folder_ascii, exist_ok=True)
            fnames=glob.glob(os.path.join(folder,'*'+tab))
            #print(os.path.join(folder,'*'+tab))
            #print(fnames)
            if len(fnames)==0:
                continue

            for fname in fnames:
                outfile=os.path.join(folder_ascii,os.path.basename(fname).replace(tab,'txt'))
                print(outfile)

                command=f'/usr/bin/perl {self.work_dir}/dump_opnGns_external_Tom.pl {fname} > {outfile}'
                os.system(command)
                


msg="""command to process current day:         python kick_trigZero2one_star.py 0
       command to process yesterday:           python kick_trigZero2one_star.py -1
       command to process n days before today: python kick_trigZero2one_star.py -n

       by default: process all LEOs, you can also specify which LEO satellite you would like to process for a specific day:
       command to process a specified day for one LEO:     python kick_trigZero2one_star.py 1 2025-12-16 002
       """


if len(sys.argv)==2:
    year=(datetime.now()+timedelta(days=int(sys.argv[1]))).strftime("%Y")
    doy=(datetime.now()+timedelta(days=int(sys.argv[1]))).strftime("%j") # certain days before
    check_leoid='all'
elif len(sys.argv)==3:
    year,mm,day=sys.argv[2].split('-')
    doy=datetime(int(year),int(mm),int(day)).strftime("%j")
    check_leoid='all'
elif len(sys.argv)==4:
    #python kick_trigZero2one_star.py 1 2025-12-16 002
    year,mm,day=sys.argv[2].split('-')
    doy=datetime(int(year),int(mm),int(day)).strftime("%j")
    check_leoid=sys.argv[3]
else:
    print('input arguments are incorrect, pls check!')
    print(msg)
    sys.exit()

print(year,doy)

#path='/data3/jzhou128/GNSSRO_Archive/COSMIC2_L0_to_L1A/'
#work_dir=os.path.join(path,'star_cosmic_GOX_TRIG_reader_1.24')
work_dir=os.path.join('/data3/xinjiaz/gps_pod/TRIG_reader/','star_cosmic_GOX_TRIG_reader_1.26')

ucar_l0='/GNSSRO_data2/xinjiaz/data_GPSRO/UCAR/cosmic2/level0/trgLv0/'
#ucar_l0='/GNSSRO_data2/xinjiaz/data_GPSRO/TACC/level0/trgLv0/'
input_dir=os.path.join(ucar_l0,year,doy)                    

#output_dir=os.path.join(path,'output_EGR_SVN_HROFFSET_Edt0p0049156_opnScntf_POD1EformatRE5b_LEO'+check_leoid,'cosmic2','level1a')
output_dir=os.path.join('/data3/xinjiaz/data_GPSRO/','UCAR_unpack_STAR','cosmic2','v1.26','level1a')

batch_process_obj=batch_process_class(year,doy,work_dir,input_dir,output_dir,check_leoid)
batch_process_obj.decode_L0_L1A()
#batch_process_obj.L1A_bin_ascii()
#batch_process_obj.L1A_bin_ascii_ucar()


