package llm

import (
	"context"
	"errors"
	"fmt"
	"reflect"
	"strings"
)

type retryableError struct {
	err error
}

func (e retryableError) Error() string {
	if e.err == nil {
		return ""
	}
	return e.err.Error()
}

func (e retryableError) Unwrap() error {
	return e.err
}

func validateOutputTarget(out any) error {
	if out == nil {
		return fmt.Errorf("structured completion output target must be a non-nil pointer")
	}
	value := reflect.ValueOf(out)
	if value.Kind() != reflect.Pointer || value.IsNil() {
		return fmt.Errorf("structured completion output target must be a non-nil pointer")
	}
	return nil
}

func canRetry(ctx context.Context, attempt int, maxRetries int, err error) bool {
	if attempt >= maxRetries {
		return false
	}
	if ctx.Err() != nil {
		return false
	}
	var retryable retryableError
	return errors.As(err, &retryable)
}

func firstNonEmpty(values ...string) string {
	for _, value := range values {
		if trimmed := strings.TrimSpace(value); trimmed != "" {
			return trimmed
		}
	}
	return ""
}
