package logger

import (
	"fmt"
	"time"
)

// ExampleDynamicLogging menunjukkan cara menggunakan fungsi penyimpanan log dinamis
func ExampleDynamicLogging() {
	// Buat logger instance
	logger := New("test-service", DEBUG, false)

	// Contoh 1: Log biasa dengan penyimpanan otomatis
	fmt.Println("=== Contoh 1: Log biasa dengan penyimpanan otomatis ===")
	logger.LogAndSave(INFO, "Aplikasi dimulai", map[string]interface{}{
		"version": "1.0.0",
		"mode":    "development",
	})

	// Contoh 2: Log dengan request ID
	fmt.Println("\n=== Contoh 2: Log dengan request ID ===")
	reqLogger := logger.WithRequestID("req-123456")
	reqLogger.LogAndSave(INFO, "Request diproses", map[string]interface{}{
		"endpoint": "/api/v1/users",
		"method":   "GET",
		"user_id":  1001,
	})

	// Contoh 3: Log error
	fmt.Println("\n=== Contoh 3: Log error ===")
	logger.LogAndSave(ERROR, "Database connection failed", map[string]interface{}{
		"error":   "connection timeout",
		"timeout": "30s",
		"host":    "localhost:5432",
	})

	// Contoh 4: Manual save ke berbagai format
	fmt.Println("\n=== Contoh 4: Manual save ke berbagai format ===")
	manualEntry := LogEntry{
		Timestamp: time.Now().Format(time.RFC3339),
		Level:     "INFO",
		Service:   "manual-service",
		Message:   "Manual log entry",
		RequestID: "manual-req-001",
		File:      "example.go",
		Line:      42,
		Fields: map[string]interface{}{
			"custom_field": "custom_value",
			"number":       42,
		},
	}

	// Simpan manual ke berbagai format
	if err := SaveLogText(manualEntry); err != nil {
		fmt.Printf("Error saving text log: %v\n", err)
	}

	if err := SaveLogJSON(manualEntry); err != nil {
		fmt.Printf("Error saving JSON log: %v\n", err)
	}

	if err := SaveLogToDatabase(manualEntry); err != nil {
		fmt.Printf("Error saving to database log: %v\n", err)
	}

	// Contoh 5: Log dengan durasi
	fmt.Println("\n=== Contoh 5: Log dengan durasi ===")
	start := time.Now()
	time.Sleep(100 * time.Millisecond) // Simulasi proses
	duration := time.Since(start)

	logger.LogAndSave(INFO, "Process completed", map[string]interface{}{
		"operation": "data_processing",
		"duration":  duration.String(),
		"items":     150,
	})

	fmt.Println("\n=== Semua log telah disimpan dalam berbagai format ===")
	fmt.Println("1. Format teks dengan pemisah |: pkg/logger/data/logs.txt")
	fmt.Println("2. Format JSON: pkg/logger/data/logs.json")
	fmt.Println("3. Format database (placeholder): pkg/logger/data/database_logs.txt")
}

// ExampleMiddlewareLogging menunjukkan penggunaan dalam middleware
func ExampleMiddlewareLogging() {
	fmt.Println("\n=== Contoh Penggunaan dalam Middleware ===")

	middlewareLogger := New("middleware-service", INFO, false)

	// Simulasi request processing
	middlewareLogger.LogAndSave(INFO, "Request received", map[string]interface{}{
		"method":       "POST",
		"path":         "/api/v1/auth/login",
		"client_ip":    "192.168.1.100",
		"user_agent":   "Mozilla/5.0",
		"content_type": "application/json",
	})

	// Simulasi response
	middlewareLogger.LogAndSave(INFO, "Response sent", map[string]interface{}{
		"status_code":   200,
		"duration":      "150ms",
		"response_size": "2.5KB",
	})
}
