package xray

import (
	"strings"
	"x-ui/logger"
)

func NewLogWriter() *LogWriter {
	return &LogWriter{}
}

type LogWriter struct {
	lastLine string
}

func (lw *LogWriter) Write(m []byte) (n int, err error) {
	// Convert the data to a string
	message := strings.TrimSpace(string(m))
	messages := strings.Split(message, "\n")
	lw.lastLine = messages[len(messages)-1]

	for _, msg := range messages {
		messageBody := msg

		// Remove timestamp
		splittedMsg := strings.SplitN(msg, " ", 3)
		if len(splittedMsg) > 2 {
			messageBody = strings.TrimSpace(strings.SplitN(msg, " ", 3)[2])
		}

		// Find level in []
		startIndex := strings.Index(messageBody, "[")
		endIndex := strings.Index(messageBody, "]")
		if startIndex != -1 && endIndex != -1 && startIndex < endIndex {
			level := strings.TrimSpace(messageBody[startIndex+1 : endIndex])
			msgBody := "XRAY: " + strings.TrimSpace(messageBody[endIndex+1:])

			// Map the level to the appropriate logger function
			switch level {
			case "Debug":
				logger.Debug(msgBody)
			case "Info":
				logger.Info(msgBody)
			case "Warning":
				logger.Warning(msgBody)
			case "Error":
				logger.Error(msgBody)
			default:
				logger.Debug("XRAY: " + msg)
			}
		} else if msg != "" {
			logger.Debug("XRAY: " + msg)
			return len(m), nil
		}
	}

	return len(m), nil
}