package dart

import (
	"fmt"
	"log"

	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

type Database struct {
	Conn *gorm.DB
}

type MySQLConfig struct {
	Username string
	Password string
	Host     string
	Port     string
	Database string
}

type PostgreSQLConfig struct {
	Username string
	Password string
	Host     string
	Port     string
	Database string
}

type SQLiteConfig struct {
	Filename string
}

func NewMySQLDatabase(cfg MySQLConfig) *Database {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.Database)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal(err)
	}

	return &Database{
		Conn: db,
	}
}

func NewPostgreSQLDatabase(cfg PostgreSQLConfig) *Database {
	dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disabled TimeZone=Europe/Vienna", cfg.Host, cfg.Username, cfg.Password, cfg.Database, cfg.Port)
	db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal(err)
	}

	return &Database{
		Conn: db,
	}
}

func NewSQLiteDatabase(cfg SQLiteConfig) *Database {
	db, err := gorm.Open(sqlite.Open(cfg.Filename), &gorm.Config{})
	if err != nil {
		log.Fatal(err)
	}

	return &Database{
		Conn: db,
	}
}