#!/bin/bash

#############################################################
# Zenity interface for G203 (Prodigy & Ligthsync) driver    #
# Last change: 09-07-2021                                   #
# Author: q3aql                                             #
# Contact: q3aql@protonmail.ch                              #
# License: GPL v2.0                                         #
#############################################################
VERSION="1.2"
M_DATE="090721"

# Variables
iconPath="/usr/share/icons/logitech/logitech-black.png"
imagesPath="/usr/share/icons/logitech/images"

# Variables DPI & Polling rate
numberDPI=""
numberPolling=""

# Function to check admin rights.
function rootMessage() {
  mkdir -p /etc/root &> /dev/null
  administrador=$?
  if [ ${administrador} -eq 0 ] ; then
    rm -rf /etc/root
  else
    zenity --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --window-icon=${iconPath} --warning \
    --width=340 --text "Administrator permissions are required"
    echo ""
    echo "* zenidrv-g203-prodigy ${VERSION} (${M_DATE}) (GPL v2.0)"
    echo ""
    echo "* Administrator permissions are required"
    echo ""
    exit
  fi
}

#Function to check ratbag dependence
function checkRatbag(){
  dependence="0"
  if [ -f "/usr/bin/ratbagctl" ] ; then
    dependence="1"
  elif [ -f "/bin/ratbagctl" ] ; then
    dependence="1"
  elif [ -f "/usr/local/bin/ratbagctl" ] ; then
    dependence="1"
  fi
  echo ${dependence}
}

# Show menu with options.
showMenu=0
rootMessage
while [ ${showMenu} -eq 0 ] ; do
  clear
  # Check dpi & polling rate to show in menu
  checkNumbers=$(checkRatbag)
  if [ "${checkNumbers}" == "1" ] ; then
    device_name=$(ratbagctl list | head -1 | cut -d ":" -f 1)
    get_rate=$(ratbagctl "$device_name" rate get)
    get_dpi=$(ratbagctl "$device_name" dpi get | cut -d "d" -f 1)
    numberDPI="(${get_dpi})"
    numberPolling="(${get_rate})"
  fi
  opcion=$(zenity --width=280 --height=365 --list --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" \
  --window-icon=${iconPath} --imagelist --column "Icon" --column "Effect/Option" ${imagesPath}/solid.png "Solid" \
  ${imagesPath}/cycle.png "Cycle" ${imagesPath}/breathe.png "Breathe" ${imagesPath}/intro-on.png \
  "Intro (On)" ${imagesPath}/intro-off.png "Intro (Off)" ${imagesPath}/mouse-dpi.png "Set DPI ${numberDPI}" \
  ${imagesPath}/light-off.png "Light off" ${imagesPath}/exit.png "Exit")
  if [ "${opcion}" == "${imagesPath}/solid.png" ] ; then
    color_selected=$(zenity --list --width=260 --height=570 --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" \
    --window-icon=${iconPath} --imagelist --column "Color" --column "Name color" ${imagesPath}/custom.png Custom \
    ${imagesPath}/white.png White ${imagesPath}/red.png Red ${imagesPath}/lime.png Lime ${imagesPath}/blue.png Blue \
    ${imagesPath}/yellow.png Yellow ${imagesPath}/cyan.png Cyan ${imagesPath}/magenta.png Magenta \
    ${imagesPath}/silver.png Silver ${imagesPath}/gray.png Gray ${imagesPath}/maroon.png Maroon \
    ${imagesPath}/olive.png Olive ${imagesPath}/green.png Green ${imagesPath}/purple.png Purple ${imagesPath}/teal.png Teal \
    ${imagesPath}/navy.png Navy)
    canceled=$?
    if [ ${canceled} -eq 0 ] ; then
      if [ "${color_selected}" == "${imagesPath}/custom.png" ] ; then
        custom_color=$(zenity --color-selection)
        # Crop numbers from rgb system
        first_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 1)
        second_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 2)
        third_value_prev=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 3)
        third_value=$(echo ${third_value_prev} | cut -d ")" -f 1)
        # Convert rgb numbers to hex
        first_hex=$(echo "obase=16; ${first_value}" | bc)
        second_hex=$(echo "obase=16; ${second_value}" | bc)
        third_hex=$(echo "obase=16; ${third_value}" | bc)
        # Apply number 0 after if have only one number
        if [ ${first_hex} == "0" ] ; then
          first_hex="00"
        elif [ ${first_hex} == "1" ] ; then
          first_hex="01"
        elif [ ${first_hex} == "2" ] ; then
          first_hex="02"
        elif [ ${first_hex} == "3" ] ; then
          first_hex="03"
        elif [ ${first_hex} == "4" ] ; then
          first_hex="04"
        elif [ ${first_hex} == "5" ] ; then
          first_hex="05"
        elif [ ${first_hex} == "6" ] ; then
          first_hex="06"
        elif [ ${first_hex} == "7" ] ; then
          first_hex="07"
        elif [ ${first_hex} == "8" ] ; then
          first_hex="08"
        elif [ ${first_hex} == "9" ] ; then
          first_hex="09"
        fi
        if [ ${second_hex} == "0" ] ; then
          second_hex="00"
        elif [ ${second_hex} == "1" ] ; then
          second_hex="01"
        elif [ ${second_hex} == "2" ] ; then
          second_hex="02"
        elif [ ${second_hex} == "3" ] ; then
          second_hex="03"
        elif [ ${second_hex} == "4" ] ; then
          second_hex="04"
        elif [ ${second_hex} == "5" ] ; then
          second_hex="05"
        elif [ ${second_hex} == "6" ] ; then
          second_hex="06"
        elif [ ${second_hex} == "7" ] ; then
          second_hex="07"
        elif [ ${second_hex} == "8" ] ; then
          second_hex="08"
        elif [ ${second_hex} == "9" ] ; then
          second_hex="09"
        fi
        if [ ${third_hex} == "0" ] ; then
          third_hex="00"
        elif [ ${third_hex} == "1" ] ; then
          third_hex="01"
        elif [ ${third_hex} == "2" ] ; then
          third_hex="02"
        elif [ ${third_hex} == "3" ] ; then
          third_hex="03"
        elif [ ${third_hex} == "4" ] ; then
          third_hex="04"
        elif [ ${third_hex} == "5" ] ; then
          third_hex="05"
        elif [ ${third_hex} == "6" ] ; then
          third_hex="06"
        elif [ ${third_hex} == "7" ] ; then
          third_hex="07"
        elif [ ${third_hex} == "8" ] ; then
          third_hex="08"
        elif [ ${third_hex} == "9" ] ; then
          third_hex="09"
        fi
        # Custom color in hex
        color_custom=$(echo ${first_hex}${second_hex}${third_hex})
        color_apply="${color_custom}"
      elif [ "${color_selected}" == "${imagesPath}/white.png" ] ; then
        color_apply="FFFFFF"
      elif [ "${color_selected}" == "${imagesPath}/red.png" ] ; then
        color_apply="FF0000"
      elif [ "${color_selected}" == "${imagesPath}/lime.png" ] ; then
        color_apply="00FF00"
      elif [ "${color_selected}" == "${imagesPath}/blue.png" ] ; then
        color_apply="0000FF"
      elif [ "${color_selected}" == "${imagesPath}/yellow.png" ] ; then
        color_apply="FFFF00"
      elif [ "${color_selected}" == "${imagesPath}/cyan.png" ] ; then
        color_apply="00FFFF"
      elif [ "${color_selected}" == "${imagesPath}/magenta.png" ] ; then
        color_apply="FF00FF"
      elif [ "${color_selected}" == "${imagesPath}/silver.png" ] ; then
        color_apply="C0C0C0"
      elif [ "${color_selected}" == "${imagesPath}/gray.png" ] ; then
        color_apply="808080"
      elif [ "${color_selected}" == "${imagesPath}/maroon.png" ] ; then
        color_apply="800000"
      elif [ "${color_selected}" == "${imagesPath}/olive.png" ] ; then
        color_apply="808000"
      elif [ "${color_selected}" == "${imagesPath}/green.png" ] ; then
        color_apply="008000"
      elif [ "${color_selected}" == "${imagesPath}/purple.png" ] ; then
        color_apply="800080"
      elif [ "${color_selected}" == "${imagesPath}/teal.png" ] ; then
        color_apply="008080"
      elif [ "${color_selected}" == "${imagesPath}/navy.png" ] ; then
        color_apply="000080"
      fi
      if [ -z "${color_apply}" ] ; then
        color_apply="none"
      else
        sleep 2 | zenity --progress --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --text "Applying Solid effect" \
        --window-icon=${iconPath} --pulsate --no-cancel --auto-close
        g203-led.py solid "${color_apply}"
        device_error=$?
        if [ ${device_error} -eq 0 ] ; then
          echo > /dev/null
        else
          zenity --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \
          --text "Device not found or connected"
        fi
        color_apply="none"
      fi
    else
      color_apply="none"
    fi
  elif [ "${opcion}" == "${imagesPath}/cycle.png" ] ; then
  sleep 2 | zenity --progress --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --text "Applying Cycle effect" \
  --window-icon=${iconPath} --pulsate --no-cancel --auto-close
    g203-led.py cycle
    device_error=$?
    if [ ${device_error} -eq 0 ] ; then
      echo > /dev/null
    else
      zenity --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \
      --text "Device not found or connected"
    fi
  elif [ "${opcion}" == "${imagesPath}/breathe.png" ] ; then
    color_selected=$(zenity --list --width=260 --height=565 --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" \
    --window-icon=${iconPath} --imagelist --column "Color" --column "Name color" ${imagesPath}/custom.png Custom \
    ${imagesPath}/white.png White ${imagesPath}/red.png Red ${imagesPath}/lime.png Lime ${imagesPath}/blue.png Blue \
    ${imagesPath}/yellow.png Yellow ${imagesPath}/cyan.png Cyan ${imagesPath}/magenta.png Magenta \
    ${imagesPath}/silver.png Silver ${imagesPath}/gray.png Gray ${imagesPath}/maroon.png Maroon \
    ${imagesPath}/olive.png Olive ${imagesPath}/green.png Green ${imagesPath}/purple.png Purple ${imagesPath}/teal.png Teal \
    ${imagesPath}/navy.png Navy)
    canceled=$?
    if [ ${canceled} -eq 0 ] ; then
      if [ "${color_selected}" == "${imagesPath}/custom.png" ] ; then
        custom_color=$(zenity --color-selection)
        # Crop numbers from rgb system
        first_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 1)
        second_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 2)
        third_value_prev=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 3)
        third_value=$(echo ${third_value_prev} | cut -d ")" -f 1)
        # Convert rgb numbers to hex
        first_hex=$(echo "obase=16; ${first_value}" | bc)
        second_hex=$(echo "obase=16; ${second_value}" | bc)
        third_hex=$(echo "obase=16; ${third_value}" | bc)
        # Apply number 0 after if have only one number
        if [ ${first_hex} == "0" ] ; then
          first_hex="00"
        elif [ ${first_hex} == "1" ] ; then
          first_hex="01"
        elif [ ${first_hex} == "2" ] ; then
          first_hex="02"
        elif [ ${first_hex} == "3" ] ; then
          first_hex="03"
        elif [ ${first_hex} == "4" ] ; then
          first_hex="04"
        elif [ ${first_hex} == "5" ] ; then
          first_hex="05"
        elif [ ${first_hex} == "6" ] ; then
          first_hex="06"
        elif [ ${first_hex} == "7" ] ; then
          first_hex="07"
        elif [ ${first_hex} == "8" ] ; then
          first_hex="08"
        elif [ ${first_hex} == "9" ] ; then
          first_hex="09"
        fi
        if [ ${second_hex} == "0" ] ; then
          second_hex="00"
        elif [ ${second_hex} == "1" ] ; then
          second_hex="01"
        elif [ ${second_hex} == "2" ] ; then
          second_hex="02"
        elif [ ${second_hex} == "3" ] ; then
          second_hex="03"
        elif [ ${second_hex} == "4" ] ; then
          second_hex="04"
        elif [ ${second_hex} == "5" ] ; then
          second_hex="05"
        elif [ ${second_hex} == "6" ] ; then
          second_hex="06"
        elif [ ${second_hex} == "7" ] ; then
          second_hex="07"
        elif [ ${second_hex} == "8" ] ; then
          second_hex="08"
        elif [ ${second_hex} == "9" ] ; then
          second_hex="09"
        fi
        if [ ${third_hex} == "0" ] ; then
          third_hex="00"
        elif [ ${third_hex} == "1" ] ; then
          third_hex="01"
        elif [ ${third_hex} == "2" ] ; then
          third_hex="02"
        elif [ ${third_hex} == "3" ] ; then
          third_hex="03"
        elif [ ${third_hex} == "4" ] ; then
          third_hex="04"
        elif [ ${third_hex} == "5" ] ; then
          third_hex="05"
        elif [ ${third_hex} == "6" ] ; then
          third_hex="06"
        elif [ ${third_hex} == "7" ] ; then
          third_hex="07"
        elif [ ${third_hex} == "8" ] ; then
          third_hex="08"
        elif [ ${third_hex} == "9" ] ; then
          third_hex="09"
        fi
        # Custom color in hex
        color_custom=$(echo ${first_hex}${second_hex}${third_hex})
        color_apply="${color_custom}"
      elif [ "${color_selected}" == "${imagesPath}/white.png" ] ; then
        color_apply="FFFFFF"
      elif [ "${color_selected}" == "${imagesPath}/red.png" ] ; then
        color_apply="FF0000"
      elif [ "${color_selected}" == "${imagesPath}/lime.png" ] ; then
        color_apply="00FF00"
      elif [ "${color_selected}" == "${imagesPath}/blue.png" ] ; then
        color_apply="0000FF"
      elif [ "${color_selected}" == "${imagesPath}/yellow.png" ] ; then
        color_apply="FFFF00"
      elif [ "${color_selected}" == "${imagesPath}/cyan.png" ] ; then
        color_apply="00FFFF"
      elif [ "${color_selected}" == "${imagesPath}/magenta.png" ] ; then
        color_apply="FF00FF"
      elif [ "${color_selected}" == "${imagesPath}/silver.png" ] ; then
        color_apply="C0C0C0"
      elif [ "${color_selected}" == "${imagesPath}/gray.png" ] ; then
        color_apply="808080"
      elif [ "${color_selected}" == "${imagesPath}/maroon.png" ] ; then
        color_apply="800000"
      elif [ "${color_selected}" == "${imagesPath}/olive.png" ] ; then
        color_apply="808000"
      elif [ "${color_selected}" == "${imagesPath}/green.png" ] ; then
        color_apply="008000"
      elif [ "${color_selected}" == "${imagesPath}/purple.png" ] ; then
        color_apply="800080"
      elif [ "${color_selected}" == "${imagesPath}/teal.png" ] ; then
        color_apply="008080"
      elif [ "${color_selected}" == "${imagesPath}/navy.png" ] ; then
        color_apply="000080"
      fi
      if [ -z "${color_apply}" ] ; then
        color_apply="none"
      else
        sleep 2 | zenity --progress --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --text "Applying Breathe effect" \
        --window-icon=${iconPath} --pulsate --no-cancel --auto-close
        g203-led.py breathe "${color_apply}"
        device_error=$?
        if [ ${device_error} -eq 0 ] ; then
          echo > /dev/null
        else
          zenity --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \
          --text "Device not found or connected"
        fi
        color_apply="none"
      fi
    else
      color_apply="none"
    fi
  elif [ "${opcion}" == "${imagesPath}/intro-on.png" ] ; then
    sleep 2 | zenity --progress --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --text "Enabling startup effect" \
    --window-icon=${iconPath} --pulsate --no-cancel --auto-close
    g203-led.py intro on
    device_error=$?
    if [ ${device_error} -eq 0 ] ; then
      echo > /dev/null
    else
      zenity --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \
      --text "Device not found or connected"
    fi
  elif [ "${opcion}" == "${imagesPath}/intro-off.png" ] ; then
    sleep 2 | zenity --progress --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --text "Disabling startup effect" \
    --window-icon=${iconPath} --pulsate --no-cancel --auto-close
    g203-led.py intro off
    device_error=$?
    if [ ${device_error} -eq 0 ] ; then
      echo > /dev/null
    else
      zenity --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \
      --text "Device not found or connected"
    fi
  elif [ "${opcion}" == "${imagesPath}/mouse-dpi.png" ] ; then
    dpi_number=$(zenity --entry --title "Set DPI (from 200 to 8000)" --window-icon=${iconPath} --text "Enter DPI number (from 200 to 8000):" --entry-text "800")
    if [ -z ${dpi_number} ] ; then
      echo > /dev/null
    else
      sleep 2 | zenity --progress --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --text "Setting DPI to ${dpi_number}" \
      --window-icon=${iconPath} --pulsate --no-cancel --auto-close
      g203-led.py dpi ${dpi_number}
      device_error=$?
      if [ ${device_error} -eq 0 ] ; then
        checkNumbers=$(checkRatbag)
        if [ "${checkNumbers}" == "1" ] ; then
          device_name=$(ratbagctl list | head -1 | cut -d ":" -f 1)
          ratbagctl "$device_name" dpi set "${dpi_number}"
        fi
      else
        zenity --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \
        --text "Device not found or connected"
      fi
    fi
  elif [ "${opcion}" == "${imagesPath}/light-off.png" ] ; then
    sleep 2 | zenity --progress --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --text "Turning off the light on the mouse" \
    --window-icon=${iconPath} --pulsate --no-cancel --auto-close
    g203-led.py breathe 000000 1000 0
    device_error=$?
    if [ ${device_error} -eq 0 ] ; then
      echo > /dev/null
    else
      zenity --title "zenidrv-g203-prodigy ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \
      --text "Device not found or connected"
    fi
  elif [ "${opcion}" == "${imagesPath}/exit.png" ] ; then
    showMenu=1
  else
    zenity --title "zenidrv-g203-prodigy ${VERSION} (${M_DATE})" --window-icon=${iconPath} --warning \
    --width=300 --text "Choose one of the menu options"
  fi
done