#! /bin/bash

set -eo pipefail

main() {
   local nonrecent_unix="$(($(_date +%s) - 10 * 60))" # 10m ago
   local nonrecent_ts="$(_date -d @$nonrecent_unix -u +%Y-%m-%d_%H-%M-%S)"

   for recording in $(
      api "/api/recording/query?recording-id=9999-12-28_23-59-59_x&limit=10000&reverse=false&include-data=false" \
      | jq -r .[].id \
      | sort
   ); do
      if [[ "$recording" > "$nonrecent_ts" ]]; then
         echo "$ts > $nonrecent_ts, so skipping"
         continue
      fi

      if grep "^$recording$" ${SENTRYSHOT_DIR:-/tmp}/movement_detection_via_api_ffmpeg.sh.txt; then
         continue
      fi

      echo recording=$recording >&2
      api "/api/recording/video/$recording" > /tmp/movement_detection_via_api_ffmpeg.sh.mp4

      if video_has_movement; then
         echo "$recording" >> ${SENTRYSHOT_DIR:-/tmp}/movement_detection_via_api_ffmpeg.sh.txt
      else
         echo no movement in "$recording"
         api "/api/recording/delete/$recording" \
            -X DELETE
      fi
   done

   local too_old_unix="$(($(_date +%s) - 30 * 24 * 60 * 60))" # 30d ago
   local too_old_ts="$(_date -d @$too_old_unix -u +%Y-%m-%d_%H-%M-%S)"
   for recording in $(
      api "/api/recording/query?recording-id=${too_old_ts}_x&limit=10000&reverse=false&include-data=false" \
      | jq -r .[].id \
      | sort
   ); do
      echo "$recording is too old"
      echo api "/api/recording/delete/$recording" \
         -X DELETE
   done
}

video_has_movement() {
   local fps=$(_ffprobe -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 2>&1 | grep -o '[0-9]*\.*[0-9]* fps' | head -n 1 | awk '{print $1}')
   local inspection="$(_ffmpeg -i /tmp/movement_detection_via_api_ffmpeg.sh.mp4 -vf 'select=not(mod(n\,'${fps%.*}')),select=gte(scene\,0),metadata=print:file=-' -an -f null - 2> /dev/null | paste - -)"
   local scores=($(echo "$inspection" | awk '{print $NF}' | sed 's/.*=//'))

   local flattened_scores=()
   for i in $(seq 1 ${#scores[@]}); do
      flattened_scores+=($(echo ${scores[@]:i-2:3} | tr ' ' '\n' | sort -n | head -n 2 | tail -n 1))
   done

   local threshold=1
   local last_n=(${flattened_scores[@]:0:7})
   for i in $(seq 1 ${#flattened_scores[@]}); do
      last_n[$(( (i-1)%7 ))]=${flattened_scores[$((i-1))]}
      max_of_last_n=$(echo "${last_n[@]}" | tr ' ' '\n' | sort | tail -n 1)
      if [[ "$max_of_last_n" < "$threshold" ]]; then
         threshold="$max_of_last_n"
      fi
   done
   threshold="$(_perl -e "print $threshold + 0.01")"

   local has_change=false
   if [ "${#flattened_scores[@]}" -lt 10 ]; then
      echo too short >&2
      has_change=true
   else
      local max_flattened_score=$(echo "${flattened_scores[@]:5:${#flattened_scores[@]}-10}" | tr ' ' '\n' | sort -n | tail -n 1)
      echo "has movement? $max_flattened_score > $threshold" >&2
      if awk "BEGIN { exit !($max_flattened_score > $threshold)}"; then
         has_change=true
      fi
   fi

   $has_change
}

api() {
   local path="$1"
   shift
   curl -sS "${CAMS_URL:-http://192.168.0.86:29898}/${path#/}" "$@"
}

_date() {
   if which gdate &> /dev/null; then
      gdate "$@"
   else
      date "$@"
   fi
}

_perl() {
   if which perl &> /dev/null; then
      perl "$@"
   else
      /var/services/homes/squeaky2x3/.nix-profile/bin/perl "$@"
   fi
}

_ffprobe() {
   if which ffprobe &> /dev/null; then
      ffprobe "$@"
   else
      /volume1/homes/squeaky2x3/ffmpeg-local/ffprobe "$@"
   fi
}

_ffmpeg() {
   if which ffmpeg &> /dev/null; then
      ffmpeg "$@"
   else
      /volume1/homes/squeaky2x3/ffmpeg-local/ffmpeg "$@"
   fi
}

main "$@"
