#!/bin/bash -
#===============================================================================
#
#         FILE: snapshot_metadata
#
#        USAGE: ./snapshot_metadata episode_number
#
#  DESCRIPTION: Collects JSON metadata from the IA for a given show and stores
#               it in the cache. Runs 'view_derivatives' on the JSON to
#               display the derivatives if any, and to save their names if
#               found, for deletion.
#               Deletion is performed thus (external to this script):
#
#               cat assets/hpr$(./next_repair)/derived.lis | xargs ia delete hpr$(./next_repair) --no-backup
#
#      OPTIONS: ---
# REQUIREMENTS: ---
#         BUGS: ---
#        NOTES: ---
#       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
#      VERSION: 0.0.3
#      CREATED: 2024-08-16 20:36:51
#     REVISION: 2024-10-02 17:40:13
#
#===============================================================================

set -o nounset                              # Treat unset variables as an error

VERSION="0.0.3"

SCRIPT=${0##*/}
# DIR=${0%/*}

STDOUT="/dev/fd/2"

#
# Select the appropriate working directory for the host
#
case $(hostname) in
    i7-desktop)
        BASEDIR="$HOME/HPR/InternetArchive"
        ;;
    borg)
        BASEDIR="$HOME/IA"
        ;;
    *)
        echo "Wrong host!"
        exit 1
        ;;
esac

cd "$BASEDIR" || { echo "Failed to cd to $BASEDIR"; exit 1; }

#
# Load library functions
#
LIB="$HOME/HPR/function_lib.sh"
[ -e "$LIB" ] || { echo "Unable to source functions"; exit; }
# shellcheck disable=SC1090
source "$LIB"

#
# Enable coloured messages
#
define_colours

#
# Sanity checks
#
IA=$(command -v ia)
[ -n "$IA" ] || { echo "Program 'ia' was not found"; exit 1; }
VIEWD="$BASEDIR/view_derivatives"
[ -e "$VIEWD" ] || { echo "Program '$VIEWD' was not found"; exit 1; }

# {{{ -- Functions -- _usage

#===  FUNCTION  ================================================================
#         NAME: make_dir
#  DESCRIPTION: Make a directory if it doesn't exist, failing gracefully on
#               errors.
#   PARAMETERS: $1      directory path
#      RETURNS: True if success, otherwise exits the caller script
#===============================================================================
make_dir () {
    local dir="${1}"

    if [[ ! -d $dir ]]; then
        mkdir -p "$dir" || {
            coloured 'red' "Failed to create $dir"
            exit 1
        }
    fi
}

#===  FUNCTION  ================================================================
#         NAME: _usage
#  DESCRIPTION: Reports usage; always exits the script after doing so
#   PARAMETERS: 1 - the integer to pass to the 'exit' command
#      RETURNS: Nothing
#===============================================================================
_usage () {
    local -i result=${1:-0}

    cat >$STDOUT <<-endusage
${SCRIPT} - version: ${VERSION}

Usage: ./${SCRIPT} showid

Collects notes for a show and adds them to the cache directory

Arguments:
    showid              The show id in the form 'hpr1234'

endusage
    exit "$result"
}

# }}}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#-------------------------------------------------------------------------------
# Argument check
#-------------------------------------------------------------------------------
# Should have one argument
#
if [[ $# != 1 ]]; then
    coloured 'red' "Missing argument"
    _usage 1
fi
show="${1,,}"

#
# Ensure show id is correctly formatted. We want it to be 'hpr1234' but we
# allow the 'hpr' bit to be omitted, as well as any leading zeroes. We need to
# handle the weirdness of "leading zero means octal" though, but we always
# store it as 'hpr1234' once processed.
#
if [[ $show =~ (hpr)?([0-9]+) ]]; then
    printf -v show 'hpr%04d' "$((10#${BASH_REMATCH[2]}))"
else
    coloured 'red' "Incorrect show specification: $show"
    coloured 'yellow' "Use 'hpr9999' or '9999' format"
    exit 1
fi

#-------------------------------------------------------------------------------
# Setting up paths
#-------------------------------------------------------------------------------
#
# CACHEDIR is where we store asset details and files
#
CACHEDIR="$BASEDIR/assets"
[ ! -d "$CACHEDIR" ] && {
    coloured 'red' "Creating cache directory"
    make_dir "$CACHEDIR"
}

#
# Pointers into the cache:
# LOCAL_ASSETDIR  - where the cache for this show lives
#
LOCAL_ASSETDIR="$CACHEDIR/${show}"
[ ! -d "$LOCAL_ASSETDIR" ] && {
    coloured 'green' "Creating cache directory for $show"
    make_dir "$LOCAL_ASSETDIR"
}

METADATA="$CACHEDIR/$show/metadata.json"
DERIVED="$CACHEDIR/$show/derived.lis"

#-------------------------------------------------------------------------------
# Save the IA metadata unless we already have the file
#-------------------------------------------------------------------------------
if [[ ! -e $METADATA ]]; then
    if ia metadata "$show" > "$METADATA"; then
        coloured 'green' "Created metadata file"
        if [[ ! -s $METADATA ]]; then
            coloured 'red' "Metadata file is empty"
        fi
    else
        coloured 'red' "Creation of metadata file failed"
        exit 1
    fi
else
    coloured 'yellow' "Metadata already exists, not replacing it"
fi

#-------------------------------------------------------------------------------
# Use the collected metadata to view the state of the IA, and collect the derived file names
#-------------------------------------------------------------------------------
coloured 'blue' "Viewing IA files"
"$VIEWD" -verb "$METADATA"

if "$VIEWD" -list "$METADATA" > "$DERIVED"; then
    nfiles="$(wc -l < "$DERIVED")"
    coloured 'green' "Saved 'derived' files for show $show ($nfiles)"
else
    coloured 'red' "Creation of $DERIVED file failed"
fi

exit

# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21:fdm=marker