# shellcheck shell=dash

___x_cmd_docker_ps(){
    [ $# -gt 0 ]    || set -- --app

    local op="$1";  shift
    case "$op" in
        -h|--help)  ___x_cmd help -m docker ps          ;;
        *)          ___x_cmd_docker_ps_main "$op" "$@"  ;;
    esac
}

___x_cmd_docker_ps_main(){
    local IMAGE_OPTS=

    local datamode=auto
    local ___X_CMD_DOCKER_PS_PREFIX="$___X_CMD_DOCKER_PS_PREFIX"

    while [ $# -gt 0 ]; do
        case "$1" in
            -j|--json)      datamode=json;  shift   ;;
            --csv)          datamode=csv;   shift   ;;
            --tsv)          datamode=tsv;   shift   ;;
            --app)          datamode=app;   shift   ;;
            --auto)         datamode=auto;  shift   ;;

            -p|--prefix)    ___X_CMD_DOCKER_PS_PREFIX="$2";    shift 2 ;;

            -s|--size|-l|--latest|-a|--all|--no-trunc|-q|--quiet)
                ___x_cmd cmdstr IMAGE_OPTS "$1"
                shift ;;

            -f|--filter|--format|-n|--last)
                [ -n "$2" ] || {
                    docker:error "The '$1' parameter cannot be empty."
                    return 1
                }
                ___x_cmd cmdstr IMAGE_OPTS "$1" "$2"
                shift 2 ;;
            *)
                docker:error "Unkown options ==> $1";  return 64 ;;
        esac
    done

    ___X_CMD_DOCKER_PS_PREFIX="$___X_CMD_DOCKER_PS_PREFIX" ___x_cmd_docker_ps___"$datamode"
}

___x_cmd_docker_ps___auto(){
    if ___x_cmd_is_stdout2tty; then     ___x_cmd_docker_ps___app
    else                                ___x_cmd_docker_ps___csv
    fi
}

___x_cmd_docker_ps___json(){
    ___x_cmd cmdstr IMAGE_OPTS --format '{{json .}}'

    eval ___x_cmd___docker_origin ps --no-trunc "$IMAGE_OPTS" | {
        if [ -z "$___X_CMD_DOCKER_PS_PREFIX" ]; then
            ___x_cmd jq -s .
        else
            ___x_cmd jq --arg prefix "$___X_CMD_DOCKER_PS_PREFIX" -s '.[] | select(.Names | startswith( $prefix ))' | ___x_cmd jq -s .
        fi
    }
}

# prefix, using attribute filter
___x_cmd_docker_ps___parse_json2csv(){
    ___x_cmd jo .\* | \
    ___x_cmd ja jl2c  \
            .ID .Names  .Status .Image  .Command    .Ports  .Networks   .CreatedAt      .RunningFor .Size   .State  .Labels .LocalVolumes   .Mounts |\
        ___x_cmd csv header --add  \
            id  name    status  image   command     port    network     created_at      running_for  size    state   label   local_volume     mount
}

___x_cmd_docker_ps___csv(){
    ___x_cmd_docker_ps___json | ___x_cmd_docker_ps___parse_json2csv
}

___x_cmd_docker_ps___tsv(){
    ___x_cmd_docker_ps___csv "$@" | ___x_cmd csv totsv
}


___x_cmd_docker_ps___app(){
    eval ___x_cmd_docker_ps___app_ "$IMAGE_OPTS"
}

___x_cmd_docker_ps___app___inner_remove(){
    case "$1" in
        x:loop-request:r*)
            local id=
            id="${1##*"$___X_CMD_UNSEENCHAR_001"}"
            id="${id%%,*}"
            [ -n "$id" ] || return 1
            ___x_cmd ui yesno "Remove container: x docker container rm -f $id" || return 0
            ___x_cmd docker container rm -f "$id" || return 1
            ;;
        *)  return 1 ;;
    esac
}

___x_cmd_docker_ps___app_(){
    # TODO: X_KASM_PREFIX should be exported ...
    # TODO: --clear -- ctrl-d clear, ctrl-c don't clear

    docker:info "Ctrl-D to exit. Ctrl-C to interrupt."
    local ___X_CMD_CSV_APP_SHBIN_CODE=

    local ___X_CMD_CSV_APP_DATA_id=""
    local ___X_CMD_CSV_APP_DATA_name=""
    local ___X_CMD_CSV_APP_DATA_status=""
    local ___X_CMD_CSV_APP_DATA_image=""
    local ___X_CMD_CSV_APP_DATA_command=""
    local ___X_CMD_CSV_APP_DATA_port=""
    local ___X_CMD_CSV_APP_DATA_network=""
    local ___X_CMD_CSV_APP_DATA_created_at=""
    local ___X_CMD_CSV_APP_DATA_running_for=""
    local ___X_CMD_CSV_APP_DATA_size=""
    local ___X_CMD_CSV_APP_DATA_state=""
    local ___X_CMD_CSV_APP_DATA_label=""
    local ___X_CMD_CSV_APP_DATA_local_volume=""
    local ___X_CMD_CSV_APP_DATA_mount=""

    ___X_CMD_CSV_APP_SHBIN_CODE="xrc docker; " \
    ___X_CMD_DOCKER_PS_PREFIX="$___X_CMD_DOCKER_PS_PREFIX" \
        ___x_cmd csv app --clear --return var \
            --loop-action r "remove" "Force the removal of a running container" \
            --loop-processor ___x_cmd_docker_ps___app___inner_remove \
            -- ___x_cmd_docker_ps_main "$@" --csv || return 1

    local container_id=
    container_id="$___X_CMD_CSV_APP_DATA_id"

    [ -n "$container_id" ] || return 0

    ___x_cmd_docker_ps___app_choose "$container_id" "$___X_CMD_CSV_APP_DATA_name" "$___X_CMD_CSV_APP_DATA_state"
}

___x_cmd_docker_ps___app_choose(){
    if [ -z "$___x_cmd_docker_ps_app_next" ]; then
        ___x_cmd_docker_ps_app_next(){
            local container_id="$1"
            local container_name="$2"
            local state="$3"

            set --      "Next for container: $container_name"



            case "$state" in
                paused)
                    set --  "$@"    "x docker container restart $container_id"
                    set --  "$@"    "x docker container unpause $container_id"
                    set --  "$@"    "x docker container stop    $container_id"
                    ;;
                exited)
                    set --  "$@"    "x docker container start   $container_id"
                    set --  "$@"    "x docker container rm      $container_id"
                    ;;
                running)
                    set --  "$@"    "x docker snapx --name $container_name sh"
                    set --  "$@"    "x docker container restart $container_id"
                    set --  "$@"    "x docker container pause   $container_id"
                    set --  "$@"    "x docker container stop    $container_id"
                    ;;
            esac

                    set --  "$@"    "x docker container rm -f   $container_id"
                    set --  "$@"    "x docker container inspect $container_id"

            local id=
            local cmd=
            ___x_cmd ui select id,cmd "$@" "EXIT"     || return 1
            docker:debug "run command -> $cmd"

            ___X_CMD_DOCKER_PS_EXIT=""
            case "$cmd" in
                EXIT)       ___X_CMD_DOCKER_PS_EXIT=1 ; return 0;  ;;
                *)
                            docker:info --cmd "$cmd" "Executing selected command"
                            eval "$cmd"
            esac
        }
    fi

    ___x_cmd_docker_ps_app_next "$1" "$2" "$3"
}
