# shellcheck shell=dash  disable=2016

___x_cmd_gx_migrate_release_gh2gc(){
    local gh_owner_repo="$1"
    local gc_owner_repo="${2:-$gh_owner_repo}"
    local app_name="${gh_owner_repo##*"/"}"
    {
        x gh repo release ls --repo "${gh_owner_repo}" -j | x tee "${___X_CMD_ROOT_TMP}/gx/___x_cmd_gx_github_${app_name}"
        # x gx gh repo release ls
        x gcode repo release ls --repo "${gc_owner_repo}" -j | x tee "${___X_CMD_ROOT_TMP}/gx/___x_cmd_gx_gitcode_${app_name}"
        # x gx gcode repo release
    } | {
        CHECK_PARAM=tag_name RET_FIELD=id ___x_cmd_gx_migrate_release___verify
    } | (
        while read -r release_name && read -r tag_name && read -r release_id && read -r is_exist && read -r second_release_id; do
            [ "${release_name}" = "null" ] || unset release_name

            if [ "${is_exist}" = "false" ]; then
                gx:debug "x gcode repo release create --repo ${gc_owner_repo} ${release_name:+"--name"} ${release_name:+"${release_name}"} ${tag_name}"
                x gcode repo release create --repo "${gc_owner_repo}" ${release_name:+"--name"} ${release_name:+"${release_name}"} "${tag_name}"
            fi

            ___x_cmd_gx_migrate_release_gh2gc___attachment "${gh_owner_repo}" "${gc_owner_repo}" "${release_id}" "${tag_name}" || {
                # TODO: log
                return 1
            }
        done
    )
}

___x_cmd_gx_migrate_release_gh2gc___attachment(){
    local gh_owner_repo="$1"
    local gc_owner_repo="$2"
    local gh_release_id="$3"
    local gc_tag_name="$4"

    {
        # x gh repo release attachment ls --repo "${gh_owner_repo}" --release_id "${gh_release_id}" --json
        < "${___X_CMD_ROOT_TMP}/gx/___x_cmd_gx_github_${app_name}" \
            x jo env '.*' .id .assets -- '[ "$id" != '"${gh_release_id}"' ] || printf "%s\n" "$assets"'

        # x gcode repo release attachment ls --repo "${gc_owner_repo}" --tag_name "${gc_tag_name}" --json
        < "${___X_CMD_ROOT_TMP}/gx/___x_cmd_gx_gitcode_${app_name}" \
            x jo env '.*' .tag_name assets=.assets.links -- '[ "$tag_name" != '"${gc_tag_name}"' ] || printf "%s\n" "$assets"'
    } | {
        #
        CHECK_PARAM=name RET_FIELD=browser_download_url ___x_cmd_gx_migrate_release___verify attachment
    } | {
        while read -r file_name && read -r download_url; do
            gx:debug "downloading file:${download_url}"
            x curl -L "${download_url}" -o "${___X_CMD_ROOT_TMP}/gx/${file_name}" || {
                # TODO:
                return 1
            }
            local file_size
            file_size=$(wc -c "${___X_CMD_ROOT_TMP}/gx/${file_name}")
            file_size=${file_size% *}
            gx:debug "download file size:${file_size}"
            x gcode repo release attachment upload --repo "${gc_owner_repo}" --tag_name "${gc_tag_name}" "${___X_CMD_ROOT_TMP}/gx/${file_name}" || {
                gx:error "Uploading file to gitcode fails"
                return 1
            }
            x rm "${___X_CMD_ROOT_TMP}/gx/${file_name}"
        done
    }
}
