package db

import (
	"olympus/oncall/backend/pkg/log"
	"os"

	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var db *gorm.DB

const SET_TIME_ZONE = `
	set
		time_zone = '+8:00'`

func GetDB() *gorm.DB {
	if db != nil {
		// set timezone.
		db.Exec(SET_TIME_ZONE)
		return db
	}

	log.Info("msg", "initialize db")
	gormLoggerLevel := logger.Warn
	if viper.GetString("mode") == "debug" {
		gormLoggerLevel = logger.Info
	}
	gormLoggerLevel = logger.Info
	db1, err := gorm.Open(mysql.Open(viper.GetString("db_dsn")), &gorm.Config{
		PrepareStmt: true,
		Logger:      logger.Default.LogMode(gormLoggerLevel),
	})
	if err != nil {
		log.Error("err", err)
		os.Exit(1)
	}
	db = db1

	db1.Exec(SET_TIME_ZONE)
	return db
}

func GetTempWeekId() (float32, error) {
	const GET_TEMP_WEEK_ID = `
		SELECT
			MAX(id) as week_id
		FROM
			t_week_id
		WHERE
			offset < now();
		`
	var weekId float32
	res := GetDB().Raw(GET_TEMP_WEEK_ID).Scan(&weekId)
	if res.Error != nil {
		return weekId, res.Error
	}
	return weekId, nil
}
