package main

import (
	"fmt"
	"log"
	"os"
	"strings"
	"time"
)

var (
	logger  *log.Logger
	logFile *os.File
)

func iniciarLog(rutaLog string) {
	// O_TRUNC: se reutiliza siempre el mismo archivo, nunca se crea más de uno.
	f, err := os.OpenFile(rutaLog, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
	if err != nil {
		log.Printf("No se pudo abrir archivo de log %s: %v", rutaLog, err)
		logger = log.New(os.Stderr, "", 0)
		return
	}
	logFile = f
	logger = log.New(f, "", 0)
}

func cerrarLog() {
	if logFile != nil {
		logFile.Close()
		logFile = nil
	}
}

func logInfo(formato string, args ...any) {
	escribirLog("INFO ", formato, args...)
}

func logError(formato string, args ...any) {
	escribirLog("ERROR", formato, args...)
}

func logSQL(query string, args ...any) {
	normalizada := strings.Join(strings.Fields(query), " ")
	if len(args) > 0 {
		escribirLog("SQL  ", "%s -- args: %v", normalizada, args)
	} else {
		escribirLog("SQL  ", "%s", normalizada)
	}
}

func escribirLog(nivel, formato string, args ...any) {
	if logger == nil {
		return
	}
	loc, err := time.LoadLocation("America/Mexico_City")
	if err != nil {
		loc = time.UTC
	}
	ts := time.Now().In(loc).Format("2006-01-02 15:04:05")
	msg := fmt.Sprintf(formato, args...)
	logger.Printf("[%s] %s %s", ts, nivel, msg)
}
