package main

import (
	"context"

	"github.com/nose7en/ToyBoomServer/common"
	"github.com/nose7en/ToyBoomServer/config"
	"github.com/nose7en/ToyBoomServer/models"
	"github.com/nose7en/ToyBoomServer/storage"

	"github.com/glebarez/sqlite"
	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
)

func initDatabase() {
	c := context.Background()

	common.Logger(c).Infof("start to init database, type: %s", config.GetSettings().DB.Type)
	storage.MustInitDBManager(nil, config.GetSettings().DB.Type)

	switch config.GetSettings().DB.Type {
	case "sqlite":
		if sqlitedb, err := gorm.Open(sqlite.Open(config.GetSettings().DB.DSN), &gorm.Config{}); err != nil {
			common.Logger(c).Panic(err)
		} else {
			storage.GetDBManager().SetDB("sqlite", storage.DefaultDBName, sqlitedb)
			common.Logger(c).Infof("init database success, data location: [%s]", config.GetSettings().DB.DSN)
		}
	case "mysql":
		if mysqlDB, err := gorm.Open(mysql.Open(config.GetSettings().DB.DSN), &gorm.Config{}); err != nil {
			common.Logger(c).Panic(err)
		} else {
			storage.GetDBManager().SetDB("mysql", storage.DefaultDBName, mysqlDB)
			common.Logger(c).Infof("init database success, data type: [%s]", "mysql")
		}
	case "postgres":
		if postgresDB, err := gorm.Open(postgres.Open(config.GetSettings().DB.DSN), &gorm.Config{}); err != nil {
			common.Logger(c).Panic(err)
		} else {
			storage.GetDBManager().SetDB("postgres", storage.DefaultDBName, postgresDB)
			common.Logger(c).Infof("init database success, data type: [%s]", "postgres")
		}
	default:
		common.Logger(c).Panicf("currently unsupported database type: %s", config.GetSettings().DB.Type)
	}

	storage.GetDBManager().Init(models.Models()...)
}