// Copyright (c) 2026 S.A. (SNOWARE). Written for SCU Team.
// Licensed under MulanPubL-2.0.
// You may obtain a copy at: http://license.coscl.org.cn/MulanPubL-2.0
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND.

// logger 模块：基于 zerolog 的日志初始化，支持控制台输出（可读格式）+ 文件输出（JSON 结构化）。
package main

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"time"

	"github.com/rs/zerolog"
)

// log 包级全局日志实例，所有 .go 文件共用。
var log zerolog.Logger

// initLogger 初始化全局日志：
//   - 日志文件存储在 srcc.exe 同目录的 log/ 下，按日期命名
//   - 控制台使用可读的 ConsoleWriter（带颜色）
//   - 同时输出到控制台和文件
func initLogger() {
	exePath, err := os.Executable()
	if err != nil {
		exePath, _ = os.Getwd()
	}
	exeDir := filepath.Dir(exePath)

	logDir := filepath.Join(exeDir, "log")
	if err := os.MkdirAll(logDir, 0755); err != nil {
		panic(fmt.Sprintf("无法创建日志目录: %v", err))
	}

	today := time.Now().Format("2006-01-02")
	logFile := filepath.Join(logDir, today+".log")

	file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		panic(fmt.Sprintf("无法打开日志文件: %v", err))
	}

	consoleWriter := zerolog.ConsoleWriter{
		Out:        os.Stdout,
		TimeFormat: "2006-01-02 15:04:05",
		NoColor:    false,
	}

	multi := io.MultiWriter(consoleWriter, file)

	log = zerolog.New(multi).
		With().
		Timestamp().
		Caller().
		Logger().
		Level(zerolog.DebugLevel)
}
