#!/bin/bash

# This script simply refreshes the default panel layout based on
# installed packages to prevent plasma errors causing incomplete
# icon population or crashes

declare -a launcherArry=(
[0]="preferred://browser"
[1]="patchance.desktop"
[2]="ardour.desktop"
[3]="com.obsproject.Studio.desktop"
[4]="org.kde.krita.desktop"
[5]="gimp.desktop"
[6]="org.kde.kdenlive.desktop"
[7]="org.kde.digikam.desktop"
[8]="org.darktable.darktable.desktop"
)

declare -a favoritesArry=(
[0]="ubuntu-desktop-bootstrap_ubuntu-desktop-bootstrap.desktop"
[1]="preferred://browser"
[2]="thunderbird_thunderbird.desktop"
[3]="org.kde.dolphin.desktop"
[4]="org.kde.discover.desktop"
[5]="raysession.desktop"
[6]="carla.desktop"
)

for i in ${!launcherArry[@]}; do
  if ! [ -e "/usr/share/applications/${launcherArry[i]}" ]; then
    if ! [ -e "/var/lib/snapd/desktop/applications/${launcherArry[i]})" ]; then
      if ! [ "${launcherArry[i]}" = "preferred://browser" ]; then
        unset 'launcherArry[i]';
      fi
    fi
  fi
done

for j in ${!favoritesArry[@]}; do
  if ! [ -e "/usr/share/applications/${favoritesArry[j]}" ]; then
    if ! [ -e "/var/lib/snapd/desktop/applications/${favoritesArry[j]})" ]; then
      if ! [ "${favoritesArry[j]}" = "preferred://browser" ]; then
        unset 'favoritesArry[j]';
      fi
    fi
  fi
done

declare launcherAdd=()
for k in "${!launcherArry[@]}"; do
  if [ "${launcherArry[k]}" = "preferred://browser" ]; then
    launcherAdd+="\"${launcherArry[k]}\", "
  else
    launcherAdd+="\"applications:${launcherArry[k]}\", "
  fi
done

declare favoritesAdd=()
for l in "${!favoritesArry[@]}"; do
  favoritesAdd+="${favoritesArry[l]};"
done

launchers=${launcherAdd[@]}
favorites=${favoritesAdd[@]}

layoutJs=$(cat <<EOF
var panel = new Panel
var panelScreen = panel.screen
var freeEdges = {"top": true, "bottom": true, "left": true, "right": true}

for (i = 0; i < panelIds.length; ++i) {
    var tmpPanel = panelById(panelIds[i])
    if (tmpPanel.screen == panelScreen) {
        // Ignore the new panel
        if (tmpPanel.id != panel.id) {
            freeEdges[tmpPanel.location] = false;
        }
    }
}

if (freeEdges["top"] == true) {
    panel.location = "top";
} else if (freeEdges["bottom"] == true) {
    panel.location = "bottom";
} else if (freeEdges["left"] == true) {
    panel.location = "left";
} else if (freeEdges["right"] == true) {
    panel.location = "right";
} else {
    // There is no free edge, so leave the default value
    panel.location = "top";
}

panel.height = gridUnit * 1.7

var spacer1 = panel.addWidget("org.kde.plasma.panelspacer")
spacer1.writeConfig("expanding", "false")
spacer1.writeConfig("length", "10")

var kicker = panel.addWidget("org.kde.plasma.kicker")
kicker.writeConfig("customButtonImage", "/usr/share/pixmaps/ubuntustudio-logo-menu.png")
kicker.writeConfig("showAppsByName", "true")
kicker.currentConfigGroup = ["Shortcuts"]
kicker.writeConfig("global", "Alt+F1")

var spacer2 = panel.addWidget("org.kde.plasma.panelspacer")
spacer2.writeConfig("expanding", "false")
spacer2.writeConfig("length", "10")

//panel.addWidget("org.kde.plasma.showActivityManager")
panel.addWidget("org.kde.plasma.pager")

var taskmanager = panel.addWidget("org.kde.plasma.icontasks")
var launcherlist = [ $launchers "applications:systemsettings.desktop" ]
taskmanager.writeConfig("launchers", launcherlist)

/* Next up is determining whether to add the Input Method Panel
 * widget to the panel or not. This is done based on whether
 * the system locale's language id is a member of the following
 * white list of languages which are known to pull in one of
 * our supported IME backends when chosen during installation
 * of common distributions. */

var langIds = ["as",    // Assamese
               "bn",    // Bengali
               "bo",    // Tibetan
               "brx",   // Bodo
               "doi",   // Dogri
               "gu",    // Gujarati
               "hi",    // Hindi
               "ja",    // Japanese
               "kn",    // Kannada
               "ko",    // Korean
               "kok",   // Konkani
               "ks",    // Kashmiri
               "lep",   // Lepcha
               "mai",   // Maithili
               "ml",    // Malayalam
               "mni",   // Manipuri
               "mr",    // Marathi
               "ne",    // Nepali
               "or",    // Odia
               "pa",    // Punjabi
               "sa",    // Sanskrit
               "sat",   // Santali
               "sd",    // Sindhi
               "si",    // Sinhala
               "ta",    // Tamil
               "te",    // Telugu
               "th",    // Thai
               "ur",    // Urdu
               "vi",    // Vietnamese
               "zh_CN", // Simplified Chinese
               "zh_TW"] // Traditional Chinese

if (langIds.indexOf(languageId) != -1) {
    panel.addWidget("org.kde.plasma.kimpanel");
}

panel.addWidget("org.kde.plasma.systemtray")
panel.addWidget("org.kde.plasma.digitalclock")
panel.addWidget("org.kde.plasma.minimizeall")

var spacer3 = panel.addWidget("org.kde.plasma.panelspacer")
spacer3.writeConfig("expanding", "false")
spacer3.writeConfig("length", "10")
EOF
)

dockLayout=$( cat <<EOF
var panel = new Panel
var panelScreen = panel.screen
var freeEdges = {"top": true, "bottom": true, "left": true, "right": true}

for (i = 0; i < panelIds.length; ++i) {
    var tmpPanel = panelById(panelIds[i])
    if (tmpPanel.screen == panelScreen) {
        // Ignore the new panel
        if (tmpPanel.id != panel.id) {
            freeEdges[tmpPanel.location] = false;
        }
    }
}

if (freeEdges["bottom"] == true) {
    panel.location = "bottom";
} else if (freeEdges["left"] == true) {
    panel.location = "left";
} else if (freeEdges["right"] == true) {
    panel.location = "right";
} else if (freeEdges["top"] == true) {
    panel.location = "top";
} else {
    // There is no free edge, so leave the default value
    panel.location = "bottom";
}

panel.lengthMode = "fit"
panel.hiding = "dodgewindows"
panel.height = gridUnit * 3.5

var spacer1 = panel.addWidget("org.kde.plasma.panelspacer")
spacer1.writeConfig("expanding", "false")
spacer1.writeConfig("length", "10")

var kickerdash = panel.addWidget("org.kde.plasma.kickerdash")
kickerdash.writeConfig("customButtonImage", "app-launcher")
kickerdash.writeConfig("useCustomButtonImage", "true")

var taskmanager = panel.addWidget("org.kde.plasma.icontasks")
var launcherlist = ["applications:org.kde.dolphin.desktop", $launchers "applications:org.kde.discover.desktop", "applications:systemsettings.desktop"]
taskmanager.writeConfig("launchers", launcherlist)

panel.addWidget("org.kde.plasma.trash")

var spacer2 = panel.addWidget("org.kde.plasma.panelspacer")
spacer2.writeConfig("expanding", "false")
spacer2.writeConfig("length", "10")

EOF
)

kickerextrafavoritesrc=$( cat <<EOF
[General]
Prepend=$favorites;systemsettings.desktop
IgnoreDefaults=true
EOF
)

echo "${layoutJs}" > /usr/share/plasma/layout-templates/org.ubuntustudio.desktop.defaultPanel/contents/layout.js
echo "${dockLayout}" > /usr/share/plasma/layout-templates/org.ubuntustudio.desktop.dock/contents/layout.js
echo "${kickerextrafavoritesrc}" > /etc/xdg/kicker-extra-favoritesrc
