# shellcheck shell=dash
___x_cmd_osv_sarif___pip(){

    local project_dir=
    local format=
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)
                    ___x_cmd help -m osv sarif pip  ; return 0;;
            --csv|--json|--yml|--llm|--app)
                    format="${1#--}"                ; shift 1 ;;
            --co|,)
                    shift;
                    X_CO_MSHOT_CMD="x osv sarif pip" ___x_cmd co --mshot "$@"
                    return ;;
            --*)    M="Unknown option: $1"   N=osv  log:ret:1 ;;
            *)      project_dir="${1}"              ; shift 1 ;;
        esac
    done

    local x_=
    ___x_cmd_osv_sarif___pip_which_lockfile_ "$project_dir" || {
        osv:info "Cannot find any lockfile for pip project."
        return 1
    }

    local lockfile="$x_"
    osv:info "Scan $lockfile."

    [ -n "$format" ] || {
        if ___x_cmd_is_stdout2tty && ___x_cmd_runmode_allow_manual; then
            format=app
        else
            format=raw
        fi
    }

    ___x_cmd_osv_sarif___pip___"$format"    "$lockfile"
}

___x_cmd_osv_sarif___pip_which_lockfile_(){
    x_=
    local project_dir="$1"; [ -n "$project_dir" ] || project_dir="."
    local lockfile=
    if [ -f "$project_dir/pdm.lock" ];then
        lockfile="$project_dir/pdm.lock"
    elif [ -f "$project_dir/Pipfile.lock" ];then
        lockfile="$project_dir/Pipfile.lock"
    elif [ -f "$project_dir/poetry.lock" ];then
        lockfile="$project_dir/poetry.lock"
    elif [ -f "$project_dir/requirements.txt" ];then
        lockfile="$project_dir/requirements.txt"
    else
        return 1
    fi
    x_="$lockfile"
}

___x_cmd_osv_sarif___pip___csv(){
    ___x_cmd_osv_sarif___pip___json "$@" | ___x_cmd cawk -m j/json,j/jiter,csv \
        -f "$___X_CMD_ROOT_MOD/osv/lib/awk/sarif.csv.awk"
}

___x_cmd_osv_sarif___pip___llm(){
    :
    # ___x_cmd_osv_sarif___pip___yml "$@"
    # ___x_cmd_osv_sarif___pip___json "$@"         | \
    #     ___x_cmd jq '.runs[].tool.driver.rules' | \
    #     ___x_cmd jq -r '.[] | .help.text'

    # ___x_cmd_osv_sarif___pip___json "$@" | \
    #     ___x_cmd jq '.runs[].tool.driver.rules[] |= del(.help)'
    ___x_cmd_osv_sarif___pip___csv "$@"
}

___x_cmd_osv_sarif___pip___yml(){
    ___x_cmd_osv_sarif___pip___json "$@" | ___x_cmd j2y
}

___x_cmd_osv_sarif___pip___json(){
    ___x_cmd_osv_sarif___pip___raw "$@"
}

___x_cmd_osv_sarif___pip___raw(){
    local askcache=
    case "$1" in
        --askcache)     shift 1; askcache=1; ;;
    esac
    local lockfile="$1"

    if [ -z "$askcache" ]; then
        ___x_cmd_osv_sarif___raw "$lockfile"
        return
    fi

    # ___x_cmd ccmd v1hascache --expiration 1h --md5file
    ___x_cmd ccmd v1 --expiration 1h \
        --md5file "$lockfile" -- ___x_cmd_osv_sarif___raw "$lockfile"
}

___x_cmd_osv_sarif___pip___app(){
    local data=
    local line_count=

    data="$(___x_cmd_osv_sarif___pip___csv "$@")"
    line_count="$(printf "%s" "$data" | wc -l)"

    if [ "$line_count" -gt 1 ]; then
        printf "%s\n" "$data" | ___x_cmd csv app \
            --table-view Id,Level,Message \
            --preview Message,shortDescription,fullDescription,Helps
    else
        osv:info "Not issue found."
    fi
}
