# Author:       Li Junhao   l@x-cmd.com     # xrc
# shellcheck    shell=sh    disable=SC2039,SC3043

___x_cmd_http_new(){
    if alias "$O" 2>/dev/null; then
        http:warn "alias $O already exists."
        return $?
    fi

    ___x_cmd_http_make "$@"
    # shellcheck disable=SC2139
    alias "$name=O=$name http"
}

___x_cmd_http_del(){
    local result
    if result="$(alias "$O" 2>/dev/null)"; then
        result="${result#alias }"
        if [ "$result"  = "$O='O=$O dict'" ]; then
            ___x_cmd_http_free "$@" && unalias "$O"
            return $?
        fi
    fi
    printf "%s" "No such ___x_cmd_dict instance: $O" >&2
}

___x_cmd_http_make() {
    param:void
    O=$O ___x_cmd_dict  make
    [ -n "$1" ] && O=$O ___x_cmd_dict put url "${1}"
}


___x_cmd_http_free() {
    O=$O ___x_cmd_dict free
}

# TODO: in the future, we will open the default browswer, instead of opening the system browswer.
___x_cmd_http_browse() {
    local ___X_CMD_BROWSE_BROWSER="${___X_CMD_BROWSE_BROWSER:-$___X_CMD_BROWSE_BROWSER}"
    local website="${1:?Provide websites}"
    if [ -n "$___X_CMD_BROWSE_BROWSER" ]; then
        "$___X_CMD_BROWSE_BROWSER" "$website"
        return $?
    fi

    local edge_path="/c/Program\ Files\ \(x86\)/Microsoft/Edge/Application/msedge.exe"

    case "$(x os name)" in
        darwin)
                # open -a "/Applications/Safari.app" "$website" ;
                open "$website"
                return $? ;;
        win*)
                "$edge_path" "$website";
                return $? ;;
    esac

    local edge_path_mnt="/mnt/$edge_path"
    if [ -f "$edge_path" ]; then
        "$edge_path_mnt" "$website"
    elif command -v xdg-open >/dev/null; then
        command xdg-open "$website"
    elif command -v gnome-open >/dev/null; then
        command gnome-open "$website"
    else
        # Check wether
        http:debug "Could not detect the web ___X_CMD_BROWSE_BROWSER to use."
        return 1
    fi
}

# EndSection

# Section 2: Dict & Path
___x_cmd_http_dict() {
    param:void
    case $# in
        1) O=$O ___x_cmd_dict get "${1:?Provide dict key}" ;;
        2) O=$O ___x_cmd_dict put "${1:?Provide dict key}" "${2:?Provide dict value}" ;;
        *)
            echo "More than 2 variable provided" >&1
            return 2
            ;;
    esac
}

# TODO: how to cd back
___x_cmd_http_cd() {
    param:void
    if [ $# -eq 0 ]; then
        printf "%s" "$(O=$O ___x_cmd_dict get url 2>/dev/null)"
        return $?
    fi

    local target_url="${1%/}"

    local url
    url="$(O=$O ___x_cmd_dict get url 2>/dev/null)"
    case "$target_url" in
        http://*|https://*)
            O=$O ___x_cmd_dict put url "$target_url"
            printf "%s" "$target_url"
            ;;
        ..)
            case "$url" in
                *://*/*)
                    O=$O ___x_cmd_dict put url "${url%/*}" ;;
                *)
                    http:warn "No parant for %s" "$url"
                    return $? ;;
            esac
            ;;
        ../*)
            case "$url" in
                *://*/*)
                    O=$O ___x_cmd_dict put url "${url%/*}"
                    ___x_cmd_http_cd "${target_url#../}"
                    ;;
                *)
                    http:warn "No parant for %s" "$url"
                    return $?
            esac
            ;;
        path)
            shift
            if [ -z "$url" ]; then
                printf "%s" "${1#/}"
            else
                printf "%s" "${url%/}/${1#/}"
            fi
            ;;
        *)
            O=$O ___x_cmd_dict put url "${url%/}/${target_url#/}"
            printf "%s" "${url%/}/${1#/}"
            ;;
    esac
}

# ___x_cmd_http_path() {
#     local url
#     url="$(O=$O ___x_cmd_dict get url)"
#     if [ -z "$url" ]; then
#         printf "%s" "$1"
#     else
#         printf "%s" "${url%/}/${1#/}"
#     fi
# }

# TODO: http service, using python Simple HTTPSERVER or other implementation
# TODO: ?
