#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)
#               2021-present pkegg

. /etc/profile

set -e
set -o pipefail

### Summary
#   This script listens to input events and takes actions. mpv edition.
###

### Enable logging
case $(get_setting system.loglevel) in
  verbose)
    DEBUG=true
  ;;
  *)
    DEBUG=false
  ;;
esac

### Set up match variables
PAUSE_EVENT='*(BTN_SOUTH), value 1'
CHANGE_AUDIO_EVENT='*(BTN_EAST), value 1'
CHANGE_SUB_EVENT='*(BTN_WEST), value 1'
SHOW_OSD_EVENT='*(BTN_NORTH), value 1'
BACK_5S_DPAD_EVENT='*DPAD_LEFT), value 1'
BACK_5S_HAT_EVENT='*(ABS_HAT0X), value -1*'
SKIP_5S_DPAD_EVENT='*DPAD_RIGHT), value 1'
SKIP_5S_HAT_EVENT='*(ABS_HAT0X), value 1*'
BACK_60S_DPAD_EVENT='*DPAD_DOWN), value 1'
BACK_60S_HAT_EVENT='*(ABS_HAT0Y), value 1*'
SKIP_60S_DPAD_EVENT='*DPAD_UP), value 1'
SKIP_60S_HAT_EVENT='*(ABS_HAT0Y), value -1*'
QUIT_HOTKEY_EVENT='*(BTN_SELECT), value 1'
QUIT_SELECT_EVENT='*(BTN_START), value 1'

### Search the system for useful devices to monitor for inputs.
get_devices() {
  KJDEVS=false
  FOUNDKEYS=false
  FOUNDJOY=false
  RETRY=5
  while [ ${KJDEVS} = false ]
  do
    # Detect input devices automatically
    for DEV in /dev/input/ev*
    do
      unset SUPPORTS
      SUPPORTS=$(udevadm info ${DEV} | awk '/ID_INPUT_KEY=|ID_INPUT_JOYSTICK=/ {print $2}')
      if [ -n "${SUPPORTS}" ]
      then
        DEVICE=$(udevadm info ${DEV} | awk 'BEGIN {FS="="} /DEVNAME=/ {print $2}')
        INPUT_DEVICES+=("${DEVICE}")
        if [[ "${SUPPORTS}" =~ ID_INPUT_KEY ]]
        then
          ${DEBUG} && log $0 "Found Keyboard: ${DEVICE}"
          FOUNDKEYS=true
        elif [[ "${SUPPORTS}" =~ ID_INPUT_JOYSTICK ]]
        then
          ${DEBUG} && log $0 "Found Joystick: ${DEVICE}"
          FOUNDJOY=true
        fi
      fi
    done
    if [ "${FOUNDKEYS}" = "true" ] &&
       [ "${FOUNDJOY}" = "true" ]
    then
      ${DEBUG} && log $0 "Found all of the needed devices."
      KJDEVS=true
      break
    fi
    if [ "${RETRY}" -ge 5 ]
    then
      ${DEBUG} && log $0 "Did not find all of the needed devices, but that may be OK.  Breaking."
      break
    else
      RETRY=$(( ${RETRY} + 1 ))
    fi
    sleep 1
  done
}

function send_key() {
  ${DEBUG} && log $0 "Send key ${1}."
  echo '{"command":["keypress", "'${1}'"]}' | socat - "/tmp/mpvsocket"
}

get_devices

(
   for INPUT_DEVICE in ${INPUT_DEVICES[@]}
   do
     evtest "${INPUT_DEVICE}" 2>&1 &
   done
   wait
) | while read line; do
    case ${line} in
        (${CONTROLLER_DISCONNECTED})
        ${DEBUG} && log $0 "Reloading due to ${CONTROLLER_DEVICE} reattach..."
        get_devices
        ;;
        (${DEVICE_DISCONNECTED})
        ${DEBUG} && log $0 "Reloading due to ${DEVICE} reattach..."
        get_devices
        ;;
        (${PAUSE_EVENT})
            send_key "p"
        ;;
        (${CHANGE_AUDIO_EVENT})
            send_key "#"
        ;;
        (${CHANGE_SUB_EVENT})
            send_key "j"
        ;;
        (${SHOW_OSD_EVENT})
            send_key "O"
        ;;
        (${BACK_5S_DPAD_EVENT}|${BACK_5S_HAT_EVENT})
            send_key "LEFT"
        ;;
        (${SKIP_5S_DPAD_EVENT}|${SKIP_5S_HAT_EVENT})
            send_key "RIGHT"
        ;;
        (${BACK_60S_DPAD_EVENT}|${BACK_60S_HAT_EVENT})
            send_key "DOWN"
        ;;
        (${SKIP_60S_DPAD_EVENT}|${SKIP_60S_HAT_EVENT})
            send_key "UP"
        ;;
        (${QUIT_HOTKEY_EVENT})
           if [[ "${line}" =~ ${PRESS} ]]
           then
              ${DEBUG} && log $0 "HOTKEY: Pressed"
              HOTKEY_PRESSED=true
           elif [[ "${line}" =~ ${RELEASE} ]]
           then
              ${DEBUG} && log $0 "HOTKEY: Released"
              HOTKEY_PRESSED=false
           fi
        ;;
        (${QUIT_SELECT_EVENT})
            if [ "${HOTKEY_PRESSED}" = true ]
            then
                send_key "Q"
            fi
        ;;
    esac
done
