package logging

import (
	"bytes"
	"context"
	"fmt"
	"log/slog"
	"strings"
	"testing"
	"time"
)

func Example() {
	var out bytes.Buffer
	var level slog.LevelVar
	log := New(&out, &level).With("service", "quote")
	ctx := WithRequestID(context.Background(), "req-42")
	log.DebugContext(ctx, "hidden")
	log.InfoContext(ctx, "context alone")
	RequestLogger(ctx, log).InfoContext(ctx, "quote created", slog.Int("total", 500), slog.Any("api_key", Secret("sample-only")), slog.Duration("elapsed", 1500*time.Millisecond))
	level.Set(slog.LevelDebug)
	log.Debug("debug enabled")
	fmt.Print(out.String())
	// Output:
	// {"level":"INFO","msg":"context alone","service":"quote"}
	// {"level":"INFO","msg":"quote created","service":"quote","request_id":"req-42","total":500,"api_key":"[REDACTED]","elapsed":1500000000}
	// {"level":"DEBUG","msg":"debug enabled","service":"quote"}
}
func TestSecretBoundary(t *testing.T) {
	var out bytes.Buffer
	var level slog.LevelVar
	log := New(&out, &level)
	log.Info("safe", "value", Secret("sample-only"))
	if strings.Contains(out.String(), "sample-only") {
		t.Fatal("secret leaked")
	}
	out.Reset()
	log.Info("unsafe formatted text", "value", fmt.Sprintf("%s", Secret("sample-only")))
	if !strings.Contains(out.String(), "sample-only") {
		t.Fatal("expected boundary demonstration")
	}
	t.Log("typed Secret redacted; preformatted string exposed the sample value")
}

type failWriter struct{}

func (failWriter) Write([]byte) (int, error) { return 0, fmt.Errorf("disk unavailable") }
func TestHandlerError(t *testing.T) {
	h := slog.NewJSONHandler(failWriter{}, nil)
	r := slog.NewRecord(time.Time{}, slog.LevelInfo, "event", 0)
	if err := h.Handle(context.Background(), r); err == nil {
		t.Fatal("expected write error")
	} else {
		t.Logf("handler error=%v", err)
	}
	// Logger.Info has no error result. Production output health needs separate monitoring.
	slog.New(h).Info("event")
}
