package client

import (
	"context"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"strings"
	"time"
)

const internalSecretHeader = "X-Internal-Secret"

// EmbeddingEngineClient calls embedding-engine internal maintenance endpoints.
type EmbeddingEngineClient struct {
	baseURL    string
	secret     string
	httpClient *http.Client
}

// NewEmbeddingEngineClient creates a client for embedding-engine internal APIs.
func NewEmbeddingEngineClient(baseURL, secret string) *EmbeddingEngineClient {
	baseURL = strings.TrimRight(strings.TrimSpace(baseURL), "/")
	return &EmbeddingEngineClient{
		baseURL: baseURL,
		secret:  strings.TrimSpace(secret),
		httpClient: &http.Client{
			Timeout: 30 * time.Second,
		},
	}
}

// DeleteRepoVectors removes all Qdrant vectors scoped to repoID.
func (c *EmbeddingEngineClient) DeleteRepoVectors(ctx context.Context, repoID string) error {
	if c == nil || c.baseURL == "" {
		return nil
	}
	if strings.TrimSpace(repoID) == "" {
		return fmt.Errorf("repo_id is required")
	}

	endpoint := c.baseURL + "/internal/v1/repos/" + encodeRepoIDPath(repoID) + "/vectors"
	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, endpoint, nil)
	if err != nil {
		return fmt.Errorf("build delete vectors request: %w", err)
	}
	if c.secret != "" {
		req.Header.Set(internalSecretHeader, c.secret)
	}

	resp, err := c.httpClient.Do(req)
	if err != nil {
		return fmt.Errorf("delete repo vectors: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode >= 200 && resp.StatusCode < 300 {
		return nil
	}

	body, _ := io.ReadAll(io.LimitReader(resp.Body, 4096))
	if len(body) == 0 {
		return fmt.Errorf("delete repo vectors: status %d", resp.StatusCode)
	}
	return fmt.Errorf("delete repo vectors: status %d: %s", resp.StatusCode, strings.TrimSpace(string(body)))
}

// encodeRepoIDPath preserves slashes in repo_id for {repo_id:path} routes.
func encodeRepoIDPath(repoID string) string {
	parts := strings.Split(repoID, "/")
	for i, part := range parts {
		parts[i] = url.PathEscape(part)
	}
	return strings.Join(parts, "/")
}
