#!/bin/bash -
#===============================================================================
#
#         FILE: do_state_change
#
#        USAGE: ./do_state_change [-h] [-D] [-m] [-s] [-Y] <epno>
#
#  DESCRIPTION: Script to be invoked via symlinks to perform related tasks
#               relating to show states.
#
#               - When called as 'do_reserve' toggles a '.reserved' marker.
#               - When called as 'do_block' creates the directory if necessary
#                 and makes a dummy 'shownotes.json' as well as a file called
#                 '.dummy'. Doesn't delete any of this since other software
#                 will tidy things.
#
#      OPTIONS: ---
# REQUIREMENTS: ---
#         BUGS: ---
#        NOTES: ---
#       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
#      VERSION: 0.0.6
#      CREATED: 2021-06-05 22:04:26
#     REVISION: 2024-02-06 15:36:02
#
#===============================================================================

set -o nounset                              # Treat unset variables as an error

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

# shellcheck disable=SC2034
VERSION="0.0.6"

STDOUT="/dev/fd/2"

#
# Load library functions
#
LIB="$HOME/bin/function_lib.sh"
[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
# shellcheck source=/home/cendjm/bin/function_lib.sh
source "$LIB"

#
# Colour codes
#
define_colours

#===  FUNCTION  ================================================================
#         NAME: _usage
#  DESCRIPTION: Report usage
#   PARAMETERS: None
#      RETURNS: Nothing
#===============================================================================
_usage () {
    cat >$STDOUT <<-endusage
Usage: ./${SCRIPT} [-h] [-D] [-m] [-s] [-Y] shownumber

Version: $VERSION

Script to be invoked via symlinks to perform related tasks relating to show states

Options:
  -h                    Print this help
  -D                    Run in debug mode where a lot more information is
                        reported
  -m                    Monochrome mode - no colours
  -s                    Silent mode, output less text about actions
  -Y                    Assume 'Yes' in answer to the prompt

Arguments:
    shownumber

Examples
  ./${SCRIPT} -h
  ./${SCRIPT} -m 3112
  ./${SCRIPT} -D 3112
  ./${SCRIPT} 3112
  ./${SCRIPT} -Y 3112

endusage
    exit
}

#===  FUNCTION  ================================================================
#         NAME: exists
#  DESCRIPTION: Determines wheher all paths given as arguments exist
#   PARAMETERS: List of paths
#      RETURNS: True if they all exist, otherwise false
#===============================================================================
exists () {

    for path in "$@"; do
        if [[ ! -e $path ]]; then
            return 1
        fi
    done

    return
}

#===  FUNCTION  ================================================================
#         NAME: _DEBUG
#  DESCRIPTION: Writes one or more messages if in DEBUG mode. Each argument is
#               seen as a message and is written on a separate line.
#               References the global variable 'DEBUG' which is expected to be
#               True if debug output is wanted.
#   PARAMETERS: List of messages
#      RETURNS: Nothing
#===============================================================================
_DEBUG () {
    [ "$DEBUG" == 0 ] && return
    for msg in "$@"; do
        printf 'D> %s\n' "$msg"
    done
}

#===  FUNCTION  ================================================================
#         NAME: _verbose
#  DESCRIPTION: Writes a message in verbose mode
#   PARAMETERS: $1      message
#      RETURNS: Nothing
#===============================================================================
_verbose () {
    [ "$VERBOSE" -eq 0 ] && return
    for msg in "$@"; do
        printf '%s\n' "$msg"
    done
}

#===  FUNCTION  ================================================================
#         NAME: _silent
#  DESCRIPTION: Writes a message unless in silent mode
#   PARAMETERS: $1      message
#      RETURNS: Nothing
#===============================================================================
_silent () {
    [ "$SILENT" -eq 1 ] && return
    for msg in "$@"; do
        printf '%s\n' "$msg"
    done
}

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

#
# Paths to files
#
BASENAME="$HOME/HPR/Show_Submission"
TPL="$BASENAME/shownotes/hpr%d/%s"

#
# Option defaults
#
COLOUR=1 # use colours by default
YES=0    # prompt for yes/no by default
TOGGLE=0 # marker can't be removed by default

#
# Process options
#
while getopts :hDmsY opt
do
    case "${opt}" in
        h) _usage;;
        D) DEBUG=1;;
        m) COLOUR=0;;
        s) SILENT=1;;
        Y) YES=1;;
        ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;;
    esac
done
shift $((OPTIND - 1))

DEBUG=${DEBUG:-0}
SILENT=${SILENT:-0}

#
# Cancel colours if requested
#
if [[ $COLOUR -eq 0 ]]; then
    undefine_colours
fi

#
# Determine actions depending on how the script was called. Save filenames in
# an array.
#
declare -a MK MFILES
case "${SCRIPT#*/}" in
    do_reserve)
        MK+=('.reserved')
        state='reserved'
        TOGGLE=1
        ;;
    do_block)
        echo "Blocking of pending shows is not needed any more."
        echo "See Journal for details (2024-02-06)"
        exit
#         MK+=('shownotes.json')
#         MK+=('.dummy')
#         state='blocked'
#         TOGGLE=0
        ;;
    *)
        echo "Don't call this script directly; use one of its soft links"
        echo "D> $0 $*"
        exit 1
        ;;
esac

#
# Check the argument after any options
#
if [[ $# -ne 1 ]]; then
    echo "$SCRIPT: ${red}Usage: $SCRIPT shownumber${reset}"
    exit
fi
show="$1"

#
# I used 'hpr4065' by mistake today, so we need to check the show specification
#
if [[ $show =~ ^(hpr)?([0-9]+)$ ]]; then
    printf -v show '%04d' "${BASH_REMATCH[2]}"
else
    echo "$SCRIPT: ${red}Invalid show specification: $show${reset}"
    exit
fi

#
# Build the path(s) to the marker(s) in an array
#
# shellcheck disable=SC2059
for fn in "${MK[@]}"; do
    printf -v path "$TPL" "$show" "$fn"
    MFILES+=("$path")
done

#
# Path to the show directory
#
SHOWDIR="$BASENAME/shownotes/hpr${show}"

#
# Report the settings in debug mode
#
_DEBUG "Called as = $0" \
       "Show number = $show" \
       "MK = ${MK[*]}" \
       "state = $state" \
       "TOGGLE = $TOGGLE" \
       "MFILES = ${MFILES[*]}" \
       "SHOWDIR = $SHOWDIR"

#
# We need a show directory. If it doesn't exist then we'll create it because
# other scripts will use it.
#
if [[ ! -d $SHOWDIR ]]; then
    echo "${red}There is no directory for show $show${reset}"

    #
    # If the -Y option was not chosen ask with 'yes_no'. It -Y was chosen
    # we're to go ahead regardless. This relies on the fact that Bash
    # "short-circuits" logical expressions like this.
    #
    if [[ $YES -eq 1 ]] || yes_no 'Create directory? %s ' 'N'; then
        mkdir "$SHOWDIR"
        _silent "${green}Directory created for show $show${reset}"
    else
        _silent "${yellow}Not changed${reset}"
    fi
fi

#
# If the marker exists and we can toggle it, we'll do so. If no toggle, we
# report the marker presence or set it as appropriate.
#
if exists "${MFILES[@]}"; then
    if [[ $TOGGLE -eq 1 ]]; then
        _silent "${yellow}Show $show has a '$state' marker${reset}"
        if [[ $YES -eq 1 ]] || yes_no 'Remove marker? %s ' 'N'; then
            rm -f "${MFILES[@]}"
            _silent "${green}Removed '$state' marker for show $show${reset}"
        else
            _silent "${yellow}Not changed${reset}"
        fi
    else
        echo "${red}Show $show is already marked '$state'${reset}"
    fi
else
    _silent "${yellow}Show $show has no '$state' marker${reset}"
    touch "${MFILES[@]}"
    _silent "${green}Marked show $show as '$state'${reset}"
fi

exit

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