package api

import (
	"context"
	"net/http"

	"github.com/AlchemyTelcoSolutions/utils/render"
	"github.com/AlchemyTelcoSolutions/utils/response_writer_tracker"
	commonConverter "github.com/AlchemyTelcoSolutions/utils/service/converter"
	"github.com/AlchemyTelcoSolutions/xutils-go/xlogger"
	"go.uber.org/zap"
)

const (
	httpErrorLog     = "error returned to the client"
	tracingLoggerKey = "tracing-logger"
)

func RespWithErr(r *http.Request, w http.ResponseWriter, err error) {
	ww := response_writer_tracker.NewResponseWriterTracker(w)
	render.Error(ww, commonConverter.GetXError(err))

	if ww.GetStatusCode() >= http.StatusInternalServerError {
		GetLogger(r.Context()).Error(httpErrorLog, err)
	} else {
		GetLogger(r.Context()).Warning(httpErrorLog, zap.Error(err))
	}
}

func GetLogger(c context.Context) xlogger.Logger {
	if c == nil {
		return xlogger.NoOpLogger{}
	}
	l := c.Value(tracingLoggerKey)
	if l == nil {
		return xlogger.NoOpLogger{}
	}
	zl, ok := l.(xlogger.Logger)
	if !ok {
		return xlogger.NoOpLogger{}
	}
	return zl
}
