;+
;NAME: SPP_SPICE_KERNELS
; function: spp_spice_kernels(name)
;PURPOSE:
; Provides maven spice kernel filename of specified type
;  
;Typical CALLING SEQUENCE:
;  kernels=mvn_spice_kernel() 
;TYPICAL USAGE:
;INPUT:
;  string must be one of:    Not implemented yet.  currently retrieves ALL files
;KEYWORDS:
; LOAD:   Set keyword to also load file
; TRANGE:  Set keyword to UT timerange to provide range of needed files. 
; RECONSTRUCT: If set, then only kernels with reconstructed data (no predicts) are returned.
;OUTPUT:
; fully qualified kernel filename(s)
; 
;WARNING: Be very careful using this routine with the /LOAD keyword. It will change the loaded SPICE kernels that users typically assume are not being changed 
;PLEASE DO NOT USE this routine within general "LOAD" routines using the LOAD keyword. "LOAD" routines should assume that SPICE kernels are already loaded.
; 
;Author: Davin Larson  - January 2014
; $LastChangedBy: ali $
; $LastChangedDate: 2017-02-14 18:29:05 -0800 (Tue, 14 Feb 2017) $
; $LastChangedRevision: 22786 $
; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu:36867/repos/spdsoft/trunk/projects/maven/general/spice/mvn_spice_kernels.pro $
;-
function spp_spice_kernels,names,trange=trange,all=all,load=load,reset=reset,verbose=verbose,source=source,valid_only=valid_only,sck=sck,clear=clear  $
  ,reconstruct=reconstruct,no_update=no_update,no_server=no_server,no_download=no_download,last_version=last_version

  ;common mvn_spice_kernels_com,   retrievetime,names_com,trange_com

  if spice_test() eq 0 then return,''
  retrievetime = systime(1)
  if n_elements(last_version) eq 0 then last_version =1

  tb = scope_traceback(/structure)
  this_dir = file_dirname(tb[n_elements(tb)-1].filename)+'/'   ; the directory this file resides in (determined at run time)

 ; filesource = spice_file_source(valid_only=valid_only,verbose=verbose,last_version=last_version)
 ; filesource.remote_data_dir = "http://sprg.ssl.berkeley.edu/data/'
 ; filesource.local_data_dir = "/cache/misc
   src = spp_file_source()
   naif = spice_file_source()
  ;all=1
  if keyword_set(sck) then names = ['STD','SCK']
  if keyword_set(all) or not keyword_set(names) then names=['STD','SCK','FRM','IK','SPK','CK','CK_APP','CK_SWE']
  if keyword_set(reset) then kernels=0
  ct = systime(1)
  ;waittime = 10.                 ; search no more often than this number of seconds
  ;if 1 || ~keyword_set(kernels) || (ct - retrievetime) gt waittime then begin
  if ~keyword_set(source) then source = src
  if keyword_set(no_download) or keyword_set(no_server) then source.no_server = 1
  dprint,dlevel=2,phelp=2,source
  kernels=''
  for i=0,n_elements(names)-1 do begin
     case strupcase(names[i]) of
;        'STD':    begin
;           append_array, kernels, spice_standard_kernels(source=source,/mars,no_update=no_update) ;  "Standard" kernels
;        end
        ;swapped out file_retrieve calls for spd_download_plus for https access, 2017-01-30, jmm
        'CSS': append_array,kernels, spd_download_plus(remote_file = source.remote_data_dir+'generic_kernels/spk/comets/siding_spring_8-19-14.bsp', $
                                                  local_path = source.local_data_dir+'generic_kernels/spk/comets/', no_update = no_update, $
                                                  last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
        'LSK': append_array,kernels, spd_download_plus(remote_file = naif.remote_data_dir+'generic_kernels/lsk/naif00??.tls', $
                                                  local_path = naif.local_data_dir+'generic_kernels/lsk/', no_update = no_update, $
                                                  last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
        'SCK': begin
;          sclk_path = 'psp/data/sci/sweap/sao/moc_data_products/operations_sclk_kernel/'
          sclk_path = 'psp/data/sci/MOC/SPP/data_products/operations_sclk_kernel/'
          append_array,kernels, spp_file_retrieve(sclk_path+'spp_sclk_????.tsc',/last)
           end                                       
        'FRM':    begin         ; Frame kernels
           if 0 then begin
              append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/fk/maven_v??.tf', $
                                                  local_path = source.local_data_dir+'MAVEN/kernels/fk/', no_update = no_update, $
                                                  last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
           endif else begin
              append_array, kernels, this_dir+'kernels/fk/maven_v09.tf'
           endelse
           append_array, kernels, this_dir+'kernels/fk/maven_misc.tf' ; Use this file to make temporary changes to the maven_v??.tf file
        end
        'IK':  begin          ; Instrument Kernels
        if 0 then begin
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_ant_v??.ti', $
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_euv_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_iuvs_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_lpw_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_mag_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_ngims_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_sep_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_static_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_swea_v??.ti',$
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
          append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ik/maven_swia_v??.ti', $
                                              local_path = source.local_data_dir+'MAVEN/kernels/ik/', no_update = no_update, $
                                              last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
        endif else begin
          append_array, kernels, this_dir+'kernels/ik/maven_ant.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_euv.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_iuvs.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_lpw.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_mag.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_ngims.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_sep_v12.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_static.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_swea.ti'
          append_array, kernels, this_dir+'kernels/ik/maven_swia.ti'
        endelse
      end
      'SPK':  begin     ; Spacecraft position
         tr= timerange(trange)  ; + [-1,1] * 3600d*24
         if (tr[1] gt time_double('2013-11-18')) && (tr[0] le time_double('2014-09-23')) then begin
            append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/spk/trj_c_131118-140923_rec_v?.bsp', $
                                                local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = no_update, $
                                                last_version = last_version, no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
         endif
;get 3 month time intervals
         ftimes = time_intervals(trange = ['2015-01-01', time_string(ct)], monthly_res = 3)
;prepend 2014-09-22, orbit insertion
         ftimes = [time_double('2014-09-22'), ftimes]
         nftimes = n_elements(ftimes)
         fstring = strmid(time_string(ftimes, tformat='YYYYMMDD'), 2)
         ffiles = 'MAVEN/kernels/spk/maven_orb_rec_'+fstring[0:nftimes-2]+'_'+fstring[1:*]+'_v?.bsp'
         for j = 0, nftimes-2 do begin
            if(tr[1] gt ftimes[j] && tr[0] le ftimes[j+1]) then begin 
               tmp_file = spd_download_plus(remote_file = source.remote_data_dir+ffiles[j], $
                                            local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = no_update, $
                                            no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
;There's a time lag (40 days or so) between the end time of a
;quarter and the appearance of the new file; so if tmp_file
;doesn't exist and j = nftimes-2, then replace it with the most recent file
               if(~keyword_set(tmp_file) && (j Eq nftimes-2)) then begin
                  if keyword_set(reconstruct) then begin
                     tmp_file = spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/spk/maven_orb_rec.bsp', $
                                                  local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = 0, $
                                                  no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
                  endif else begin
                     tmp_file = [spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/spk/maven_orb.bsp', $
                                                   local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = 0, $
                                                   no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o), $
                                 spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/spk/maven_orb_rec.bsp', $
                                                   local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = 0, $
                                                   no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)]
                  endelse
               endif
               append_array, kernels, tmp_file
            endif
         endfor
         if (tr[1] gt ftimes[nftimes-1] && tr[0] le time_double('2035-07-01')) then begin
            if keyword_set(reconstruct) then begin
               append_array,kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/spk/maven_orb_rec.bsp', $
                                                       local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = 0, $
                                                       no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
            endif else begin
               append_array,kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/spk/maven_orb.bsp',$
                                                       local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = 0, $
                                                       no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
               append_array,kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/spk/maven_orb_rec.bsp',$
                                                       local_path = source.local_data_dir+'MAVEN/kernels/spk/', no_update = 0, $
                                                       no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
            endelse
         endif
      end
      'CK':  begin              ; Spacecraft Attitude  (CK)
        tr= timerange(trange)
        ; Get the Weekly files;
        att_weekly_format = 'MAVEN/kernels/ck/mvn_sc_rel_yyMMDD_??????_v??.bc'  ; use this line to get all files in time range
        att_weekly_kern = mvn_pfp_spd_download(att_weekly_format, source=source, trange=tr, daily_names=7, shift=4, /valid_only, /last_version)
        n_weekly = n_elements(att_weekly_kern) * keyword_set(att_weekly_kern)
        if n_weekly ge 1 then begin
          str = strmid(att_weekly_kern[n_weekly-1],/reverse_offset,12,6)
          tr[0] = time_double(str,tformat='yyMMDD') + 86400    ;
        endif
        ; Get Daily files to finish off
        att_daily_format = 'MAVEN/kernels/ck/mvn_sc_red_yyMMDD_v??.bc'  ; use this line to get all files in time range
        if tr[0] lt tr[1] then att_daily_kern = mvn_pfp_spd_download(att_daily_format, source=source, trange=tr, /valid_only, /daily_names, /last_version)
        n_daily = n_elements(att_daily_kern) * keyword_set(att_daily_kern)
        if n_daily ge 1 then begin
          str = strmid(att_daily_kern[n_daily-1],/reverse_offset,12,6)
          tr[0] = time_double(str,tformat='yyMMDD') + 86400+1   ;
        endif
        ; Daily quick files for most recent stuff
        if ~keyword_set(reconstruct) && (tr[0] le tr[1]) then begin
          att_quick_format = 'MAVEN/kernels/ck/mvn_sc_rec_yyMMDD_??????_v??.bc'  ; use this line to get all files in time range
          att_quick_kern = mvn_pfp_spd_download(att_quick_format, source=source, trange=tr, /daily_names, /last_version)    ;SC Attitude ???
        endif
        if keyword_set(att_quick_kern) then append_array, kernels, att_quick_kern
        if keyword_set(att_daily_kern) then append_array, kernels, att_daily_kern
        if keyword_set(att_weekly_kern) then append_array, kernels, att_weekly_kern
      end
      'CK_APP':  begin    ; APP Attitude (CK files)
        tr= timerange(trange)
        ; Start with the Weekly files;
        app_weekly_format = 'MAVEN/kernels/ck/mvn_app_rel_yyMMDD_??????_v??.bc'  ; use this line to get all files in time range
        app_weekly_kern = mvn_pfp_spd_download(app_weekly_format, source=source, trange=tr,daily_names=7,shift=4,/valid_only,/last_version)
        n_weekly = n_elements(app_weekly_kern) * keyword_set(app_weekly_kern)
        if n_weekly ge 1 then begin
          str = strmid(app_weekly_kern[n_weekly-1],/reverse_offset,12,6)
          tr[0] = time_double(str,tformat='yyMMDD') + 86400    ;
        endif
        ; Get Daily files to finish off
        app_daily_format = 'MAVEN/kernels/ck/mvn_app_red_yyMMDD_v??.bc'  ; use this line to get all files in time range
        if tr[0] lt tr[1] then app_daily_kern = mvn_pfp_spd_download(app_daily_format, source=source, trange=tr,/daily_names,/valid_only,/last_version)
        n_daily = n_elements(app_daily_kern) * keyword_set(app_daily_kern)
        if n_daily ge 1 then begin
          str = strmid(app_daily_kern[n_daily-1],/reverse_offset,12,6)
          tr[0] = time_double(str,tformat='yyMMDD') + 86400+1   ;
        endif
        ; Daily quick files for most recent stuff
        if ~keyword_set(reconstruct) && (tr[0] le tr[1]) then begin
          app_quick_format = 'MAVEN/kernels/ck/mvn_app_rec_yyMMDD_??????_v??.bc'  ; use this line to get all files in time range
          app_quick_kern = mvn_pfp_spd_download(app_quick_format, source=source, trange=tr+[-2,0]*86400L,/daily_names,/valid_only,/last_version)    ;SC Attitude ???
        endif
        if tr[1] lt time_double('14-10-9') then append_array,kernels, $
           spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/misc/app/mvn_app_nom_131118_141031_v1.bc', $
                             local_path = source.local_data_dir+'MAVEN/misc/app/', no_update = 0, $
                             no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
        if keyword_set(app_quick_kern) then append_array,kernels, app_quick_kern
        if keyword_set(app_daily_kern) then append_array,kernels, app_daily_kern
        if keyword_set(app_weekly_kern) then append_array,kernels, app_weekly_kern
        ;
        ;       tr= timerange(trange)
        ;
        ;
        ;       appformat = 'MAVEN/kernels/ck/mvn_app_rec_yyMMDD_*_v0?.bc'  ; use this line to get all files in time range
        ;       appkern = mvn_pfp_spd_download(appformat, source=source, trange=tr+[-2,1]*86400L,daily_names=1)   ;APP Attitude ???
        ;       append_array,kernels,  appkern  ;APP Attitude ???

      end
      'CK_SWE': append_array, kernels, spd_download_plus(remote_file = source.remote_data_dir+'MAVEN/kernels/ck/mvn_swea_nom_131118_300101_v??.bc',  $
                                                         local_path = source.local_data_dir+'MAVEN/kernels/ck/',no_update = 0, $
                                                         no_server = source.no_server, file_mode = '666'o, dir_mode = '777'o)
    endcase
  endfor
  ;    retrievetime = ct
  ;   kernels = file_search(kernels)
  ;endif

; Is the following code needed?  It converts linux forward slashes to windows backslashes.
;
;  if (strupcase(!version.os_family) eq 'WINDOWS') then begin
;    nker = n_elements(kernels)
;    for i=0,(nker-1) do $
;      kernels[i] = strjoin(strsplit(kernels[i], '/', /regex, /extract, /preserve_null), '\')
;  endif

  if keyword_set(clear) then cspice_kclear
  if keyword_set(load) then spice_kernel_load, kernels

  dprint,dlevel=2,verbose=verbose,'Time to retrieve SPICE kernels: '+strtrim(systime(1)-retrievetime,2)+ ' seconds'
  return,kernels

end