package http

import (
	
	
	

	
	
)

// RequestResponseLogger is a deserialize middleware that will log the request and response HTTP messages and optionally
// their respective bodies. Will not perform any logging if none of the options are set.
type RequestResponseLogger struct {
	LogRequest         bool
	LogRequestWithBody bool

	LogResponse         bool
	LogResponseWithBody bool
}

// ID is the middleware identifier.
func ( *RequestResponseLogger) () string {
	return "RequestResponseLogger"
}

// HandleDeserialize will log the request and response HTTP messages if configured accordingly.
func ( *RequestResponseLogger) (
	 context.Context,  middleware.DeserializeInput,  middleware.DeserializeHandler,
) (
	 middleware.DeserializeOutput,  middleware.Metadata,  error,
) {
	 := middleware.GetLogger()

	if .LogRequest || .LogRequestWithBody {
		,  := .Request.(*Request)
		if ! {
			return , , fmt.Errorf("unknown transport type %T", )
		}

		 := .Build()
		,  := httputil.DumpRequestOut(, .LogRequestWithBody)
		if  != nil {
			return , , 
		}

		.Logf(logging.Debug, "Request\n%v", string())

		if .LogRequestWithBody {
			,  = .SetStream(.Body)
			if  != nil {
				return , , 
			}
			.Request = 
		}
	}

	, ,  = .HandleDeserialize(, )

	if ( == nil) && (.LogResponse || .LogResponseWithBody) {
		,  := .RawResponse.(*Response)
		if ! {
			return , , fmt.Errorf("unknown transport type %T", .RawResponse)
		}

		,  := httputil.DumpResponse(.Response, .LogResponseWithBody)
		if  != nil {
			return , , fmt.Errorf("failed to dump response %w", )
		}

		.Logf(logging.Debug, "Response\n%v", string())
	}

	return , , 
}