# shellcheck shell=dash disable=2034,3060,1090,2296,2016

xrc:mod:lib     theme       comp/vcm    comp/container  comp/ssh    comp/container  comp/transient

# Section: prompt components

xrc gitconfig

___x_cmd_theme_comp_message(){
    # if true; then
    if ___x_cmd_gitconfig__themehintrequired; then
        x_msg_text="Git configure modified. Run \`x gitconfig apply\`"
        return
    fi
    return 0
}

# Deprecated
___x_cmd_theme_comp_username(){
    x_username="${___X_CMD_THEME_USER}"
    # if [ -n "$SSH_CONNECTION" ] || [ -f "/.dockerenv" ] 2>/dev/null; then
    #     x_username="${___X_CMD_THEME_USER}${SEP:-@}${___X_CMD_THEME_HOST}"
    # else
    #     x_username="${___X_CMD_THEME_USER}"
    # fi
}

# EndSection

# Section: theme lib for create top prompt
if [ "$___X_CMD_SHELL" = dash ]; then

______x_cmd_theme_prompt_remove_escapes_() {
    # printf "%s" "$(printf "%s" "$1" | ___x_cmd_cmds_awk '{ gsub(/((%B|%U)?(%\{)*%\{\033|\001\033|\\\[\033|\033)\[([0-9]+;)*[0-9]+m(\002|\\]|(%\})*(%b%u)?)?/, ""); print $0 }')"
    # x_="$(printf "%s" "$1" | ___x_cmd_cmds_awk '{ gsub(/((%B|%U)?(%\{)*%\{\033|\001\033|\\\[\033|\033)\[([0-9]+;)*[0-9]+m(\002|\\]|(%\})*(%b%u)?)?/, ""); print $0 }')"
    x_="$(DATA="$1" ___x_cmd_cmds_awk 'BEGIN{
        DATA = ENVIRON["DATA"];
        gsub(/((%B|%U)?(%\{)*%\{\033|\001\033|\\\[\033|\033)\[([0-9]+;)*[0-9]+m(\002|\\]|(%\})*(%b%u)?)?/, "", DATA);
        print DATA
    }'</dev/null)"
}

______x_cmd_theme_prompt_remove_presuf(){
    x_="$(DATA="$1" ___x_cmd_cmds_awk 'BEGIN{
        DATA = ENVIRON["DATA"];
        gsub("%[}{BUbu]|\001|\002", "", DATA);
        print DATA
    }'</dev/null)"
}

else

______x_cmd_theme_prompt_remove_escapes___gdel_(){
    local str="$1"
    local start="$2"
    local end="$3"

    local part1=
    x_=""
    local i=1
    while [ -n "$str" ]; do
        i="$((i+1))"
        [ "$i" -lt 200 ] || {
            x_="$str"
            theme:error "fail at ______x_cmd_theme_prompt_remove_escapes___gdel_"
            return
        }

        part1="${str%%"${start}"*"${end}"*}"
        x_="${x_}${part1}"
        [ "$part1" != "$str" ] || return
        str="${str#*"${start}"*"${end}"}"
    done
}

______x_cmd_theme_prompt_remove_escapes_() {
    x_="${1//\%[BUbu]/}"

    ______x_cmd_theme_prompt_remove_escapes___gdel_ "$x_" "%{%{"                            "%}%}"
    ______x_cmd_theme_prompt_remove_escapes___gdel_ "$x_" "%{"                              "%}"
    ______x_cmd_theme_prompt_remove_escapes___gdel_ "$x_" "\\[${___X_CMD_UNSEENCHAR_033}["  "m\\]"
    ______x_cmd_theme_prompt_remove_escapes___gdel_ "$x_" "${___X_CMD_UNSEENCHAR_033}["     "m"

    x_="${x_//${___X_CMD_UNSEENCHAR_001}/}"
    x_="${x_//${___X_CMD_UNSEENCHAR_002}/}"
}

______x_cmd_theme_prompt_remove_presuf_(){
    x_="${1//\%[BUbu\}\{]/}"
    x_="${x_//${___X_CMD_UNSEENCHAR_001}/}"
    x_="${x_//${___X_CMD_UNSEENCHAR_002}/}"
}

fi

###
 # @description: can set left and right prompt in ___x_cmd_theme_use_two_column_layout_
 # @param1 left_prompt
 # @param2 right_prompt
###

___x_cmd_theme_use_two_column_layout_() {
    x_=
    local left_prompt="$1"
    local right_prompt="$2"

    local right_prompt_result
    local right_prompt_leng
    [ -z "$left_prompt" ] && return
    if [ -z "$right_prompt" ]; then
        x_="$left_prompt"
        return
    fi
    local move_cursor_rightmost="${___X_CMD_UNSEENCHAR_033}[500C"

    if [ "$#" -eq 2 ]; then
        ______x_cmd_theme_prompt_remove_escapes_ "$right_prompt"
        # right_prompt_result="$(______x_cmd_theme_prompt_remove_escapes "$right_prompt")"
        right_prompt_result="$x_"
    else
        right_prompt_result="$3"
    fi

    if [ -n "$ZSH_VERSION" ]; then
        # zsh PROMPT interprete %n... after evaluation.
        right_prompt_leng=$((${#${(%):-$right_prompt_result}}+1))
        left_prompt="${left_prompt}%{${move_cursor_rightmost}%}"
        left_prompt="${left_prompt}%{${___X_CMD_UNSEENCHAR_033}[${right_prompt_leng}D%}"
    elif [ -n "$BASH_VERSION" ]; then
        # PS1 interprete \u before evaluation.
        right_prompt_leng=$((${#right_prompt_result}+1))
        left_prompt="${left_prompt}${move_cursor_rightmost}"
        left_prompt="${left_prompt}${___X_CMD_UNSEENCHAR_033}[${right_prompt_leng}D"
    fi
    # TODO: is ash support this like bash?
    # TODO: if in dash, just using | to seperate
    x_="${left_prompt} ${right_prompt}"
}

alias theme:col2_=___x_cmd_theme_use_two_column_layout_
# EndSection

# Section: loader main function
# shellcheck disable=SC2034
___x_cmd_theme_load_format_runner___wrapper(){
    ___X_CMD_THEME_USER="$1"
    # Path
    ___X_CMD_THEME_PATH="$2"
    ___X_CMD_THEME_FULL_PATH="$3"

    # Date
    ___X_CMD_THEME_DATE="$4"
    ___X_CMD_THEME_TIME_H_M_S="$5"
    ___X_CMD_THEME_TIME_H12_M_S="$6"
    ___X_CMD_THEME_TIME_H_M="$7"
    ___X_CMD_THEME_TIME_H12_M="$8"

    # Host
    ___X_CMD_THEME_HOST="$9"
    ___X_CMD_THEME_FULL_HOST="${10}"

    # Color
    ___X_CMD_COLOR_PRE="${11}"
    ___X_CMD_COLOR_SUF="${12}"

    ___x_cmd_theme_load_format_runner
}

___x_cmd_theme_load_format_runner(){
    theme:envsense
    ___x_cmd_theme_prompt_format

    ! command -v ___x_cmd_cd_history___ps1 >/dev/null || ___x_cmd_cd_history___ps1

    if [ -n "$ZSH_VERSION" ]; then
        local ___X_CMD_COLOR_PRE=''
        local ___X_CMD_COLOR_SUF=''
    else
        local ___X_CMD_COLOR_PRE='\['
        local ___X_CMD_COLOR_SUF='\]'
    fi
}

# load theme file
___x_cmd_theme_load_format() {
    . "${1:?Provide theme file}"

    # TODO: config which envrinonments to pass
    if [ -n "$ZSH_VERSION" ]; then
        setopt PROMPT_SUBST
        # PROMPT interprete %n... after evaluation.
        unset PROMPT
        PROMPT='$(___X_CMD_THEME_EXIT_STATUS="$?" ___x_cmd_theme_load_format_runner)'
    elif [ "$___X_CMD_SHELL" != 'dash' ];then
        unset PS1
        # TODO: maybe PROMPT_COMMAND have problem
        # PS1 interprete \u before evaluation.
        PS1="\$(___X_CMD_THEME_EXIT_STATUS=\"\$?\" ___x_cmd_theme_load_format_runner___wrapper \"\u\" \"\W\" \"\w\" \"\d\" \"\t\" \"\T\" \"\A\" \"\@\" \"\h\" \"\H\" \"\[\" \"\]\")"
    else
        unset PS1
        # PS1 interprete \u before evaluation.
        PS1="\$(___X_CMD_THEME_EXIT_STATUS=\"\$?\" ___x_cmd_theme_load_format_runner___wrapper \"\$(whoami)\" \"\$(basename \"\$(pwd)\")\" \"\$(pwd)\" \"\$(date \"+%y-%m-%d\")\" \"\$(date \"+%H:%M:%S\")\" \"\$(date \"+%I:%M:%S\")\" \"\$(date \"+%H:%M\")\" \"\$(date \"+%I:%M\")\")"
    fi
}

# EndSection
