package logger

import (
	"github.com/go-xorm/core"
	"github.com/sirupsen/logrus"
)

type XORMLogger struct {
	logger  *Logger
	level   core.LogLevel
	showSQL bool
}

func NewXORMLogger(logger *Logger) core.ILogger {
	lg := &XORMLogger{logger: logger.WithField("lib", "xorm"), showSQL: true}
	level := core.LOG_INFO
	if logger.Level == logrus.WarnLevel {
		level = core.LOG_WARNING
	} else if logger.Level == logrus.DebugLevel {
		level = core.LOG_DEBUG
	} else if logger.Level == logrus.ErrorLevel {
		level = core.LOG_ERR
	} else if logger.Level == logrus.FatalLevel {
		level = core.LOG_OFF
	} else if logger.Level == logrus.PanicLevel {
		level = core.LOG_UNKNOWN
	}
	lg.level = level
	return lg
}

func (s *XORMLogger) printSql(v ...interface{})  {
	var sql, params interface{}
	if len(v) > 0 {
		sql = v[0]
	} else {
		sql = ""
	}
	if len(v) > 1 {
		params = v[1]
	} else {
		params = nil
	}
	args := []interface{} {"sql", "", 0, sql, params, MaxInt64}
	s.logger.Print(args...)
}

// Error implement core.ILogger
func (s *XORMLogger) Error(v ...interface{}) {
	if s.level <= core.LOG_ERR {
		s.printSql(v...)
	}
	return
}

// Errorf implement core.ILogger
func (s *XORMLogger) Errorf(format string, v ...interface{}) {
	if s.level <= core.LOG_ERR {
		s.printSql(v...)
	}
	return
}

// Debug implement core.ILogger
func (s *XORMLogger) Debug(v ...interface{}) {
	if s.level <= core.LOG_DEBUG {
		s.printSql(v...)
	}
	return
}

// Debugf implement core.ILogger
func (s *XORMLogger) Debugf(format string, v ...interface{}) {
	if s.level <= core.LOG_DEBUG {
		s.printSql(v...)
	}
	return
}

// Info implement core.ILogger
func (s *XORMLogger) Info(v ...interface{}) {
	if s.level <= core.LOG_INFO {
		s.printSql(v...)
	}
	return
}

// Infof implement core.ILogger
func (s *XORMLogger) Infof(format string, v ...interface{}) {
	if s.level <= core.LOG_INFO {
		s.printSql(v...)
	}
	return
}

// Warn implement core.ILogger
func (s *XORMLogger) Warn(v ...interface{}) {
	if s.level <= core.LOG_WARNING {
		s.printSql(v...)
	}
	return
}

// Warnf implement core.ILogger
func (s *XORMLogger) Warnf(format string, v ...interface{}) {
	if s.level <= core.LOG_WARNING {
		s.printSql(v...)
	}
	return
}

// Level implement core.ILogger
func (s *XORMLogger) Level() core.LogLevel {
	return s.level
}

// SetLevel implement core.ILogger
func (s *XORMLogger) SetLevel(l core.LogLevel) {
	s.level = l
	return
}

// ShowSQL implement core.ILogger
func (s *XORMLogger) ShowSQL(show ...bool) {
	if len(show) == 0 {
		s.showSQL = true
		return
	}
	s.showSQL = show[0]
}

// IsShowSQL implement core.ILogger
func (s *XORMLogger) IsShowSQL() bool {
	return s.showSQL
}