#!/bin/bash
# jgctl - menu config actions
# jgctl variable value config_file
. $HOME/.config/mabox/mabox.conf
case "$jgmenu_theme" in
obtheme)
OBTHEME=$(awk '/<theme>/ {while (getline n) {if (match(n, /<name>/))
          {l=n; exit}}} END {split(l, a, "[<>]"); print a[3]}' "$HOME/.config/openbox/rc.xml");
THEMERC="$HOME/.config/mabox/jgobthemes/${OBTHEME}.colorrc";;
*)
THEMERC="$HOME/.config/mabox/jgobthemes/${jgmenu_theme}.colorrc";;
esac

# Backup original theme file
if [ ! -f "${THEMERC}.bak" ]; then
    cp ${THEMERC} ${THEMERC}.bak
fi
theme () {
    mb-setvar jgmenu_theme=${1}
}
reset () {
    rm ${THEMERC}
    mv ${THEMERC}.bak ${THEMERC}
}
resetMBcolors() {
    mb-setvar jgmenu_theme=MBcolors
    mb-setvar item_height_factor=200
    reset
    case "$1" in
        show) 
        colorizer-menus -s
        ;;
        *):;;
    esac
}
color_menu_bg () {
    read MBG MBGA<<< "$(grep 'color_menu_bg ' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_menu_bg .*$" "color_menu_bg = $1 $MBGA" ${THEMERC}
    ;;
    *)
    sd "color_menu_bg .*$" "color_menu_bg = $MBG $1" ${THEMERC}
    ;;
    esac
    }
color_menu_bg_to () {
    read MBGT MBGTA<<< "$(grep 'color_menu_bg_to ' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_menu_bg_to.*$" "color_menu_bg_to = $1 $MBGTA" ${THEMERC}
    ;;
    *)
    sd "color_menu_bg_to.*$" "color_menu_bg_to = $MBGT $1" ${THEMERC}
    ;;
    esac
    }
color_menu_border () {
    read MBORDER MBORDERA<<< "$(grep 'color_menu_border' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_menu_border.*$" "color_menu_border = $1 $MBORDERA" ${THEMERC}
    ;;
    *)
    sd "color_menu_border.*$" "color_menu_border = $MBORDER $1" ${THEMERC}
    ;;
    esac
    }
menu_gradient_pos () {
    sd "menu_gradient_pos.*$" "menu_gradient_pos = $1" ${THEMERC}
    #mb-setvar menu_gradient_pos=${1}
    }
gradient () {
    read MBG MBGA<<< "$(grep 'color_menu_bg ' ${THEMERC} | cut -d'=' -f2)"
    read MBGT MBGTA<<< "$(grep 'color_menu_bg_to ' ${THEMERC} | cut -d'=' -f2)"
    sd "color_menu_bg .*$" "color_menu_bg = $1 $MBGA" ${THEMERC}
    sd "color_menu_bg_to.*$" "color_menu_bg_to = $2 $MBGTA" ${THEMERC}
# Item 
    ITEM_FG=$(pastel textcolor ${2}|pastel format hex)
    if [[ "${ITEM_FG}" == *"ffffff"* ]];then
        ITEM_FGCOLOR="#c0c0c0"
    else
        ITEM_FGCOLOR="#222222"
    fi
    
    
    read NFG NFGA<<< "$(grep 'color_norm_fg' ${THEMERC} | cut -d'=' -f2)"
    sd "color_norm_fg.*$" "color_norm_fg = $ITEM_FGCOLOR $NFGA" ${THEMERC}
    read NBG NBGA<<< "$(grep 'color_norm_bg' ${THEMERC} | cut -d'=' -f2)"
    sd "color_norm_bg.*$" "color_norm_bg = $2 $NBGA" ${THEMERC}
# Title (Separator with text)
    read TBG TBGA<<< "$(grep 'color_title_bg' ${THEMERC} | cut -d'=' -f2)"
    sd "color_title_bg.*$" "color_title_bg = $2 $TBGA" ${THEMERC}
    # calculate readable FG color
    TITLE_FG=$(pastel textcolor ${2}|pastel format hex)
    read TFG TFGA<<< "$(grep 'color_title_fg' ${THEMERC} | cut -d'=' -f2)"
    
    ###TITLE_FGCOLOR=$(pastel complement ${2}|pastel format hex)
    if [[ "${TITLE_FG}" == *"ffffff"* ]];then
        TITLE_FGCOLOR=$(pastel mix -f 0.7 '#ffffff' "${2}"|pastel format hex)
    else
        TITLE_FGCOLOR=$(pastel mix -f 0.7 '#000000' "${2}"|pastel format hex)
    fi
    sd "color_title_fg.*$" "color_title_fg = ${TITLE_FGCOLOR} $TFGA" ${THEMERC}
    ###sd "color_title_fg.*$" "color_title_fg = ${1} $TFGA" ${THEMERC}
    read TBORDER TBORDERA<<< "$(grep 'color_title_border' ${THEMERC} | cut -d'=' -f2)"
    TITLE_BORDER=$(pastel darken 0.05 ${1}|pastel format hex)
     sd "color_title_border.*$" "color_title_border = $TITLE_BORDER $TBORDERA" ${THEMERC}
# Selected (Active) item
    read SBG SBGA<<< "$(grep 'color_sel_bg' ${THEMERC} | cut -d'=' -f2)"
    alpha=${SBGA:-100}
    sd "color_sel_bg.*$" "color_sel_bg = $2 $alpha" ${THEMERC}
    ACTIVE_FG=$(pastel textcolor ${2}|pastel format hex)
    read SFG SFGA<<< "$(grep 'color_sel_fg' ${THEMERC} | cut -d'=' -f2)"
    sd "color_sel_fg.*$" "color_sel_fg = $ACTIVE_FG $SFGA" ${THEMERC}
    
    read SBORDER SBORDERA<<< "$(grep 'color_sel_border' ${THEMERC} | cut -d'=' -f2)"
    alpha=${SBORDERA:-100}
    sd "color_sel_border.*$" "color_sel_border = $1 $alpha" ${THEMERC}
    
# Separator line
    read SFG SFGA<<< "$(grep 'color_sep_fg' ${THEMERC} | cut -d'=' -f2)"
    SEP_FG=$(pastel mix -f 0.5 "${1}" "${2}"|pastel format hex)
    sd "color_sep_fg.*$" "color_sep_fg = $SEP_FG $SFGA" ${THEMERC}
# Menu border
    read MBORDER MBORDERA<<< "$(grep 'color_menu_border' ${THEMERC} | cut -d'=' -f2)"
    sd "color_menu_border.*$" "color_menu_border = $1 $MBORDERA" ${THEMERC}
}
sep_halign () {
    sd "sep_halign.*$" "sep_halign = $1" ${THEMERC}
    }
color_sep_fg () {
    read SFG SFGA<<< "$(grep 'color_sep_fg' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_sep_fg.*$" "color_sep_fg = $1 $SFGA" ${THEMERC}
    ;;
    *)
    sd "color_sep_fg.*$" "color_sep_fg = $SFG $1" ${THEMERC}
    ;;
    esac
}
color_title_bg () {
    read TBG TBGA<<< "$(grep 'color_title_bg' ${THEMERC} | cut -d'=' -f2)"
    #notify-send.sh "${1}" "${#1}"
    case "${#1}" in
    7) #color
    sd "color_title_bg.*$" "color_title_bg = $1 $TBGA" ${THEMERC}
    ;;
    *)
    sd "color_title_bg.*$" "color_title_bg = $TBG $1" ${THEMERC}
    ;;
    esac
}
color_title_fg () {
    read TFG TFGA<<< "$(grep 'color_title_fg' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_title_fg.*$" "color_title_fg = $1 $TFGA" ${THEMERC}
    ;;
    *)
    sd "color_title_fg.*$" "color_title_fg = $TFG $1" ${THEMERC}
    ;;
    esac
}
color_title_border () {
    read TBORDER TBORDERA<<< "$(grep 'color_title_border' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_title_border.*$" "color_title_border = $1 $TBORDERA" ${THEMERC}
    ;;
    *)
    sd "color_title_border.*$" "color_title_border = $TBORDER $1" ${THEMERC}
    ;;
    esac
}
item_border () {
    sd "item_border.*$" "item_border = $1" ${THEMERC}
    }
item_radius () {
    sd "item_radius.*$" "item_radius = $1" ${THEMERC}
    }
color_norm_bg () {
    read NBG NBGA<<< "$(grep 'color_norm_bg' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_norm_bg.*$" "color_norm_bg = $1 $NBGA" ${THEMERC}
    ;;
    *)
    sd "color_norm_bg.*$" "color_norm_bg = $NBG $1" ${THEMERC}
    ;;
    esac
}
color_norm_fg () {
    read NFG NFGA<<< "$(grep 'color_norm_fg' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_norm_fg.*$" "color_norm_fg = $1 $NFGA" ${THEMERC}
    ;;
    *)
    sd "color_norm_fg.*$" "color_norm_fg = $NFG $1" ${THEMERC}
    ;;
    esac
}
color_sel_bg () {
    read SBG SBGA<<< "$(grep 'color_sel_bg' ${THEMERC} | cut -d'=' -f2)"
    alpha=${SBGA:-100}
    case "${#1}" in
    7) #color
    sd "color_sel_bg.*$" "color_sel_bg = $1 $alpha" ${THEMERC}
    ;;
    *)
    sd "color_sel_bg.*$" "color_sel_bg = $SBG $1" ${THEMERC}
    ;;
    esac
}
color_sel_fg () {
    read SFG SFGA<<< "$(grep 'color_sel_fg' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_sel_fg.*$" "color_sel_fg = $1 $SFGA" ${THEMERC}
    ;;
    *)
    sd "color_sel_fg.*$" "color_sel_fg = $SFG $1" ${THEMERC}
    ;;
    esac
}
color_sel_border () {
    read SBORDER SBORDERA<<< "$(grep 'color_sel_border' ${THEMERC} | cut -d'=' -f2)"
    case "${#1}" in
    7) #color
    sd "color_sel_border.*$" "color_sel_border = $1 $SBORDERA" ${THEMERC}
    ;;
    *)
    sd "color_sel_border.*$" "color_sel_border = $SBORDER $1" ${THEMERC}
    ;;
    esac
    #read IBOR<<< "$(grep 'item_border' ${THEMERC} | cut -d'=' -f2)"
    #[[ ${IBOR} == "0" ]] && item_border 1
}
accent () {
    color_sel_bg "${1}"
    color_sel_fg "${2}"
    color_sel_border "${2}"
}
tweak () {
    case "$1" in
        solid)
        menu_gradient_pos none
        tweak opacity 100
        opacity color_norm_bg 0
        opacity color_sep_fg 30
        item_radius 0
        item_border 0
        ;;
        gradient)
        menu_gradient_pos right
        opacity color_norm_bg 10
        opacity color_sep_fg 0
        item_radius 3
        item_border 0
        ;;
        opacity)
        opacity color_menu_bg "$2"
        opacity color_menu_bg_to "$2"
        ;;
        sizing)
            case "$2" in
                tight)
                mb-setvar jgtools_padding=4
                mb-setvar jgtools_border=0
                mb-setvar submenu_spacing=2
                mb-setvar arrow_string=
                ;;
                normal)
                mb-setvar jgtools_padding=8
                mb-setvar jgtools_border=3
                mb-setvar submenu_spacing=3
                mb-setvar arrow_string=
                ;;
                wide)
                mb-setvar jgtools_padding=20
                mb-setvar jgtools_border=6
                mb-setvar submenu_spacing=6
                mb-setvar arrow_string=
                ;;
            esac
        ;;
        *):;;
    esac
    [[ "$3" == "menu" ]] && colorizer-menus -s 2>/dev/null
}

t_search_field () {
    [[ $search_field == "false" ]] && mb-setvar search_field=true || mb-setvar search_field=false
    mb-jgtools main ipc
}
t_apps_in_submenu () {
    [[ $apps_in_submenu == "true" ]] && mb-setvar apps_in_submenu=false || mb-setvar apps_in_submenu=true
    mb-jgtools main ipc
}
t_icons () {
    [[ $jgmenu_use_icons == "true" ]] && mb-setvar jgmenu_use_icons=false || mb-setvar jgmenu_use_icons=true
    mb-jgtools main ipc
}
border () {
    [[ "$jgtools_padding" -lt "${1}" ]] && mb-setvar jgtools_padding=${1}
    mb-setvar jgtools_border=${1}
    colorizer-menus -s
}
padding () {
    [[ "$jgtools_border" -gt "${1}" ]] && mb-setvar jgtools_border=${1}
    mb-setvar jgtools_padding=${1}
    colorizer-menus -s
}

opacity () {
  # jgctl opacity element value  
  read FUNC B COLOR OPACITY REST<<< "$(grep ${1} ${THEMERC})"
  #echo "$FUNC $B $COLOR $OPACITY $REST"
  
  sd "$1 .*= $COLOR.*$" "$FUNC = $COLOR $2 $REST" ${THEMERC}
  
}
savescheme () {
    case "$LANG" in
        pl*)SAVE_AS="Nowy motyw Menu"
            DESC="Zapisz obecnie ustawione kolory Menu jako nowy motyw..."
            LABEL="Nazwa:"
            NAME="nazwa";;
        *)  SAVE_AS="New Menu colorscheme"
            DESC="Save current Menu colors as colorscheme..."
            LABEL="Name:"
            NAME="colorscheme-name";;
    esac
    # ask for scheme name
    schemename=$(yad --center --width=300 --borders=20 --window-icon=mbcc --title "$SAVE_AS" --text="$DESC" --entry --entry-label="$LABEL" --entry-text="$NAME") || exit 1
    
    echo "${1}${schemename}" >> "$HOME/.config/colorizer/menus/userschemes2.csv"
}
applyscheme () {
theme MBcolors
line=$(awk 'NR == n' n=$1 "$HOME/.config/colorizer/menus/userschemes2.csv")
#notify-send.sh "$1" "${line}"
case "$1" in
    sys) SCHEMEFILE="/usr/share/mabox-colorizer/colorschemes/menus.csv";;
    usr) SCHEMEFILE="$HOME/.config/colorizer/menus/userschemes2.csv";;
esac

while IFS="|" read -r mbg mbga mbgt mbgta mborder mbordera tbg tbga tfg tfga tborder tbordera normbg normbga nfg nfga sbg sbga sfg sfga sborder sbordera sepfg sepfga b r p ss ibor irad a al sephal grad scheme_name
do
mb-setvar jgmenu_theme=MBcolors
color_menu_bg "${mbg}"
color_menu_bg_to "${mbgt}"
color_menu_border "${mborder}"
color_title_bg "${tbg}"
color_title_fg "${tfg}"
color_title_border "${tborder}"
color_norm_bg "${normbg}"
color_norm_fg "${nfg}"
color_sel_bg "${sbg}"
color_sel_fg "${sfg}"
color_sel_border "${sborder}"
color_sep_fg "${sepfg}"
menu_gradient_pos "${grad}"

#opacity
color_menu_bg "${mbga}"
color_menu_bg_to "${mbgta}"
color_menu_border "${mbordera}"
color_title_bg "${tbga}"
color_title_fg "${tfga}"
color_title_border "${tbordera}"
color_norm_bg "${normbga}"
color_norm_fg "${nfga}"
color_sel_bg "${sbga}"
color_sel_fg "${sfga}"
color_sel_border "${sbordera}"
color_sep_fg "${sepfga}"


item_border "${ibor}"
item_radius "${irad}"
sep_halign "${sephal}"

mb-setvar arrow_string=${a}
mb-setvar arrow_string_left=${al}

# missing: ( from mabox.conf )
mb-setvar jgtools_border=${b}
mb-setvar jgtools_padding=${p}
mb-setvar jgtools_radius=${r}
mb-setvar submenu_spacing=${ss}


#notify-send.sh "${scheme_name}" "${mbg}"
done < <(awk 'NR == n' n=$2 "$SCHEMEFILE")
}

delscheme() {
    sed -i ${1}d "$HOME/.config/colorizer/menus/userschemes2.csv"
}
mono () {
lighten=(0.92 0.8 0.65 0.45 0.28)
darken=(0.9 0.74 0.54 0.38 0.18)

if [ "${1}" == pick ];then 
    color=$(gpick -pso 2>/dev/null)
else
    color="${1}"
fi

if [ "${#color}" == 7 ];then
    for i in "${lighten[@]}"
    do
    pal+=("$(pastel mix -f $i "#ffffff" "$color"|pastel format hex)")
    done
    pal+=("$color")

    for i in "${darken[@]}"
    do
    pal+=("$(pastel mix -f $i "$color" "#000000"|pastel format hex)")
    done
else
    exit 0
fi

# colorize menu
if [ "$2" == "dark" ];then
    #notify-send.sh "$1" "gen_menu"
    color_menu_bg "${pal[8]}"
    color_menu_bg_to "${pal[7]}"
    color_menu_border "${pal[10]}"
    color_title_bg "${pal[9]}"
    color_title_border "${pal[9]}"
    color_title_fg "${pal[2]}"
    color_norm_bg "${pal[8]}"
    color_norm_fg "${pal[3]}"
    color_sel_bg "${pal[6]}"
    color_sel_fg "${pal[1]}"
    color_sep_fg "${pal[6]}"
elif [ "$2" == "light" ];then
    color_menu_bg "${pal[2]}"
    color_menu_bg_to "${pal[3]}"
    color_menu_border "${pal[1]}"
    color_title_bg "${pal[3]}"
    color_title_border "${pal[4]}"
    color_title_fg "${pal[10]}"
    color_norm_bg "${pal[2]}"
    color_norm_fg "${pal[8]}"
    color_sel_bg "${pal[4]}"
    color_sel_fg "${pal[10]}"
    color_sep_fg "${pal[3]}"
else #normal
ITEM_FG=$(pastel textcolor ${color}|pastel format hex)
    if [[ "${ITEM_FG}" == *"ffffff"* ]];then
        ITEM_FGCOLOR="#c0c0c0"
    else
        ITEM_FGCOLOR="#222222"
    fi

	color_menu_bg "$color"
	color_menu_bg_to "$color"
	color_menu_border "${pal[8]}"
    color_title_bg "${pal[7]}"
    color_title_border "${pal[7]}"
    color_title_fg "${pal[1]}"
    color_norm_bg "${pal[6]}"
    color_norm_fg "${ITEM_FGCOLOR}"
    color_sel_bg "${pal[4]}"
    color_sel_fg "${ITEM_FG}"
    color_sep_fg "${pal[4]}"
fi
    # opacity
    color_norm_bg 0

case "$3" in
 col)colorizer-menus -s 2>/dev/null;;
 stylemenu) jgwallpaperchanger -s jgmenus;;
 *):;;
esac
}
randomscheme(){
mb-setvar jgmenu_theme=MBcolors
themefile=$(find /usr/share/mb-jgtools/jgobthemes/ -type f -name *.colorrc |shuf -n 1)
#notify-send.sh "Theme:" "${themefile}"
cat ${themefile} > ~/.config/mabox/jgobthemes/MBcolors.colorrc
}
applyoldscheme(){
    #notify-send.sh "th" "${1}"
mb-setvar jgmenu_theme=MBcolors
cat ${1} > ~/.config/mabox/jgobthemes/MBcolors.colorrc
}

case "$1" in
    theme) theme "$2";;
    reset) reset ;;
    resetMBcolors) resetMBcolors "$2";;
    color_menu_bg) color_menu_bg "$2";;
    color_menu_bg_to) color_menu_bg_to "$2";;
    color_menu_border) color_menu_border "$2";;
    menu_gradient_pos) menu_gradient_pos "$2";;
    gradient) gradient "$2" "$3";;
    sep_halign) sep_halign "$2";;
    color_sep_fg) color_sep_fg "$2";;
    color_title_bg) color_title_bg "$2";;
    color_title_fg) color_title_fg "$2";;
    color_title_border) color_title_border "$2";;
    item_border) item_border "$2";;
    item_radius) item_radius "$2";;
    color_norm_bg) color_norm_bg "$2";;
    color_norm_fg) color_norm_fg "$2";;
    color_sel_bg) color_sel_bg "$2";;
    color_sel_fg) color_sel_fg "$2";;
    color_sel_border) color_sel_border "$2";;
    accent) accent "$2" "$3";;
    tweak) tweak "$2" "$3" "$4";;
    opacity) opacity "$2" "$3";;
    t_search_field)t_search_field;;
    t_apps_in_submenu) t_apps_in_submenu;;
    t_icons)t_icons;;
    border)border "$2";;
    padding)padding "$2";;
    mono) mono "$2" "$3" "$4";;
    savescheme) savescheme "$2";;
    applyscheme) applyscheme "$2" "$3";;
    delscheme) delscheme "$2";;
    randomscheme) randomscheme;;
    applyoldscheme) applyoldscheme "$2";;
    *) : ;;
esac
