# shellcheck shell=dash

# docker run x/fedora:latest
# docker run x/ubuntu:latest
# docker run x/alpine:latest

___x_cmd log init docker
xrc:mod:lib docker      ximg/_index     origin/_index   ext/_index   mirror/_index   daemon/_index  \
    app setup advise id simg/_index     snap/_index     refit/_index    cfg     fz/_index           \
    snapins/_index

___x_cmd_docker___main(){
    [ "$#" -gt 0 ] || set - --help
    local ___X_CMD_DOCKER_MAIN_OPTS=''; while true; do
        case "$1" in
            --version)
                ___x_cmd___docker_origin "$1"
                return
                ;;
            -D|--debug|--tls|--tlsverify)
                ___x_cmd cmdstr ___X_CMD_DOCKER_MAIN_OPTS "$1";  shift
                ;;
            --config|\
            -c|--context|\
            -H|--host|\
            -l|--log-level|\
            --tlscacert|--tlscert|--tlskey)
                ___x_cmd cmdstr ___X_CMD_DOCKER_MAIN_OPTS "$1" "$2"; shift 2
                ;;
            -h|--help)
                ___x_cmd help -m docker;  return 0 ;;
            *)
                break
        esac
    done

    local op="$1"; [ "$#" -eq 0 ] || shift
    case "$op" in
        # hub)            x dockerhub "$@" ;;

        setup)          ___x_cmd_docker_setup               "$@"  ;;
        ximg)           ___x_cmd_docker_ximg                "$@"  ;; # x-cmd docker

        img|image)      ___x_cmd_docker_image               "$@"  ;;
        images)         ___x_cmd_docker_images              "$@"  ;;

        nw|network)     ___x_cmd_docker_network             "$@"  ;;
        info)           ___x_cmd_docker_info                "$@"  ;;
        container)      ___x_cmd_docker_container           "$@"  ;;
        ps|start|run|exec|rmfa)
                        ___x_cmd_docker_"$op"               "$@"  ;;

        rund|runit|id|id_|refit|cmdinfo)
                        ___x_cmd_docker_"$op"               "$@"  ;;

        mirror)         ___x_cmd_docker_mirror              "$@"  ;;
        d|daemon)       ___x_cmd_docker_daemon              "$@"  ;;

        lz)             ___x_cmd_docker_lz                  "$@"  ;;

        x/*)            ___x_cmd_docker_rritq "$op"         "$@"  ;;
        %*)             ___x_cmd_docker_rritq "x/${op#%}"   "$@"  ;;

        # alp|alpine|bus|busybox|cen|centos|deb|debian|\
        # fed|fedora|ubu|ubuntu|gen|gentoo|\
        # roc|rocky|alm|almal)
        #                 ___x_cmd_docker_rritq "x/$op"       "$@"  ;;

        alp|alpine)       ___x_cmd_docker_alpine            "$@"  ;;
        deb|debian)       ___x_cmd_docker_debian            "$@"  ;;
        fed|fedora)       ___x_cmd_docker_fedora            "$@"  ;;
        ubu|ubuntu)       ___x_cmd_docker_ubuntu            "$@"  ;;
        kal|kali)         ___x_cmd_docker_kali              "$@"  ;;
        arc|arch)         ___x_cmd_docker_arch              "$@"  ;;
        nix|nixos)        ___x_cmd_docker_nixos             "$@"  ;;

        simg|snap|snapx|fz|snaplookup|ecpull)
                        ___x_cmd_docker_"$op"               "$@"  ;;

        //)             ___x_cmd_docker_snap                "$@"  ;;

        :*)             ___x_cmd_docker_snapx "${op#:}"     "$@"  ;;

        ".")            ___x_cmd_docker_snap                "$@"  ;;

        --cfg|cfg)      ___x_cmd_docker_cfg                 "$@"  ;;
        cur|--cur)      ___x_cmd_docker_cur                 "$@" ;;
        --init|init)    ___x_cmd_docker_init                "$@"  ;;
        # ""|app)
        #                 ___x_cmd_docker_app      "$op"      "$@"  ;;

        --)             ___x_cmd___docker_origin            "$@"  ;;

        *)              ___x_cmd___docker_origin "$op"      "$@"  ;;
    esac
}

___X_CMD_DOCKER_SOCK_FP="/var/run/docker.sock"


___X_CMD_DOCKER_BINFP=""

# shellcheck    disable=SC2086,SC2089,SC2090
___x_cmd___docker_origin(){

    [ -n "$___X_CMD_DOCKER_BINFP" ] || {
        local x_
        if ___x_cmd_whichbin_ docker; then
            ___X_CMD_DOCKER_BINFP="$x_"
        elif [ -x /usr/local/bin/docker ]; then
            # In Mac, docker is installed in /usr/local/bin, however, it is not in the PATH sometimes.
            ___X_CMD_DOCKER_BINFP=/usr/local/bin/docker
        elif [ -x /usr/bin/docker ]; then
            ___X_CMD_DOCKER_BINFP=/usr/bin/docker
        elif ___x_cmd_whichbin_ podman ; then
            ___X_CMD_DOCKER_BINFP="$x_"         # Experimentally using podman
        else
            N=docker M="docker command not found" log:ret:1
        fi
    }

    # TODO: arg:unshift "$___X_CMD_DOCKER_MAIN_OPTS"
    # TODO: N=___X_CMD_DOCKER_MAIN_OPTS arg:unshift

    # set -- $___X_CMD_DOCKER_MAIN_OPTS "$@"

    eval "set -- $___X_CMD_DOCKER_MAIN_OPTS \"\$@\""
    set -- "$___X_CMD_DOCKER_BINFP" "$@"

    if [ -e "$___X_CMD_DOCKER_SOCK_FP" ] && [ ! -w "$___X_CMD_DOCKER_SOCK_FP" ]; then
        set -- ___x_cmd sudo "$@"
    fi

    "$@"
}

___x_cmd_docker_lz(){
    if [ -e "$___X_CMD_DOCKER_SOCK_FP" ] && [ ! -w "$___X_CMD_DOCKER_SOCK_FP" ]; then
        # ___x_cmd sudo lazydocker "$@"
        ___x_cmd snap run --sudo lazydocker "$@"
    else
        ___x_cmd lazydocker "$@"
    fi
}
