#!/bin/bash
SS_VERSION="0.12.1"

SS_DATA_PATH="/usr/share/solseek"

# Boot / ENV
. "${SS_DATA_PATH}/core/boot"

# Help and calls
case "$1" in
    "-h" | "--help" | "help" )
    echo -e "${MSG_HELP}"
    if [ "$1" == "help" ]; then
        echo -e "\nAdditional ${SS_PKG_MGR} Help\n"
        if [ "${SS_PKG_MGR}" == "eopkg" ]; then
            eopkg help
        else
            moss --help
        fi
    fi
    exit 0
    ;;
    "--version")
    echo "solseek ${SS_VERSION}"
    exit 0
    ;;
    "--debug")
    ss_debug
    exit 0
    ;;
esac
# System service update check
if [ "$1" == "-cu" ]; then
    if [ "${SS_NOTIFCATIONS}" -eq 2 ]; then
        SS_NOTIFCATIONS=1
    fi
    check_updates "system"
    exit 0
fi
# Internal calls
if [ "$1" == "-ssh" ]; then
    . "${SS_DATA_PATH}/modules/panel-help"
    exit 0
elif [ "$1" == "-ssi" ]; then
    . "${SS_DATA_PATH}/modules/panel-pkginfo"
    exit 0
elif [ "$1" == "-ssfi" ]; then
    . "${SS_DATA_PATH}/modules/panel-fpinfo"
    exit 0
elif [ "$1" == "-sse" ]; then
    . "${SS_DATA_PATH}/modules/tools"
    exit 0
elif [ "$1" == "-ssp" ]; then
    . "${SS_DATA_PATH}/modules/install-pkg"
    exit 0
elif [ "$1" == "-ssf" ]; then
    . "${SS_DATA_PATH}/modules/install-flatpak"
    exit 0
elif [ "$1" == "-ssd" ]; then
    . "${SS_DATA_PATH}/modules/panel-drivers"
    exit 0
elif [ "$1" == "-ssu" ]; then
    . "${SS_DATA_PATH}/modules/update-runner"
    exit 0
elif [ "$1" == "applist" ]; then
    . "${SS_DATA_PATH}/modules/list-packages"
    exit 0
elif [ "$1" == "subact" ]; then
    # We just set the sub action avoid running the fz logic up here
    ISSA=1

elif [ "$1" == "-cc" ]; then
    # force clears all cache files to start clean
    rm -f ${IDX_CACHE_FILE}
    rm -f ${AS_CACHE_FILE}
    rm -f ${PA_CACHE_FILE}
    rm -f ${PI_CACHE_FILE}
    rm -f ${FA_CACHE_FILE}
    rm -f ${FI_CACHE_FILE}
    rm -f ${UP_CACHE_FILE}
    rm -f ${UL_CACHE_FILE}
    rm -f ${UP_LOCK_FILE}

# This is abstraction of the eopkg/moss command to allow for moss inclusion in the future
# Allows for full eopkg calls
elif [ "$1" == "eopkg" ]; then
    eopkg "${@:2}"
    exit 0
# If a paramater is passed, no matches above, pass off to eopkg/moss
elif [ -n "$1" ]; then
    # Capture upgrades so we can do both eopkg/moss and flatpak
    if [ "$1" = "up" ] || [ "$1" = "upgrade" ]; then
        if [ "$2" == "-e" ]; then
            solseek -ssu up_eo=1 up_fp=1 up_sn=1 up_db=1 up_fw=1 up_cu=1
        else
            solseek -ssu up_eo=1 up_fp=1 up_sn=1
        fi
        exit 0
    fi
    ${SS_PKG_MGR} "$@"
    exit 0
fi

# Include and setup Menus
. "/usr/share/solseek/core/menus"


# Sub action area
# This allows step-up navigation versus always returning to the main menu
if [ "$ISSA" -eq 1 ]; then
    while true; do
      clear
      # Updates Sub Action
      if [ "$2" == "upsys" ]; then
          ## Remove update check if updates are disabled
          if [ "$SS_DISABLE_UPCHK" -eq 1 ]; then
              MENU_UPDATE=$(echo "${MENU_UPDATE}" | grep -v '^AMU_CHECK|')
              MENU_UPDATE=$(echo "${MENU_UPDATE}" | grep -v '^A_BLANK|')
          fi

          upmode=$(printf "%b" "${MENU_UPDATE}" | sa_fzf --prompt="" --header="${ACT_MAIN_UPDATESYS}" --preview 'solseek -ssh AMM_UPSYS')

          upmode=${upmode%|*}
          case "$upmode" in
              "A_BACK" | "") exit 0 ;;
              "AMU_EOPKG") solseek -ssu up_eo=1;;
              "AMU_FLATPAK") solseek -ssu up_fp=1;;
              "AMU_SNAP") solseek -ssu up_sn=1;;
              "AMU_ALL") solseek -ssu up_eo=1 up_fp=1 up_sn=1;;
              "AMU_DBOX") solseek -ssu up_db=1;;
              "AMU_FMW") solseek -ssu up_fw=1;;
              "AMU_CUST") solseek -ssu up_cu=1;;
              "AMU_ETHING") solseek -ssu up_eo=1 up_fp=1 up_sn=1 up_db=1 up_fw=1 up_cu=1;;
              "AMU_CHECK") solseek -ssu check;;
              *) continue ;;
          esac
      # Tools Sub Action
      elif [ "$2" == "tools" ]; then
          toolAction=$(printf "%b" "${MENU_TOOLS}" | sa_fzf --prompt="" --header="${ACT_MAIN_INFORMATION}" --preview 'solseek -sse {1}')

          toolAction=${toolAction%|*}
          case "$toolAction" in
              "A_BACK" | "") exit 0 ;;
              "AMT_EHIST") solseek -sse "$toolAction" export ;;
              "AMT_FHIST") solseek -sse "$toolAction" export ;;
              "AMT_ERBCK") solseek subact rollback ;;
              "AMT_EINST") solseek -sse "$toolAction" export ;;
              "AMT_EUSER") solseek -sse "$toolAction" export ;;
              "AMT_LREPO") solseek -sse "$toolAction" export ;;
              "AMT_ECHECK") solseek -sse "$toolAction" run ;;
              "AMT_ERMO") solseek -sse "$toolAction" run ;;
              "AMT_EDC") solseek -sse "$toolAction" run ;;
              "AMT_EUR") solseek -sse "$toolAction" run ;;
              "AMT_FPLA") solseek -sse "$toolAction" export ;;
              "AMT_FPLU") solseek -sse "$toolAction" export ;;
              "AMT_FREPO") solseek -sse "$toolAction" export ;;
              "AMT_FCHECK") solseek -sse "$toolAction" run ;;
              "AMT_FPCLEAN") solseek -sse "$toolAction" run ;;
              "AMT_INXI") solseek -sse "$toolAction" export ;;
              "AMT_SSCFG") solseek -sse "$toolAction" run;;
              "AMT_SSTMR") solseek -sse "$toolAction" run;;
              "AMT_RBFW") solseek -sse "$toolAction" run;;
              *) continue ;;
          esac
      # EOPKG Rollback Menu
      elif [ "$2" == "rollback" ]; then
          RBMENU="A_BACK|< ${ACT_GEN_BACK}
          "
          RBMENU+=$(eopkg_rollback_menu)
          toolAction=$(printf "%b" "${RBMENU}" | sa_fzf --prompt="" --header="${ACT_INFO_HROLLBACK}" --preview 'solseek -ssh AMT_ERBCK')

          if [ "${toolAction%|*}" == "A_BACK" ]; then
              exit 0
          fi
          case "$toolAction" in
              "A_BACK" | "") exit 0 ;;
              *) solseek -sse rollback "${toolAction}" ;;
          esac
      # Appstream Catalog Category Menu
      elif [ "$2" == "lasm" ]; then

          mode=$(printf "%b" "${MENU_DAS}" | sa_fzf --prompt="" --header="${MSG_GEN_DESKAPPS}" --preview 'solseek -ssh AMM_DASUB')
          mode=${mode%|*}

          # For Appstream we have extra parsing
          if [[ "$mode" == *:* ]]; then
              IFS=':' read -r mode ascat <<< "$mode"
          fi

          case "$mode" in
              "AMM_DCAT") solseek subact las "$ascat" ;;
              "A_BACK" | "") exit 0 ;;
          esac

      # Appstream Catalog
      elif [ "$2" == "las" ]; then
          echo -e "${MSG_GEN_LOADCATALOG}"
          app_list=$(solseek "applist" "as" "$3")

          pkg=$(printf "%b" "${app_list}" | as_fzf --prompt="${MSG_PKG_PROMPT}: " --header="${MSG_GEN_DESKAPPS} - ${3}")

          [ -z "$pkg" ] && exit 0

          IFS='|' read -r kvar package <<< "$pkg"
          IFS=':' read -r ptype pkgid <<< "$kvar"

          if [ "$ptype" == "flatpak" ]; then

              AS_HEADER=${MSG_PKG_FPSEL}
              AS_PREVIEW="solseek -ssfi '${pkgid}'"
              AS_ROUTE="-ssf"

              if grep -q "$pkgid" "$FI_CACHE_FILE"; then
                  pkg_status="${MSG_GEN_INSTALLED}"

                  MENU_PKG=$(echo "${MENU_MPKG}" | grep -v '^AMP_SCHK|')
              else
                  pkg_status="${MSG_GEN_AVAILABLE}"
                  MENU_PKG="${MENU_IPKG}"
              fi
          else
              AS_HEADER=${MSG_GEN_SEL}
              AS_PREVIEW="solseek -ssi '${pkgid}'"
              AS_ROUTE="-ssp"

              if grep -q "${pkgid}|" "${PI_CACHE_FILE}"; then
                  pkg_status="${MSG_GEN_INSTALLED}"

                  MENU_PKG=$(echo "${MENU_MPKG}" | grep -v '^AMP_FPREP|')$
              else
                  pkg_status="${MSG_GEN_AVAILABLE}"
                  MENU_PKG="${MENU_IPKG}"
              fi
          fi

          pkgAction=$(printf "%b" "${MENU_PKG}" | sa_fzf --prompt="" --header="${AS_HEADER}" --preview "${AS_PREVIEW}")
          pkgAction=${pkgAction%|*}

          case "$pkgAction" in
              "AMP_INST") solseek "${AS_ROUTE}" "install" "$pkgid" ;;
              "AMP_RINST") solseek "${AS_ROUTE}" "reinstall" "$pkgid" ;;
              "AMP_REM") solseek "${AS_ROUTE}" "remove" "$pkgid" ;;
              "AMP_FPREP") solseek "${AS_ROUTE}" "repair" "$pkgid" ;;
              "AMP_SCHK") solseek "${AS_ROUTE}" "check" "$pkgid" ;;
              "AMP_UPDT") solseek "${AS_ROUTE}" "update" "$pkgid" ;;
              "A_BACK" | "") continue ;;
          esac

      # Flatpaks Sub Action
      elif [ "$2" = "lif" ] || [ "$2" = "laf" ]; then
          #Flatpak List
          fp_cache

          if [ "$2" = "lif" ]; then
              app_list=$(solseek "applist" "fpi")
              pkg_list_type="${ACT_MAIN_LISTIPKGS}"
          else
              app_list=$(solseek "applist" "fpa")
              pkg_list_type="${ACT_MAIN_LISTAPKGS}"
          fi

          pkg=$(printf "%b" "${app_list}" | pkg_fzf --prompt="${MSG_PKG_PROMPT}: " --header="${ACT_UPD_FLATPAK} - $pkg_list_type" --preview 'solseek -ssfi {1} {+}')

          # Return to main menu
          [ -z "$pkg" ] && exit 0
          if [[ "$pkg" == Empty* ]]; then
              continue
          fi
          package=$(echo "$pkg" | grep -o '[^ ]*|' | tr -d '|')

          if grep -q "${package}|" "${FI_CACHE_FILE}"; then
              pkg_status="${MSG_GEN_INSTALLED}"

              MENU_PKG=$(echo "${MENU_MPKG}" | grep -v '^AMP_SCHK|')
          else
              pkg_status="${MSG_GEN_AVAILABLE}"
              MENU_PKG="${MENU_IPKG}"
          fi
          package="${package//$'\n'/ }"
          # PACKAGE ACTION
          pkgAction=$(printf "%b" "${MENU_PKG}" | sa_fzf --prompt="" --header="${MSG_PKG_FPSEL}" --preview "solseek -ssh SELPKG '${package}'")

          pkgAction=${pkgAction%|*}
          case "$pkgAction" in
              "AMP_INST") solseek -ssf install "${package}" ;;
              "AMP_RINST") solseek -ssf reinstall "${package}" ;;
              "AMP_REM") solseek -ssf remove "${package}" ;;
              "AMP_FPREP") solseek -ssf repair "${package}" ;;
              "AMP_UPDT") solseek -ssf update "${package}" ;;
              "A_BACK" | "") continue ;;
          esac
      # Packages Sub Action
      elif [ "$2" = "li" ] || [ "$2" = "la" ]; then

        # PACKAGE LIST
          eopkg_cache
          if [ "$2" = "li" ]; then
              app_list=$(solseek "applist" "pkgi")
              pkg_list_type="${ACT_MAIN_LISTIPKGS}"
          else
              app_list=$(solseek "applist" "pkga")
              pkg_list_type="${ACT_MAIN_LISTAPKGS}"
          fi

          pkg=$(printf "%b" "$app_list" | pkg_fzf --prompt="${MSG_PKG_PROMPT}: " --header="${MSG_PKG_HEADER} - ${pkg_list_type}" --preview 'solseek -ssi {1} {+}')

          # Return to main menu
          [ -z "$pkg" ] && exit 0

          package=$(echo "$pkg" | grep -o '[^ ]*|' | tr -d '|')

          if grep -q "${package}|" "${PI_CACHE_FILE}"; then
              pkg_status="${MSG_GEN_INSTALLED}"

              MENU_PKG=$(echo "${MENU_MPKG}" | grep -v '^AMP_FPREP|')
          else
              pkg_status="${MSG_GEN_AVAILABLE}"
              MENU_PKG="${MENU_IPKG}"
          fi

          package="${package//$'\n'/ }"
          # PACKAGE ACTION
          pkgAction=$(printf "%b" "${MENU_PKG}" | sa_fzf --prompt="" --header="${MSG_GEN_SEL}" --preview "solseek -ssh SELPKG '${package}'")

          pkgAction=${pkgAction%|*}
          case "$pkgAction" in
              "AMP_INST") solseek -ssp install "${package}" ;;
              "AMP_RINST") solseek -ssp reinstall "${package}" ;;
              "AMP_REM") solseek -ssp remove "${package}" ;;
              "AMP_SCHK") solseek -ssp check "${package}" ;;
              "AMP_UPDT") solseek -ssp update "${package}" ;;
              "A_BACK" | "") continue ;;
          esac
      # Driver Sub Action
      elif [ "$2" = "drivers" ]; then

        # Driver LIST

          MENUDL="$MENU_DRIVERS"
          check_nvidia_support "check"
          if [ "$SS_GPU_NVIDIA" -eq 0 ]; then
              MENUDL=$(echo "${MENUDL}" | grep -v '^nvidia|')
              MENUDL=$(echo "${MENUDL}" | grep -v '^A_BLANKN|')
          fi

          # PACKAGE ACTION
          pkg=$(printf "%b" "${MENUDL}" | sa_fzf --prompt="" --header="${MSG_GEN_DRIVERS}" --preview 'solseek -ssd {1}')
          [ -z "$pkg" ] && exit 0
          pkgchk=${pkg%|*}

          if [ "$pkgchk" == "A_BACK" ]; then
              exit 0
          elif [ "$pkgchk" == "A_BLANK" ] || [ "$pkgchk" == "A_BLANKN" ]; then
              continue
          else
              MENUDA="$MENU_IPKG";
              PREVD="solseek -ssh SELPKG '${pkgchk}'"
              if [ "$pkgchk" == "nvidia" ]; then
                  check_nvidia_support "menu"
                  PREVD="solseek -ssh INVIDIA"
              else
                  if grep -q "${pkgchk}|" "${PI_CACHE_FILE}"; then
                    pkg_status="${MSG_GEN_INSTALLED}"
                    MENUDA="${MENU_MPKG}"
                    MENUDA=$(echo "${MENUDA}" | grep -v '^AMP_FPREP|')
                  fi
              fi

              pkgAction=$(printf "%b" "${MENUDA}" | sa_fzf --prompt="" --header="${MSG_GEN_SEL}" --preview "${PREVD}")
              pkgAction=${pkgAction%|*}

              if [ "$pkgchk" == "nvidia" ]; then

                  case "$pkgAction" in
                    "AMP_INSTO")
                      package="${SS_NVMENU_MAP[AMP_INSTO]}"
                      pkgAction="AMP_INST"
                      ;;
                    "AMP_INSTO32")
                      package="${SS_NVMENU_MAP[AMP_INSTO32]}"
                      pkgAction="AMP_INST"
                      ;;
                    "AMP_INSTP")
                      package="${SS_NVMENU_MAP[AMP_INSTP]}"
                      pkgAction="AMP_INST"
                      ;;
                    "AMP_INSTP32")
                      package="${SS_NVMENU_MAP[AMP_INSTP32]}"
                      pkgAction="AMP_INST"
                      ;;
                    "AMP_INSTL")
                      package="${SS_NVMENU_MAP[AMP_INSTL]}"
                      pkgAction="AMP_INST"
                      ;;
                    "AMP_INSTL32")
                      package="${SS_NVMENU_MAP[AMP_INSTOL32]}"
                      pkgAction="AMP_INST"
                      ;;
                    "AMP_ADD32")
                      package="${SS_NVMENU_MAP[AMP_ADD32]}"
                      pkgAction="AMP_INST"
                      ;;
                    "AMP_REM")
                      package="${SS_NVMENU_MAP[AMP_REM]}"
                  esac
              else
                  package="${pkgchk}"
              fi

              case "$pkgAction" in
                  "AMP_INST") solseek -ssp install "${package}" ;;
                  "AMP_RINST") solseek -ssp reinstall "${package}" ;;
                  "AMP_REM") solseek -ssp remove "${package}" ;;
                  "AMP_SCHK") solseek -ssp check "${package}" ;;
                  "AMP_UPDT") solseek -ssp update "${package}" ;;
                  "" | A_BACK) continue ;;
              esac
          fi
      else
        exit 0
      fi
    done
    exit 0
fi

# End Sub action area
# Launch main menu with a clean cache
clean_cache "regen" "update"
clear
# Start Interface
while true; do
    clear

    mode=$(printf "%b" "${MENU_MAIN}" | sa_fzf --prompt="" --header="Solseek" --preview 'solseek -ssh {1}')

    mode=${mode%|*}

    # For Appstream we have extra parsing
    if [[ "$mode" == *:* ]]; then
      IFS=':' read -r mode ascat <<< "$mode"
    fi

    case "$mode" in
        "AMM_QUIT" | "") exit 0 ;;
        "AMM_LST_PI" | "AMM_LST_PII") solseek subact li ;;
        "AMM_LST_PA" | "AMM_LST_PAS") solseek subact la ;;
        "AMM_LST_FA" | "AMM_LST_FAS") solseek subact laf ;;
        "AMM_LST_FI" | "AMM_LST_FII") solseek subact lif ;;
        "AMM_DASUB") solseek subact lasm ;;
        "AMM_DCAT") solseek subact las "$ascat" ;;
        "AMM_UPSYS") solseek subact upsys ;;
        "AMM_TOOLS") solseek subact tools ;;
        "AMM_DMGR") solseek subact drivers ;;
        *) continue ;;
    esac
done
