package httpx

import (
	"encoding/json"
	"net/http"
	"time"
)

type Envelope struct {
	Data      any    `json:"data,omitempty"`
	Error     *Error `json:"error,omitempty"`
	TraceID   string `json:"traceId"`
	Timestamp int64  `json:"timestamp"`
}

type Error struct {
	Code    string `json:"code"`
	Message string `json:"message"`
	Detail  string `json:"detail,omitempty"`
}

func WriteOK(w http.ResponseWriter, traceID string, data any) {
	writeJSON(w, http.StatusOK, Envelope{
		Data:      data,
		TraceID:   traceID,
		Timestamp: time.Now().UnixMilli(),
	})
}

func WriteError(w http.ResponseWriter, status int, code, message, detail, traceID string) {
	writeJSON(w, status, Envelope{
		Error: &Error{
			Code:    code,
			Message: message,
			Detail:  detail,
		},
		TraceID:   traceID,
		Timestamp: time.Now().UnixMilli(),
	})
}

func writeJSON(w http.ResponseWriter, status int, body Envelope) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.WriteHeader(status)
	_ = json.NewEncoder(w).Encode(body)
}
