#!/usr/bin/python3
#######################################################################
# Create a movie
# New available frames added at each run 
#######################################################################
#Python standard needs
from os.path import expanduser
import os
from datetime import datetime
import time
import argparse

#EDS needs
import eds_defs
import eds_funcs
import eds_process

#Set message level: 0=quiet, 1=errors only, 2: warnings, >2: messages
eds_defs.verbose_level=1

# Do dryrun (don't download/process)
#eds_defs.dry=True

#locations for downloaded zip- and unzipped files; needs different locations
home=expanduser("~")
eds_defs.path_download=home+'/data/native/zipped'
eds_defs.path_unzipped=home+'/data/native/unzipped'

# example ramdisk
#eds_defs.path_download='/ramdisk/zipped'
#eds_defs.path_unzipped='/ramdisk/unzipped'

#Create download-path, unzipped will be created auto.
try:
  os.makedirs(eds_defs.path_download)
except:
  None

# Key file
eds_defs.keys_file='eds.key'

# use_list=True: use list defined in eds_funcs.py
use_list=False
# otherwise read product from file:
prodfile="eds.prd"

sel_nr=1

#get latest of current day
def run_make_movie(selected_id,fno):
  # Define all-dat time period
  tm=time.gmtime()
  start_date = datetime(tm.tm_year,tm.tm_mon, tm.tm_mday,0,0)
  end_date = datetime(tm.tm_year,tm.tm_mon, tm.tm_mday,23,59)

  # Create list of files to download; take 'nr_download' last items of available
  nr_download=8
  product_list=eds_funcs.create_list(selected_id,start_date,end_date,nr_download)
  collection_id=selected_id.replace(":","%3A")
  if product_list:
    # Clean-up: remove all previously downloaded files not in current list
    eds_funcs.remove_not_in_dataset(product_list)
    access_token = eds_funcs.get_token()
    
    # go through list in reversed order (oldest first)
    for product_id in reversed(product_list):
      # Download product if not done yet
      if (not eds_funcs.download_zipped_product(collection_id,product_id,access_token)):
        # New downloaded file; process it
        if (eds_defs.dry):
          eds_funcs.message("Dry flag set; no processing done on " + product_id+".nat",2)
        else:
          eds_process.process_file(eds_defs.path_unzipped,product_id+".nat",fno)

        # ready processing; remove raw file
        pufn=eds_defs.path_unzipped + "/" +  product_id + ".nat"
        if os.path.isfile(pufn):
          if (eds_defs.dry):
            eds_funcs.message("dry flag set; Would remove " + pufn,2)
          else:
            eds_funcs.message("Remove " + pufn,3)
            os.remove(pufn)
  else:
    cur_date = datetime(tm.tm_year,tm.tm_mon, tm.tm_mday,tm.tm_hour,tm.tm_min)
    dtstr=cur_date.strftime("%y-%m-%d_%H:%M")
    eds_funcs.message(dtstr+": Product " + selected_id + " doesn't exist.",1)

###########################################################################
#
parser = argparse.ArgumentParser('eds_make_movie')
parser.add_argument('-dry',default=eds_defs.dry, action='store_true', help="just show what will be done")
parser.add_argument('-verbose',default=eds_defs.verbose_level,  help="0=quiet, 1=errors, 2=+warnings, >2=+info")
if use_list:
  parser.add_argument('-nprod',default=sel_nr,                  help="Select product from fixed list")
else:
  parser.add_argument('-nprod',default=sel_nr,                  help="Select product from "+prodfile+" (line nr.)")
parser.add_argument('-product',                                 help="define product name")
parser.add_argument('-list'   ,default='', action='store_true', help="list products")

args = parser.parse_args()

eds_defs.dry=args.dry
eds_defs.verbose_level=int(args.verbose)
sel_nr=args.nprod
list_prod=args.list
fno='msg'+str(sel_nr)+'.avi'
#fno=''

if list_prod:
  eds_funcs.list_products(prodfile,use_list)
  quit()

if (args.product!=None):
  selected_item=args.product
  print('From options: ' + selected_item)
else:
  selected_item = eds_funcs.get_product(prodfile,int(sel_nr),use_list)

eds_funcs.message("#################################################",3)
eds_funcs.message("dry=" + str(eds_defs.dry),3)
eds_funcs.message("verbose_level=" + str(eds_defs.verbose_level),3)
eds_funcs.message("selnr=" + str(sel_nr),3)
eds_funcs.message("selected_item=" + str(selected_item),3)
eds_funcs.message("#################################################",3)


run_make_movie(selected_item,fno)

