/*
 * Copyright 2026 Oleg Borodin <onborodin@gmail.com>
 *
 * This work is published and licensed under a Creative Commons
 * Attribution-NonCommercial-NoDerivatives 4.0 International License.
 *
 * Distribution of this work is permitted, but commercial use and
 * modifications are strictly prohibited.
 */
package accntcli

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

func (cli *Client) doHTTPCall(ctx context.Context, host, obj, oper string, req []byte) ([]byte, error) {
	var err error
	var res []byte

	reader := bytes.NewReader(req)
	ref, err := NewReferer(host, obj, oper)
	if err != nil {
		return res, err
	}
	httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, ref.Point(), reader)
	if err != nil {
		return res, err
	}
	httpReq.Header.Set("User-Agent", cli.userAgent)
	httpReq.Header.Set("Accept", "*/*")
	httpResp, err := cli.httpClient.Do(httpReq)
	if err != nil {
		return res, err
	}
	defer httpResp.Body.Close()
	if httpResp.StatusCode != http.StatusOK {
		err := fmt.Errorf("Unexpected response code: %s", httpResp.Status)
		return res, err
	}
	contentLength := httpResp.Header.Get("Content-Length")
	if contentLength == "" {
		err := fmt.Errorf("Content-Length header is missing")
		return res, err
	}
	blobSize, err := strconv.ParseInt(contentLength, 10, 64)
	if err != nil {
		return res, err
	}
	buffer := bytes.NewBuffer(nil)
	recSize, err := io.Copy(buffer, httpResp.Body)
	if blobSize != recSize {
		err := fmt.Errorf("Mismatch declared and actual body size, %d and %d", blobSize, recSize)
		return res, err
	}
	res = buffer.Bytes()
	return res, err
}
