#!/usr/bin/env python3
#################################################################################
# Create/update movie with new incoming files
# See settings in def do_movie()
#         Hilversum, 2022/09/20       License GPL3          (c) Rob Alblas
#################################################################################
# Needed: (use pip3 if you don't use it under conda)
# conda install watchdog
# conda install -c fastai opencv-python-headless
#################################################################################

from fnmatch import fnmatch
from movie_funcs import make_movie,extend_movie
import os,time
from glob import glob
from os.path import expanduser

# Choose path to incoming data
home=expanduser("~")
path_to_data=home+''

#Choose which type of MSG data: eumetcast (114 or native
# sat_or_type=RSS or IODC or FULL or MSG1/2/3/4
# area=''     : default (defined in MSGx.py)
# composite='': default (defined in MSGx.py)
# mfn=movie filename
# maxnrfrm: max. nr of frames, 0=unlimited
#   if reached: one frame at start is removed and one is added at the end
# dry=True: no processing, just show what would happen
def do_movie(pfn):
  sat_or_type='IODC'
  area='euro1'
  composite=''
  mfn='movie.avi'
  maxnrfrm=0
  dry=False
#  do_movie_msg_native(pfn,mfn,sat_or_type,area,composite,maxnrfrm,dry)
  do_movie_msg_ecast_any(pfn,mfn,sat_or_type,area,composite,maxnrfrm,dry)

# from here no need to adapt
###################################################33
# create/extend Movie using MSG
# filenames like:
#   MSG4-SEVI-MSG15-0100-NA-20221025125742.514000000Z-NA.zip
#   MSG3-SEVI-MSG15-0100-NA-20221108083918.904000000Z-NA.zip
#   H-000-MSG4__-MSG4________-VIS008___-000006___-201912121200-C_
#   H-000-MSG3__-MSG3_RSS____-VIS008___-000022___-201912121200-C_
#
def do_movie_msg_ecast_any(pfn,mfn,sat_or_type,area,composite,maxnrfrm=0,dry=False):
  if sat_or_type=='RSS':
    satpat='H-000-*_RSS____*'
    nrfiles=44
  elif sat_or_type=='IODC':
    satpat='H-000-*_IODC___*'
    nrfiles=114
  elif sat_or_type=='MSG1' or sat_or_type=='MSG2' or sat_or_type=='MSG3' or sat_or_type=='MSG4':
    satpat='H-000-'+str(sat_or_type)+'*'
    nrfiles=114
  else:
    satpat='H-000-*________*'
    nrfiles=114
  do_movie_msg_ecast(pfn,mfn,satpat,nrfiles,area,composite,maxnrfrm,dry)

# wait until filesize doesn't grow
def wait_until_stable(fn):
  len1=0
  st = os.stat(fn)
  len2=st.st_size
  while (len1 != len2):
    time.sleep(1)
    len1=len2
    st = os.stat(fn)
    len2=st.st_size

# test if all MSG files of one data/time are available
def all_msg(satpat,t_opt,pd,nrfiles):
  pat=pd+'/'+satpat+t_opt+'*'
  fns=glob(pat)
  nrfn=len(fns)
  if nrfn==nrfiles:
    return True
  else:
    return False

# generate/extend movie using Eumetcast-files
(s_opt_done,t_opt_done)=('','')
def do_movie_msg_ecast(pfn,mfn,satpat,nrfiles,area,composite,maxnrfrm=0,dry=False):
  global s_opt_done,t_opt_done
  jpg_file='tmp.jpg'
  if area!='':
    areaopt='-area '+area
  else:
    areaopt=''
  if composite!='':
    compositeopt='-composite '+composite
  else:
    compositeopt=''

  fn=os.path.basename(pfn)
  pd=os.path.dirname(pfn)
  if fnmatch(fn, satpat):
    s_opt=fn[9]
    t_opt=fn[46:58]
    if all_msg(satpat,t_opt,pd,nrfiles):
      print(fn)
      wait_until_stable(pfn)    # needed to make sure file is fully received
      if (s_opt_done,t_opt_done) != (s_opt,t_opt):
        (s_opt_done,t_opt_done)=(s_opt,t_opt)
        print('Add to movie: '+fn)
        cmd='MSGx.py -sat '+s_opt+' -t '+t_opt+' '+areaopt+' '+compositeopt+' -src '+pd+' -dst . -o '+jpg_file
        if dry:
          print('Dry, would do '+cmd)
        else:
          os.system(cmd)
          extend_movie(mfn,jpg_file,mfn,maxnrfrm=maxnrfrm)
        print('Ready.')
      else:
        print('skip '+str(t_opt))

# generate/extend movie using Eumetsat Data Store files (native format)
def do_movie_msg_native(pfn,mfn,sat,area,composite,maxnrfrm=0,dry=False):
  satpat=sat+'*zip'
  jpg_file='tmp.jpg'
  if area!='':
    areaopt='-area '+area
  else:
    areaopt=''
  if composite!='':
    compositeopt='-composite '+composite
  else:
    compositeopt=''

  fn=os.path.basename(pfn)
  pd=os.path.dirname(pfn)
  if fnmatch(fn, satpat):
    print('Add to movie: '+fn)
    s_opt=fn[3]
    t_opt=fn[24:36]

    wait_until_stable(pfn)    # needed to make sure file is fully received
    cmd='MSGx.py -sat '+s_opt+' -t '+t_opt+' '+areaopt+' '+compositeopt+' -nat -src '+pd+' -dst . -o '+jpg_file
    if dry:
      print('Dry, would do '+cmd)
    else:
      os.system(cmd)
      extend_movie(mfn,jpg_file,mfn,maxnrfrm)
    print('Ready.')

################################################################
# Wait for new files in <path_to_data>, then run do_movie()
# Runs 'forever', until ctrl-C
#
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
  def on_created(self, event):
    do_movie(event.src_path)

event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path=path_to_data, recursive=False)
observer.start()
print('Observe location: ' + path_to_data)

while True:
  try:
    time.sleep(10)
    pass
  except KeyboardInterrupt:
    observer.stop()
    quit()
