#!/bin/bash

BACKUP_DIR="/usr/share/biglinux/applications-name"

# True when a line of the file starts with the literal text $2. Literal, not a
# regex: write 'Name[pt_BR]=', never 'Name\[pt_BR\]='. Anchored, so that
# 'Name[pt]=' does not match inside 'GenericName[pt]='.
has_text() {
    [[ $'\n'"$(< "$1")" == *$'\n'"$2"* ]]
}

hide_app() {
    local file="$1"
    [[ -f "$file" ]] || return
    
    if ! has_text "$file" "NoDisplay=true"; then
        sed -i 's|Categories=|NoDisplay=true\nCategories=|' "$file"
    fi
}

hide_in_env() {
    local file="$1"
    local env="$2"
    [[ -f "$file" ]] || return

    if ! has_text "$file" "NotShowIn=$env"; then
        sed -i "s|Categories=|NotShowIn=$env\nCategories=|" "$file"
    fi
}

apps_to_hide=(
    "/usr/share/applications/org.kde.kwrite.desktop"
    "/usr/share/applications/ipython.desktop"
    "/usr/share/applications/display-im6.q16.desktop"
    "/usr/share/applications/libreoffice-startcenter.desktop"
    "/usr/share/applications/urxvtc.desktop"
    "/usr/share/applications/urxvt.desktop"
    "/usr/share/applications/urxvt-tabbed.desktop"
    "/usr/share/applications/org.kde.kdeconnect.sms.desktop"
    "/usr/share/applications/org.kde.kdeconnect_open.desktop"
    "/usr/share/applications/kde_wacom_tabletfinder.desktop"
    "/usr/share/applications/yad-icon-browser.desktop"
    "/usr/share/applications/yad-settings.desktop"
    "/usr/share/applications/rxvt-unicode.desktop"
    "/usr/share/applications/gscriptor.desktop"
    "/usr/share/applications/org.kde.latte-dock.desktop"
    "/usr/share/applications/htop.desktop"
    "/usr/share/applications/avahi-discover.desktop"
    "/usr/share/applications/bssh.desktop"
    "/usr/share/applications/bvnc.desktop"
    "/usr/share/applications/bootsplash-manager.desktop"
    "/usr/share/applications/tlpui.desktop"
    "/usr/share/applications/qv4l2.desktop"
    "/usr/share/applications/qvidcap.desktop"
    "/usr/share/applications/lstopo.desktop"
    "/usr/share/applications/org.kde.kuserfeedback-console.desktop"
    "/usr/share/applications/designer.desktop"
    "/usr/share/applications/assistant.desktop"
    "/usr/share/applications/linguist.desktop"
    "/usr/share/applications/qdbusviewer.desktop"
    "/usr/share/applications/lftp.desktop"
    "/usr/share/applications/uxterm.desktop"
    "/usr/share/applications/xterm.desktop"
    "/usr/share/applications/org.kde.drkonqi.coredump.gui.desktop"
    "/usr/share/applications/org.kde.drkonqi.desktop"
    "/usr/share/applications/pcmanfm-qt.desktop"
    "/usr/share/applications/obconf-qt.desktop"
    "/usr/share/applications/xscreensaver-properties.desktop"
    "/usr/share/applications/nvtop.desktop"
)

for app in "${apps_to_hide[@]}"; do
    hide_app "$app"
done

# Hide KDE
apps_hide_kde=(
    "/usr/share/applications/compton-conf.desktop"
    "/usr/share/applications/pcmanfm-qt-desktop-pref.desktop"
)
for app in "${apps_hide_kde[@]}"; do
    hide_in_env "$app" "KDE"
done

# Hide LXQt
hide_in_env "/usr/share/applications/hp-uiscan.desktop" "LXQt"

# KInfoCenter
for f in /usr/share/applications/{,bigcontrolcenter/}org.kde.kinfocenter.desktop; do
    [[ -f "$f" ]] && sed -i 's/Documentation;//' "$f"
done

# HP Icons
sed -i 's/Icon=.*/Icon=hp_logo/' /usr/share/applications/bigcontrolcenter/hplip.desktop /usr/share/applications/hplip.desktop 2>/dev/null
sed -i 's/Icon=.*/Icon=scanner-hp/' /usr/share/applications/bigcontrolcenter/hp-uiscan.desktop /usr/share/applications/hp-uiscan.desktop 2>/dev/null

# Kate
f="/usr/share/applications/org.kde.kate.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Anotações|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g;s|Development;||g' "$f"

# Steam
f="/usr/share/applications/steam.desktop"
[[ -f "$f" ]] && sed -i 's|Steam (Runtime)|Steam|g;s|Categories=Network;FileTransfer;Game;|Categories=Game;|g' "$f"

# Gufw
f="/usr/share/applications/bigcontrolcenter/gufw.desktop"
if [[ -f "$f" ]]; then
    sed -i 's|Name=.*|Name=Firewall|g;s|Categories=.*|Categories=System|g' "$f"
    sed -i 's|Exec=gufw|Exec=bigsudo gufw-pkexec|g' "$f"
fi

# KDE Connect
for f in /usr/share/applications/{,bigcontrolcenter/}org.kde.kdeconnect.app.desktop; do
    [[ -f "$f" ]] && sed -i 's|kdeconnect-app|kdeconnect-settings|g;s|Name\[pt_BR\]=.*|Name[pt_BR]=Interagir com dispositivos Android|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g;s|Categories=Qt;KDE;Network|Categories=Qt;KDE;Utility|g;' "$f"
done

# ==============================================================================
# LIBREOFFICE & BACKUPS
# ==============================================================================

restore_check() {
    local target="$1"
    local source="$BACKUP_DIR/$2"
    local pattern="$3"
    
    [[ -f "$target" ]] || return
    if ! has_text "$target" "$pattern"; then
        [[ -f "$source" ]] && cp -f "$source" "$target"
    fi
}

# Put back the names of a LibreOffice entry after an update replaced the file.
# The packaged entry carries no translations; the stored copy carries the
# translated Name/GenericName/Comment of every language, with BigLinux's own
# Portuguese names. Only those lines come from it, per group: copying the whole
# copy also brought back its old MIME types and icons.
restore_names() {
    local target="$1"
    local source="$BACKUP_DIR/$2"
    local name
    [[ -f "$target" && -f "$source" ]] || return
    name="$(grep -m1 '^Name\[pt_BR\]=' "$source")"
    [[ -n "$name" ]] && has_text "$target" "$name" && return
    awk 'NR == FNR {
            if (/^\[/) group = $0
            else if (/^(Name|GenericName|Comment)\[[^]]+\]=/) names[group] = names[group] $0 "\n"
            next
        }
        /^(Name|GenericName|Comment)\[[^]]+\]=/ { next }
        { print }
        /^\[/ { printf "%s", names[$0] }' "$source" "$target" >"$target.tmp" &&
        mv -f "$target.tmp" "$target"
}

for app in math impress base calc draw writer; do
    restore_names "/usr/lib/libreoffice/share/xdg/$app.desktop" "$app.desktop"
done

# Category LibreOffice
[[ -f /usr/share/applications/libreoffice-math.desktop ]] && \
    sed -i '/Categories=/s/Education;//;/Categories=/s/Science;//;/Categories=/s/Math;//' /usr/share/applications/libreoffice-math.desktop

[[ -f /usr/share/applications/libreoffice-draw.desktop ]] && \
    sed -i '/Categories=/s/Graphics;//;/Categories=/s/2DGraphics;//' /usr/share/applications/libreoffice-draw.desktop

# ==============================================================================
# MORE APPS
# ==============================================================================

# Gimp
f="/usr/share/applications/gimp.desktop"
[[ -f "$f" ]] && sed -i "s|Name\[pt_BR\]=Editor de imagem|Name[pt_BR]=Editor de imagens Gimp|g" "$f"

# XScreensaver & Simple Scan (Append block)
append_pt_block() {
    local f="$1"
    local name="$2"
    [[ -f "$f" ]] || return
    if ! has_text "$f" 'Name[pt]'; then
        printf "Name[pt]=%s\nGenericName[pt]=\nComment[pt]=\n" "$name" >> "$f"
    fi
}
append_pt_block "/usr/share/applications/xscreensaver-properties.desktop" "Protetor de tela"
append_pt_block "/usr/share/applications/simple-scan.desktop" "Digitalizador de imagens"

# Skanpage
f="/usr/share/applications/org.kde.skanpage.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Digitalizador de imagens Skanpage|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# KWalletManager
for f in /usr/share/applications/{,bigcontrolcenter/}org.kde.kwalletmanager.desktop; do
    [[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Gerenciar senhas no sistema|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"
done

# Okular
f="/usr/share/applications/org.kde.okular.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Visualizador de PDF, Epub e outros|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g;s|Categories=.*|Categories=Qt;KDE;Office;Viewer;|g' "$f"

# Gwenview
f="/usr/share/applications/org.kde.gwenview.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Visualizador de imagens|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# KMines
f="/usr/share/applications/org.kde.kmines.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Campo minado|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# Restaurações baseadas em nome original (Inglês)
restore_check "/usr/share/applications/guvcview.desktop" "guvcview.desktop" 'Name=Webcam Guvc'
restore_check "/usr/share/applications/org.strawberrymusicplayer.strawberry.desktop" "org.strawberrymusicplayer.strawberry.desktop" 'Name=Music Player Strawberry'
restore_check "/usr/share/applications/rustdesk.desktop" "rustdesk.desktop" 'Name=Remote Desktop RustDesk'
restore_check "/usr/share/applications/smplayer.desktop" "smplayer.desktop" 'Name=Video Player SMPlayer'
restore_check "/usr/share/applications/net.nokyan.Resources.desktop" "net.nokyan.Resources.desktop" 'Name=Keep an eye on system resources'

# VokoscreenNG
f="/usr/share/applications/vokoscreenNG.desktop"
if [[ -f "$f" ]] && [[ -e "$BACKUP_DIR/guvcview.desktop" ]]; then
    if ! has_text "$f" 'Name[pt_BR]=Gravador de tela Voko'; then
        sed -i '/^Name=/a Name[pt_BR]=Gravador de tela Voko\nComment[pt_BR]=' "$f"
        sed -i '/^Name=/a Name[pt]=Gravador de tela Voko\nComment[pt]=' "$f"
    fi
fi

# Lutris
f="/usr/share/applications/net.lutris.Lutris.desktop"
[[ -f "$f" ]] && sed -i 's|Comment\[pt-BR\]=.*|Name[pt]=Plataforma de jogos Lutris|g;s|Comment\[id\]=.*|Comment[pt]=|g' "$f"

# Calculadora
f="/usr/share/applications/org.gnome.Calculator.desktop"
if [[ -f "$f" ]] && ! has_text "$f" 'Name[pt]='; then
    echo 'GenericName[pt]=Calculadora' >> "$f"
    echo 'Name[pt]=Calculadora' >> "$f"
fi

# Spectacle
f="/usr/share/applications/org.kde.spectacle.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=Spectacle|Name[pt_BR]=Captura de tela|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# Ark
f="/usr/share/applications/org.kde.ark.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Compactador de Arquivos|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# KFind
f="/usr/share/applications/org.kde.kfind.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Procurar arquivos|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g;s|OnlyShowIn=KDE;||g' "$f"

# Konsole
f="/usr/share/applications/org.kde.konsole.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=Konsole|Name[pt_BR]=Terminal|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# Dolphin
f="/usr/share/applications/org.kde.dolphin.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Gerenciador arquivos|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# Mintstick
sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Criar pen drive de boot|g' /usr/share/applications/mintstick.desktop 2>/dev/null
sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Criar pen drive de boot|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' /usr/share/applications/{,bigcontrolcenter/}mintstick-kde.desktop 2>/dev/null

# Mintstick Format
sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Formatar pen drive|g' /usr/share/applications/mintstick-format.desktop 2>/dev/null
sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Formatar pen drive|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' /usr/share/applications/{,bigcontrolcenter/}mintstick-format-kde.desktop 2>/dev/null

# System Settings
for f in /usr/share/applications/{,bigcontrolcenter/}kdesystemsettings.desktop; do
    [[ -f "$f" ]] && sed -i 's|preferences-system|breeze-settings|g;' "$f"
done

# KSysGuard
f="/usr/share/applications/org.kde.ksysguard.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Gerenciar tarefas|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# GParted
for f in /usr/share/applications/{,bigcontrolcenter/}gparted.desktop; do
    if [[ -f "$f" ]] && has_text "$f" 'Name[pt]=GParted'; then
        sed -i 's|^GenericName\[pt_BR\]=.*||;s|^Name\[pt_BR\]=.*||;s|^GenericName\[pt\]=.*|GenericName[pt]=|;s|^Name\[pt\]=.*|Name[pt]=Formatar ou particionar|' "$f"
    fi
done

# Onboard
rm -f /usr/share/applications/onboard-settings.desktop
f="/usr/share/applications/onboard.desktop"
if [[ -f "$f" ]] && ! has_text "$f" 'Name[pt_BR]=Teclado virtual'; then
    sed -i 's|^Name\[pt\(_BR\)\?\]=.*|Name[pt\1]=Teclado virtual|;s|^GenericName\[pt\(_BR\)\?\]=.*|GenericName[pt\1]=|;s|^Comment\[pt\(_BR\)\?\]=.*|Comment[pt\1]=|;s|Accessibility;||g' "$f"
fi

# Browsers
f="/usr/share/applications/google-chrome.desktop"
if [[ -f "$f" ]] && ! has_text "$f" 'Name[pt_BR]=Navegador Google Chrome'; then
    sed -i '/^GenericName\[pt_BR\]=/a Name[pt_BR]=Navegador Google Chrome' "$f"
    sed -i 's|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"
fi

f="/usr/share/applications/brave-browser.desktop"
[[ -f "$f" ]] && sed -i '/GenericName\[pt_BR\]=Navegador da Internet/a Name[pt_BR]=Navegador Brave' "$f"

f="/usr/share/applications/firefox.desktop"
[[ -f "$f" ]] && sed -i 's|GenericName\[pt_BR\]=.*|Name[pt_BR]=Navegador Firefox|g' "$f"

# qBittorrent
f="/usr/share/applications/org.qbittorrent.qBittorrent.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Cliente qBittorrent|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# KPat
f="/usr/share/applications/org.kde.kpat.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Paciência, Freecell e outros|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# Klipper
f="/usr/share/applications/org.kde.klipper.desktop"
[[ -f "$f" ]] && sed -i 's|Name\[pt_BR\]=.*|Name[pt_BR]=Histórico de copiar e colar|g;s|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"

# WPS Office
for app in "et:WPS Planilhas (Spreadsheets)" "wpp:WPS Apresentações (Presentation)" "wps:WPS Editor de textos (Writer)"; do
    suffix="${app%%:*}"
    name="${app#*:}"
    f="/usr/share/applications/wps-office-${suffix}.desktop"
    if [[ -f "$f" ]] && ! has_text "$f" "Name[pt_BR]=$name"; then
        sed -i '/^Name\[pt_BR\]=/d;/^GenericName\[pt_BR\]=/d;/^Comment\[pt_BR\]=/d' "$f"
        sed -i "/^GenericName=/a Name[pt_BR]=$name\nGenericName[pt_BR]= \nComment[pt_BR]=" "$f"
    fi
done
[[ -f /etc/xdg/menus/applications-merged/wps-office.menu ]] && sed -i 's/^/#/' /etc/xdg/menus/applications-merged/wps-office.menu

# XScreensaver Category
f="/usr/share/applications/xscreensaver-properties.desktop"
[[ -f "$f" ]] && sed -i 's|Categories=Settings;DesktopSettings;Security;X-XFCE;|Categories=System;DesktopSettings;Security;X-XFCE;|' "$f"

# OpenJDK
sed -i 's|cautious-launcher %f /usr/bin/java -jar|/usr/bin/java -jar %f|' /usr/share/applications/{,bigcontrolcenter/}openjdk*.desktop 2>/dev/null
for f in /usr/share/applications/{,bigcontrolcenter/}openjdk-8-policytool.desktop; do
    if [[ -f "$f" ]] && ! has_text "$f" 'Name[pt_BR]=Regras de segurança do Java'; then
        sed -i '/^Name=/a Name[pt_BR]=Regras de segurança do Java\nComment[pt_BR]=' "$f"
    fi
done

# Timeshift
for f in /usr/share/applications/{,bigcontrolcenter/}timeshift-gtk.desktop; do
    if [[ -f "$f" ]] && ! has_text "$f" 'Name[pt_BR]=Backups e snapshots'; then
        sed -i '/^Name=/a Name[pt_BR]=Backups e snapshots' "$f"
        printf "Comment[pt_BR]=\nGenericName[pt_BR]=\n" >> "$f"
        sed -i 's|Comment\[pt_BR\]=.*|Comment[pt_BR]=|g;s|GenericName\[pt_BR\]=.*|GenericName[pt_BR]=|g' "$f"
    fi
done

# Keyboard
f="/etc/default/keyboard"
if [[ -f "$f" ]] && has_text "$f" 'XKBOPTIONS=""'; then
    sed -i 's|XKBOPTIONS=""|XKBOPTIONS="terminate:ctrl_alt_bksp"|g' "$f"
fi

# Nvidia
f="/usr/share/applications/nvidia-settings.desktop"
if [[ -f "$f" ]]; then
    [[ -f /usr/share/applications/org.manjaro.pamac.manager.desktop ]] && \
        sed -i 's|Categories=.*|Categories=Settings;|g' /usr/share/applications/org.manjaro.pamac.manager.desktop
    
    if ! has_text "$f" "Name[pt_BR]="; then
        echo 'Name[pt_BR]=Configure NVIDIA' >> "$f"
    else
        sed -i "s/^Name\[pt_BR\]=.*/Name[pt_BR]=Configure NVIDIA/" "$f"
    fi
fi

# Kvantum & AppImageLauncher
update_settings_app() {
    local f="$1"
    local name="$2"
    [[ -f "$f" ]] || return
    sed -i '/^Categories/ s/.*/Categories=Settings;DesktopSettings;LXQt;X-XFCE-SettingsDialog;X-XFCE-PersonalSettings;X-GNOME-PersonalSettings;/' "$f"
    if has_text "$f" "Name[pt_BR]="; then
        sed -i "s/^Name\[pt_BR\].*/Name[pt_BR]=$name/" "$f"
    else
        echo "Name[pt_BR]=$name" >> "$f"
    fi
}

for d in /usr/share/applications /usr/share/applications/bigcontrolcenter; do
    update_settings_app "$d/kvantummanager.desktop" "Kvantum"
    update_settings_app "$d/appimagelaunchersettings.desktop" "Configurações do AppImage"
done
