package bootstrap

import (
	"log/slog"
	"path/filepath"

	"github.com/go-gormigrate/gormigrate/v2"
	"github.com/knadh/koanf/v2"
	_ "github.com/ncruces/go-sqlite3/embed"
	"github.com/ncruces/go-sqlite3/gormlite"
	sloggorm "github.com/orandin/slog-gorm"
	"gopkg.in/natefinch/lumberjack.v2"
	"gorm.io/gorm"

	"github.com/acepanel/panel/internal/app"
	"github.com/acepanel/panel/internal/migration"
)

func NewDB(conf *koanf.Koanf) (*gorm.DB, error) {
	ljLogger := &lumberjack.Logger{
		Filename: filepath.Join(app.Root, "panel/storage/logs/db.log"),
		MaxSize:  10,
		MaxAge:   30,
		Compress: true,
	}

	handler := slog.New(slog.NewJSONHandler(ljLogger, nil)).Handler()
	options := []sloggorm.Option{sloggorm.WithHandler(handler)}
	if conf.Bool("database.debug") {
		options = append(options, sloggorm.WithTraceAll())
	}

	return gorm.Open(gormlite.Open("file:"+filepath.Join(app.Root, "panel/storage/app.db?_txlock=immediate")), &gorm.Config{
		Logger:                                   sloggorm.New(options...),
		SkipDefaultTransaction:                   true,
		DisableForeignKeyConstraintWhenMigrating: true,
	})
}

func NewMigrate(db *gorm.DB) *gormigrate.Gormigrate {
	return gormigrate.New(db, &gormigrate.Options{
		UseTransaction: true, // Note: MySQL not support DDL transaction
	}, migration.Migrations)
}
