package singbridge

import (
	"context"

	"github.com/sagernet/sing/common/logger"
	"github.com/xtls/xray-core/common/errors"
	"github.com/xtls/xray-core/common/session"
)

var _ logger.ContextLogger = (*XrayLogger)(nil)

type XrayLogger struct {
	newError func(values ...any) *errors.Error
}

func NewLogger(newErrorFunc func(values ...any) *errors.Error) *XrayLogger {
	return &XrayLogger{
		newErrorFunc,
	}
}

func (l *XrayLogger) Trace(args ...any) {
}

func (l *XrayLogger) Debug(args ...any) {
	l.newError(args...).AtDebug().WriteToLog()
}

func (l *XrayLogger) Info(args ...any) {
	l.newError(args...).AtInfo().WriteToLog()
}

func (l *XrayLogger) Warn(args ...any) {
	l.newError(args...).AtWarning().WriteToLog()
}

func (l *XrayLogger) Error(args ...any) {
	l.newError(args...).AtError().WriteToLog()
}

func (l *XrayLogger) Fatal(args ...any) {
}

func (l *XrayLogger) Panic(args ...any) {
}

func (l *XrayLogger) TraceContext(ctx context.Context, args ...any) {
}

func (l *XrayLogger) DebugContext(ctx context.Context, args ...any) {
	l.newError(args...).AtDebug().WriteToLog(session.ExportIDToError(ctx))
}

func (l *XrayLogger) InfoContext(ctx context.Context, args ...any) {
	l.newError(args...).AtInfo().WriteToLog(session.ExportIDToError(ctx))
}

func (l *XrayLogger) WarnContext(ctx context.Context, args ...any) {
	l.newError(args...).AtWarning().WriteToLog(session.ExportIDToError(ctx))
}

func (l *XrayLogger) ErrorContext(ctx context.Context, args ...any) {
	l.newError(args...).AtError().WriteToLog(session.ExportIDToError(ctx))
}

func (l *XrayLogger) FatalContext(ctx context.Context, args ...any) {
}

func (l *XrayLogger) PanicContext(ctx context.Context, args ...any) {
}