package httpClient

import (
	"errors"
	"fmt"
)

// HTTPError represents an HTTP error with status code and message
type HTTPError struct {
	StatusCode int
	Message    string
}

// Error returns the string representation of the HTTP error
func (e *HTTPError) Error() string {
	return fmt.Sprintf("HTTP %d: %s", e.StatusCode, e.Message)
}

// Is implements error comparison for errors.Is
func (e *HTTPError) Is(target error) bool {
	var httpErr *HTTPError
	if errors.As(target, &httpErr) {
		return e.StatusCode == httpErr.StatusCode
	}
	return false
}

// NewHTTPError creates a new HTTP error
func NewHTTPError(statusCode int, message string) error {
	return &HTTPError{
		StatusCode: statusCode,
		Message:    message,
	}
}

// IsHTTPError checks if an error is an HTTP error
func IsHTTPError(err error) bool {
	var httpErr *HTTPError
	return errors.As(err, &httpErr)
}

// GetHTTPStatusCode extracts the status code from an HTTP error
func GetHTTPStatusCode(err error) int {
	var httpErr *HTTPError
	if errors.As(err, &httpErr) {
		return httpErr.StatusCode
	}
	return 0
}

// Legacy support for existing code
type HttpError struct {
	Code int
}

func (e *HttpError) Error() string { return fmt.Sprintf("httpClient %d", e.Code) }

func IsHTTPStatus(err error, code int) bool {
	var he *HttpError
	if errors.As(err, &he) {
		return he.Code == code
	}
	return false
}
