#!/bin/bash
#
#    colorizer - set of tools for Mabox (auto)theming
#    Copyright (C) 2022-2023 Daniel Napora    <napcok@gmail.com>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.


me="colorizer-conky -s"
CONKYDIR="$HOME/.config/conky"
BASECONKY="$CONKYDIR/sysinfo_mbcolor.conkyrc"
COLORIZERDIR="$HOME/.config/colorizer"

CONKYTHEMEDIR="$COLORIZERDIR/conky/themes"
if [ ! -d "$CONKYTHEMEDIR" ];then
mkdir -p "$CONKYTHEMEDIR"
rsync -a /usr/share/mabox-colorizer/themes/conky/* ${CONKYTHEMEDIR}/
fi

LNG=${LANG:0:2}
if [ ! -f "${BASECONKY}" ]; then
if [ -d "/usr/share/mabox/lang/$LNG/.config/conky" ]; then
rsync -a /usr/share/mabox/lang/$LNG/.config/conky/* ${CONKYDIR}/
else
rsync -a /usr/share/mabox/lang/en/.config/conky/* ${CONKYDIR}/
fi
fi
CNF_DIR="$HOME/.config/colorizer/conky"
CNF_FILE="$CNF_DIR/conky.cfg"
[ ! -d "$CNF_DIR" ] && mkdir -p "$CNF_DIR" 
if [ ! -f $CNF_FILE ]; then
cat <<EOF > ${CNF_FILE}
update_notifications=true
EOF
fi

case "$LANG" in
    pl*)
    COLORIZECONKY="Conky Manager"
    NO_CONKY_RUNNING="Brak uruchomionych Conky"
    RUN_CONKY_SESSION="Uruchom zapisaną sesję"
    MOVEABLEALL="Ustaw wszystkie (<i>przeciągaj</i>)..."
    NOT_FULLY_SUPPORTED="Częściowo wspierane..."
    UNSUPPORTED="Conky - częściowo wspierane"
    UNSUPPORTED_START="kliknij aby uruchomić"
    GENERATEFROMWP="Generuj z kolorów tapety"
    LIGHTBG="Jasne tło"
    DARKBG="Ciemne tło"
    GLOBALSETTINGS="Ustawienia globalne <small>(dla wszystkich)</small>"
    REGENERATE="Motywy kolorów"
    OPENTHEMEDIR="Otwórz katalog motywów"
    APPLY_THEME="Zastosuj motyw"
    DEFCOLOR="Domyślny kolor <small>(tekst i ramka)</small>"
    COLOR_0="Kolor 0 <small>(tekst2)</small>"
    COLOR_1="Kolor 1 <small>(większy tekst)</small>"
    COLOR_2="Kolor 2 <small>(pasek/graf)</small>"
    BACKGROUND="Kolor tła"
    TRANSPARENT="Przezroczyste?"
    YES="Tak"
    NO="Nie"
    FONTS="Czcionka"
    SELECTFONT="Wybierz czcionkę..."
    INCREASE="Powiększ"
    DECREASE="Pomniejsz"
    OLINE="Obrys"
    SHADOW="Cień"
    DRAW="Rysuj"
    BORDERS="Obramowanie"
    STIPPLED_BORDERS="Nakrapiane"
    SOLID_LINE="linia ciągła"
    RUNNING_CONKIES="Uruchomione Conky"
    STOP_ALL="Zatrzymaj wszystkie"
    MORECONKIES="Więcej Conky..."
    CLICKTOSTART="Kliknij aby uruchomić"
    STARTALL="Uruchom wszystkie"
    RESET="Resetuj"
    RESETALL="Resetuj wszystkie"
    RESETCOLORS="Przywróć domyślne kolory"
    AREYOUSURE="Czy aby napewno?"
    ;;
    *)
    COLORIZECONKY="Conky Manager"
    NO_CONKY_RUNNING="No Conky running"
    RUN_CONKY_SESSION="Run Conky session"
    MOVEABLEALL="Make moveable all..."
    NOT_FULLY_SUPPORTED="Partially supported"
    UNSUPPORTED="partially supported Conkies"
    UNSUPPORTED_START="click to start"
    GENERATEFROMWP="Generate from wallpaper colors"
    LIGHTBG="Light Background"
    DARKBG="Dark Background"
    GLOBALSETTINGS="Global settings <small>(apply to all)</small>"
    REGENERATE="Color schemes"
    OPENTHEMEDIR="Open schemes dir"
    APPLY_THEME="Apply colorscheme"
    DEFCOLOR="Default color <small>(text and border)</small>"
    COLOR_0="Color 0 <small>(text2)</small>"
    COLOR_1="Color 1 <small>(bigger text)</small>"
    COLOR_2="Color 2 <small>(bars/graphs)</small>"
    BACKGROUND="Background color"
    TRANSPARENT="Transparent?"
    YES="Yes"
    NO="No"
    FONTS="Font"
    SELECTFONT="Select Font..."
    INCREASE="Increase"
    DECREASE="Decrease"
    OLINE="Outline"
    SHADOW="Shadow"
    DRAW="Draw"
    BORDERS="Borders"
    STIPPLED_BORDERS="Stippled borders"
    SOLID_LINE="solid line"
    RUNNING_CONKIES="Running Conkys"
    STOP_ALL="Stop All"
    MORECONKIES="More Conkies Available"
    CLICKTOSTART="...click to start"
    STARTALL="Start all"
    RESET="Reset"
    RESETALL="Reset all to defaults"
    RESETCOLORS="Restore default colors"
    AREYOUSURE="Are you sure?"
    ;;
esac

getvalues () {
    read WINTRANS <<< "$(grep own_window_transparent ${BASECONKY} | cut -d'=' -f2 | cut -d"," -f1)"
    read FONTDEF <<< "$(grep "font .*=.*,$" ${BASECONKY} | cut -d'=' -f2,3 |cut -d"'" -f2)"
    FONT=${FONTDEF%:*}
    FONTSIZE=${FONTDEF#*=}
    read WINCLR <<< "$(grep own_window_colour ${BASECONKY} | cut -d'=' -f2 | cut -d"'" -f2)"
    [[ $WINCLR =~ ^#.* ]] && : || WINCLR="#${WINCLR}"
    
    read CLR <<< "$(grep default_color ${BASECONKY} | cut -d'=' -f2 | cut -d"'" -f2)"
    [[ $CLR =~ ^#.* ]] && : || CLR="#${CLR}"
    read CLR0 <<< "$(grep color0 ${BASECONKY} | cut -d'=' -f2 | cut -d"'" -f2)"
    [[ $CLR0 =~ ^#.* ]] && : || CLR0="#${CLR0}"
    read CLR1 <<< "$(grep color1 ${BASECONKY} | cut -d'=' -f2 | cut -d"'" -f2)"
    [[ $CLR1 =~ ^#.* ]] && : || CLR1="#${CLR1}"
    read CLR2 <<< "$(grep color2 ${BASECONKY} | cut -d'=' -f2 | cut -d"'" -f2)"
    [[ $CLR2 =~ ^#.* ]] && : || CLR2="#${CLR2}"
    read OUTLINE <<< "$(grep draw_outline ${BASECONKY} | cut -d'=' -f2 | cut -d"," -f1)"
    read SHADES <<< "$(grep draw_shades ${BASECONKY} | cut -d'=' -f2 | cut -d"," -f1)"
    SHADOWS="no"
    [[ "$OUTLINE" == "true" ]] && SHADOWS="outline"
    [[ "$SHADES" == "true" ]] && SHADOWS="shadow"
    
    read BORD <<< "$(grep draw_borders ${BASECONKY} | cut -d'=' -f2 | cut -d"," -f1)"
    read STIP <<< "$(grep stippled_borders ${BASECONKY} | cut -d'=' -f2 | cut -d"," -f1)"
}
    
if pgrep -af "conky.*mbcolor" >/dev/null; then
    
    getvalues
    [[ "$WINTRANS" == false ]] && BG="bgcolor='$WINCLR'" || BG=""

    out+=("^sep($COLORIZECONKY)")
    out+=("  $MOVEABLEALL,conkyctl makemoveableall")
  
    #while read -r pid b c confpath 
    #do
    #    filename=${confpath##*/}
    #    name=${filename%%_mb*}
    #    out+=("${name^},^pipe(conkyctl single ${confpath})")
    #done < <(pgrep -af "conky.*mbcolor")

    # array with running conkies - only filenames with full path
    readarray -t running < <(pgrep -af "conky -c " | cut -d' ' -f4)
    
    #array with all conkies found
    #for i in "$CONKYDIR"/*.con* "$CONKYDIR"/**/*.con*; do
    for i in "$CONKYDIR"/*.conkyrc "$CONKYDIR"/*.conf "$CONKYDIR"/**/*.conkyrc "$CONKYDIR"/**/*.conf; do
        if [[ "$i" == *mbcolor* ]];then
            supported+=("$i")
        else
            if [[ "$i" != *"/*"* ]];then
            unsupported+=("$i")
            fi
        fi
    done
        
    #array with not  started conkies
    notstarted=($(echo ${running[@]} ${supported[@]} ${unsupported[@]} ${unsupported[@]}| tr ' ' '\n' | sort | uniq -u))
    notstarted_unsupported=($(echo ${running[@]} ${supported[@]} ${supported[@]} ${unsupported[@]} | tr ' ' '\n' | sort | uniq -u))
    
    RCONKIES="${#running[@]}"
    NSCONKIES="${#notstarted[@]}"
    ALLSUPP=$(($RCONKIES+$NSCONKIES))
    #notify-send.sh "$ALLSUPP" "$RCONKIES $NSCONKIES"
    if [[ ${#running[@]} > 0 ]];then
        out+=("^sep($RUNNING_CONKIES)")
        for c in ${running[@]};do
            filename=${c##*/}
            name=${filename%%_mb*}
            name2=${name%%.con*}
            title=${name2//_/ }
            out+=("${title^},^pipe(conkyctl single ${c})")
        done
        out+=("^sep()")
        out+=("$STOP_ALL (${#running[@]}),conky_toggle;sleep .5;$me")
    fi
    if [[ ${#notstarted[@]} > 0 ]];then
        out+=("^sep($MORECONKIES)")
        if [[ "$ALLSUPP" < 15 ]];then
            out+=("^sep(<small><i>$CLICKTOSTART</i></small>)")
            for c in ${notstarted[@]};do
                filename=${c##*/}
                name=${filename%%_mb*}
                title=${name//_/ }
                out+=("${title^},conkyctl startone ${c};$me")
            done
            if [[ ${#notstarted[@]} > 1 ]];then
                out+=("^sep()")
                out+=("$STARTALL (${#notstarted[@]}),conkyctl startall;$me")
            fi
        else # too many conkies not started -> show them in submenu
           out+=("$CLICKTOSTART (${#notstarted[@]}),^checkout(nstarted)")
           out2+=("^tag(nstarted)")
            for c in ${notstarted[@]};do
                filename=${c##*/}
                name=${filename%%_mb*}
                title=${name//_/ }
                out2+=("${title^},conkyctl startone ${c};$me")
            done
            if [[ ${#notstarted[@]} > 1 ]];then
                out2+=("^sep()")
                out2+=("$STARTALL (${#notstarted[@]}),conkyctl startall;$me")
            fi 
        fi
    fi
    if [[ ${#notstarted_unsupported[@]} > 0 ]];then
        out+=("^sep()")
        out+=("$NOT_FULLY_SUPPORTED (${#notstarted_unsupported[@]}),^checkout(unsup)")
        out2+=("^tag(unsup)")
        out2+=("^sep($UNSUPPORTED)")
        out2+=("^sep($UNSUPPORTED_START)")
        for c in ${notstarted_unsupported[@]};do
            filename=${c##*/}
            name=${filename%%.con*}
            title=${name//_/ }
            out2+=("${title^},conkyctl startone ${c};$me")
            done
    fi
    
    
  #GLOBAL START
    out+=("^sep($GLOBALSETTINGS)")
   
    if [ "$WINTRANS" == false ];then
        out+=("<small><span bgcolor='$WINCLR'>   </span><span weight='bold' ${BG} fgcolor='$WINCLR'>  AbCd  </span></small>  $BACKGROUND,^pipe(mbclr '$WINCLR' conkyctl win_bgcolor_all '${BACKGROUND}' '$me')")
    else
        out+=("<small><span bgcolor='$WINCLR'> transparent </span></small>  $BACKGROUND,^pipe(mbclr '$WINCLR' conkyctl win_bgcolor_all '${BACKGROUND}' '$me')")
    fi
    out+=("$TRANSPARENT [ <b>$WINTRANS</b> ],^checkout(trans)")
    out+=("^sep()")
    
   
    out+=("<small><span bgcolor='$CLR'>   </span><span weight='bold' ${BG} fgcolor='$CLR'>  AbCd  </span></small>  $DEFCOLOR,^pipe(mbclr '$CLR' conkyctl default_color_all '${DEFCOLOR}' '$me')")
    out+=("<small><span bgcolor='$CLR0'>   </span><span weight='bold' ${BG} fgcolor='$CLR0'>  AbCd  </span></small>  $COLOR_0,^pipe(mbclr '$CLR0' conkyctl color0_all '${COLOR_0}' '$me')")
    out+=("<small><span bgcolor='$CLR1'>   </span><span weight='bold' ${BG} fgcolor='$CLR1'>  AbCd  </span></small>  $COLOR_1,^pipe(mbclr '$CLR1' conkyctl color1_all '${COLOR_1}' '$me')")
    out+=("<small><span bgcolor='$CLR2'>   </span><span weight='bold' ${BG} fgcolor='$CLR2'>  AbCd  </span></small>  $COLOR_2,^pipe(mbclr '$CLR2' conkyctl color2_all '${COLOR_2}' '$me')")
    #out+=("^sep()")
    out2+=("^tag(trans)")
    out2+=("^sep($TRANSPARENT)")
    out2+=("$YES,conkyctl transparent_all true;$me")
    out2+=("$NO,conkyctl transparent_all false;$me")
    out+=("^sep()")
    
    out+=("<span bgcolor='#282828'> <span fgcolor='#ebdbb2'></span> <span fgcolor='#98971a'></span> <span fgcolor='#d79921'></span> <span fgcolor='#cc241d'></span> </span> $REGENERATE,^checkout(regenconky)")
    out2+=("^tag(regenconky)")
    out2+=("^sep($REGENERATE)")
    out2+=("^sep($GENERATEFROMWP)")
    out2+=("$LIGHTBG,w2theme conky light;$me")
    out2+=("$DARKBG,w2theme conky dark;$me")
    out2+=("^sep($APPLY_THEME)")
    for i in "${COLORIZERDIR}"/conky/themes/*.colors
    do
    source "${i}"
    themefilename=${i##*/}
    themename=${themefilename%%.col*}
    out2+=("<span bgcolor='$own_window_colour'>   <span fgcolor='$default_color'></span> <span fgcolor='$color0'></span> <span fgcolor='$color1'></span> <span fgcolor='$color2'></span>   </span>  $themename,conkyctl settheme_all $themefilename;$me")
    done
    out2+=("^sep()")
    out2+=("   $OPENTHEMEDIR,xdg-open ${COLORIZERDIR}/conky/themes/")
    
    out+=("^sep()")
    
    out+=("$FONTS [ <b>$FONT $FONTSIZE</b> ],^checkout(font)")
    out2+=("^tag(font)")
    out2+=("^sep($FONTS)")
    out2+=("$SELECTFONT,mb-setfont conky_all;$me")
    out2+=("^sep()")
    out2+=("<tt>++</tt> $INCREASE,conkyctl basefont_inc_all;$me")
    out2+=("<tt>--</tt> $DECREASE,conkyctl basefont_dec_all;$me")
    out+=("$OLINE/$SHADOW [ <b>$SHADOWS</b> ],^checkout(outline)")
    out2+=("^tag(outline)")
    out2+=("^sep($DRAW $OLINE/$SHADOW?)")
    out2+=("$NO,conkyctl shades_all no;$me")
    out2+=("^sep()")
    out2+=("$DRAW $SHADOW,conkyctl shades_all shadow;$me")
    out2+=("$DRAW $OLINE,conkyctl shades_all outline;$me")


    out+=("^sep()")
    out+=("$BORDERS [ <b>$BORD $STIP</b> ],^checkout(border)")
    out2+=("^tag(border)")
    out2+=("^sep($DRAW $BORDERS?)")
    out2+=("$YES,conkyctl draw_borders_all true;$me")
    out2+=("$NO,conkyctl draw_borders_all false;$me")
    out2+=("^sep($STIPPLED_BORDERS?)")
    out2+=("0 ($SOLID_LINE),conkyctl stippled_borders_all 0;$me")
    out2+=("^sep()")
    out2+=("1,conkyctl stippled_borders_all 1;$me")
    out2+=("2,conkyctl stippled_borders_all 2;$me")
    out2+=("3,conkyctl stippled_borders_all 3;$me")
    out2+=("4,conkyctl stippled_borders_all 4;$me")

    
    out+=("^sep($RESET)")
    out+=("  $RESETCOLORS,^checkout(resetcolors)")
    out2+=("^tag(resetcolors)")
    out2+=("^sep($AREYOUSURE)")
    out2+=("$YES,conkyctl resetcolorsall;$me")
    #out+=("  $RESETALL,^checkout(resetall)") NOT SAFE!!!
    #out2+=("^tag(resetall)")
    #out2+=("^sep($AREYOUSURE)")
    #out2+=("$YES,rm $BASECONKY;$me")

else
    out+=("^sep($NO_CONKY_RUNNING)")
    SESSIONFILE=$HOME/.config/conky/conky-sessionfile
    if [ -f "$SESSIONFILE" ];then
    read N REST <<< $(wc -l "${SESSIONFILE}")
        if [[ "$N" -gt "0" ]];then
            out+=("$RUN_CONKY_SESSION ($N Conky),conky_toggle;$me")
        fi
    fi
    
    out+=("^sep(<small><i>$CLICKTOSTART</i></small>)")
    for confpath in "$CONKYDIR"/*_mb*;
    do
    filename=${confpath##*/}
    name=${filename%%_mb*}
    title=${name//_/ }
    out+=("${title^},conkyctl startone ${confpath};$me")
    done
    out+=("^sep()")
    out+=("$STARTALL,conkyctl startall;$me")
fi

### RUN
if [[ "$1" == "-s" ]]; then
    . /usr/share/mb-jgtools/pipemenu-standalone.cfg
    . $HOME/.config/mabox/mabox.conf
    
    source $HOME/.config/colorizer/colorizer.conf

    out+=("^sep()")
    out+=(" ⮜⮜⮜    Colorizer,colorizer -s")

    if [[ "$colorizer_size" == "full" ]];then
    eval $(xdotool getdisplaygeometry --shell)
    MENU_HEIGHT_MIN="$HEIGHT"
    MENU_HEIGHT_MAX=$MENU_HEIGHT_MIN
    jgtools_radius=0
    menu_margin_x="0"
    else
    MENU_VALIGN="center"
    menu_margin_x=${submenu_spacing:-0}
    fi
    
    MENU_HALIGN="left"
    jgmenu_icon_size=0

    [ $(pidof picom) ] && MENU_RADIUS=$jgtools_radius
    [ -z $jgmenu_use_borders ] && menu_border=0
    JGWIDTH=$((jgtools_padding + 278 + jgtools_padding))
    MENU_PADDING_TOP=$((jgtools_padding + 158))
    
    #WALLPAPER
    read WALLPATH<<< $(grep file "$HOME"/.config/nitrogen/bg-saved.cfg | cut -d'=' -f2)
    THUMBDIR="$HOME/.cache/colorizer/thumbs"
    mkdir -p ${THUMBDIR}
    NAME=${WALLPATH////_}
    if [[ "${NAME}" =~ ^_home_.* ]]; then
        n=${#HOME}
        ((n++))
        NAME=${NAME:${n}}
    fi
    THUMB="${THUMBDIR}/${NAME}.png"
    if [[ ! -f "$THUMB" ]]
        then
        convert ${WALLPATH} -resize 270x150^ -gravity center -extent 270x150 ${THUMB}
    fi
    
    mkconfigfile

cat <<EOF > ${MENU_ITEMS}
@icon,,$((jgtools_padding + 4)),$((jgtools_padding + 4)),270,150,4,left,top,,,${THUMB}
@rect,,$((jgtools_padding + 4)),$((jgtools_padding + 120)),270,34,0,left,top,#222222 20,#222222 70,
#@icon,,$((jgtools_padding + 4)),$((jgtools_padding + 4)),270,150,4,left,top,,,/usr/share/mabox-colorizer/img/colorizer-conky.png
@text,,$((jgtools_padding + 158)),$((jgtools_padding + 124)),120,30,0,left,top,#FFFFFF ,${WINCLR},<span size='10400' font_family='Ubuntu'><b>Colorizer</b> Conky</span>
@rect,,$((jgtools_padding + 244)),$((jgtools_padding + 6)),29,60,0,left,top,#FFFFFF 30,${WINCLR} 60,
@rect,,$((jgtools_padding + 5)),$((jgtools_padding + 92)),29,60,0,left,top,#FFFFFF 30,${WINCLR} 60,
@rect,,$((jgtools_padding + 36)),$((jgtools_padding + 112)),29,40,0,left,top,#FFFFFF 30,${WINCLR} 60,
$(printf '%s\n' "${out[@]}")
$(printf '%s\n' "${out2[@]}")
EOF

    jgmenu --config-file=${CONFIG_FILE} --csv-file=${MENU_ITEMS} 2>/dev/null
    exit 0
fi

printf '%s\n' "${out[@]}"
printf '%s\n' "${out2[@]}"