/*
  * Copyright 2026 Oleg Borodin <onborodin@gmail.com>
 *
 *
*/

package repocli

import (
	"context"
	"fmt"
	"io"
	"net/http"
	"strconv"
)

func (cli *Client) PatchUpload(ctx context.Context, rawrepo string, src io.Reader, uploc string, size int64) (string, error) {
	var err error
	var ouloc string

	ref, err := NewReferer(rawrepo)
	if err != nil {
		return ouloc, err
	}
	uri, err := ref.PatchEP(uploc)
	if err != nil {
		return ouloc, err
	}
	req, err := http.NewRequestWithContext(ctx, http.MethodPatch, uri, src)
	if err != nil {
		return ouloc, err
	}
	req.Header.Set("User-Agent", cli.userAgent)
	req.Header.Set("Content-Type", "application/octet-stream")
	req.Header.Set("Content-Length", strconv.FormatInt(size, 10))
	resp, err := cli.httpClient.Do(req)
	if err != nil {
		return ouloc, err
	}
	resp.Body.Close()
	if resp.StatusCode != http.StatusAccepted {
		err = fmt.Errorf("Upload not accepted, code %d", resp.StatusCode)
		return ouloc, err
	}
	ouloc = resp.Header.Get("Location")
	if ouloc == "" {
		err := fmt.Errorf("Empty blob location declaration")
		return ouloc, err
	}
	return ouloc, err
}
