package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"log/slog"
	"os"
)

// hashIdentifier mengubah identifier (mis. email) menjadi sidik jari
// sha256 12 karakter hex untuk korelasi antar-log tanpa menyimpan PII.
func hashIdentifier(id string) string {
	sum := sha256.Sum256([]byte(id))
	return hex.EncodeToString(sum[:])[:12]
}

// redactMap menyamarkan field sensitif pada map sebelum dicatat ke log.
func redactMap(data map[string]string) map[string]string {
	bersih := make(map[string]string, len(data))
	for k, v := range data {
		if k == "password" || k == "token" || k == "authorization" {
			bersih[k] = "***"
		} else {
			bersih[k] = v
		}
	}
	return bersih
}

func main() {
	// Logger dengan ReplaceAttr: field sensitif otomatis disamarkan,
	// dan waktu dibekukan agar output contoh deterministik.
	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		Level: slog.LevelInfo,
		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
			switch a.Key {
			case slog.TimeKey:
				a.Value = slog.StringValue("2026-01-15T08:00:00Z")
			case "password", "token", "authorization":
				a.Value = slog.StringValue("***")
			}
			return a
		},
	}))

	fmt.Println("== Sidik jari identifier ==")
	fmt.Println("budi@example.com →", hashIdentifier("budi@example.com"))
	fmt.Println("siti@example.com →", hashIdentifier("siti@example.com"))

	fmt.Println()
	fmt.Println("== Redaction map ==")
	payload := map[string]string{
		"email":    "budi@example.com",
		"password": "kunci-rahasia-budi",
		"token":    "YOUR_API_TOKEN",
	}
	fmt.Println("sebelum:", payload)
	fmt.Println("sesudah:", redactMap(payload))

	fmt.Println()
	fmt.Println("== slog dengan ReplaceAttr ==")
	logger.Info("login berhasil",
		slog.String("user", hashIdentifier("budi@example.com")),
		slog.String("password", "kunci-rahasia-budi"),
	)
	logger.Info("permintaan API",
		slog.String("token", "YOUR_API_TOKEN"),
		slog.Int("status", 200),
	)
}
