package elevenlabs

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"
)

// ListVoices returns all available voices for the authenticated user.
func (c *Client) ListVoices(ctx context.Context) ([]Voice, error) {
	respBody, err := c.doRequest(ctx, http.MethodGet, "/voices", nil)
	if err != nil {
		return nil, fmt.Errorf("list voices: %w", err)
	}

	var voicesResp VoicesResponse
	if err := json.Unmarshal(respBody, &voicesResp); err != nil {
		return nil, fmt.Errorf("unmarshal voices response: %w", err)
	}

	return voicesResp.Voices, nil
}

// GetVoice returns a specific voice by ID.
func (c *Client) GetVoice(ctx context.Context, voiceID string) (*Voice, error) {
	if voiceID == "" {
		return nil, fmt.Errorf("%w: voice ID is required", ErrInvalidConfig)
	}

	path := fmt.Sprintf("/voices/%s", voiceID)
	respBody, err := c.doRequest(ctx, http.MethodGet, path, nil)
	if err != nil {
		return nil, fmt.Errorf("get voice: %w", err)
	}

	var voice Voice
	if err := json.Unmarshal(respBody, &voice); err != nil {
		return nil, fmt.Errorf("unmarshal voice response: %w", err)
	}

	return &voice, nil
}

// Health verifies the API connectivity and authentication.
// Returns nil if the API is reachable and the API key is valid.
func (c *Client) Health(ctx context.Context) error {
	// Use the user endpoint as a lightweight health check
	_, err := c.doRequest(ctx, http.MethodGet, "/user", nil)
	if err != nil {
		return fmt.Errorf("health check: %w", err)
	}
	return nil
}
