# shellcheck shell=dash disable=SC2154

___x_cmd_fjo_repo_fs(){
    param:scope  ___x_cmd_fjo
    param:subcmd ___x_cmd_fjo_repo_fs              \
        cat              "download repo file"

    param:subcmd:try
    param:run

    ___x_cmd_fjo_repo_fs _param_help_doc
    return 1
}

___x_cmd_fjo_repo_fs_cat(){
    param:scope     ___x_cmd_fjo
    param:dsl       '
options:
    #1              "repo path parameter"                                                   <>
    --repo|-r       "<owner_path>/<repo_path>"                                              <>:RepoName
    --ref           "The name of the commit/branch/tag. Default using default branch"       <>=""
    --dir|-d        "file save path"                                                        <>=""
'
    param:run
    ___x_cmd_fjo_param_init_owner_repo

    [ -n "$1" ]          || M='Please provide a file name' arg:ret:64
    [ -n "$owner_repo" ] || M='Please provide --repo <owner/repo>"' arg:ret:64
    local fname
    local download_url
    ___x_cmd_fjo_curl get "/repos/${owner_repo}/contents/${1}" ref | {
        ___x_cmd jo env . fname=.name download_url=.download_url
        ___x_cmd_fjo_repo_fsp_cat___download
    }
}

___x_cmd_fjo_repo_fsp(){
    param:scope  ___x_cmd_fjo
    param:subcmd ___x_cmd_fjo_repo_fsp              \
        cat              "download repo file"

    param:subcmd:try
    param:run

    ___x_cmd_fjo_repo_fsp _param_help_doc
    return 1
}

___x_cmd_fjo_repo_fsp_cat(){
    param:scope     ___x_cmd_fjo
    param:dsl       '
options:
    #1              "repo path parameter"                                                   <>
    --repo|-r       "<owner_path>/<repo_path>"                                              <>:RepoName
    --ref           "The name of the commit/branch/tag. Default using default branch"       <>=""
    --dir|-d        "file save path"                                                        <>=""
'
    param:run
    ___x_cmd_fjo_param_init_owner_repo

    [ -n "$1" ]          || M='Please provide a file name' arg:ret:64
    [ -n "$owner_repo" ] || M='Please provide --repo <owner/repo>"' arg:ret:64
    local fname
    local download_url
    ___x_cmd_fjo_repo_fsp_cat___curl "$1" | {
        ___x_cmd jo env . fname=.name download_url=.download_url
        ___x_cmd_fjo_repo_fsp_cat___download
    }
}

___x_cmd_fjo_repo_fsp_cat___download(){
    local targetfp
    [ -n "$download_url" ] || N=fjo M="not found download path" log:ret:1
    if [ -n "$dir" ]; then
        targetfp="$dir/$fname"
        ___x_cmd ensurefp "$targetfp"
    else
        targetfp="./$fname"
    fi
    [ ! -f "$targetfp" ] || ___x_cmd ui yesno "file already exists. Do you want to overwrite it?" || return
    fjo:info "download [file=$fname] to [save_path=${targetfp%\/*}]"
    ___x_cmd curl -o "$targetfp" "$download_url"
}

___x_cmd_fjo_repo_fsp_cat___curl(){
    local _file="$1"
    ___x_cmd_fjo_cur    _curl_endpoint_tmp:=endpoint 2>/dev/null
    [ -n "$_curl_endpoint_tmp" ] || return 1
    [ -z "$ref" ] || ref="?ref=$ref"

    local _url="$_curl_endpoint_tmp/repos/${owner_repo}/contents/${_file}${ref}"
    fjo:debug --url "$_url" "get download url"
    ___x_cmd curl -s "$_url" -H 'accept: application/json'
}
