package database

import (
	"fmt"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"messageService/internal/app/models"
	"os"
)

// InitMessageDB инициализирует подключение к базе данных для микросервиса Message
func InitMessageDB() (*gorm.DB, error) {
	host := os.Getenv("DB_HOST")
	port := os.Getenv("DB_PORT")
	user := os.Getenv("DB_USER")
	password := os.Getenv("DB_PASSWORD")
	dbname := os.Getenv("DB_MESSAGE_NAME")

	// Строка подключения без указания имени базы данных
	dsn := fmt.Sprintf("host=%s user=%s password=%s port=%s sslmode=disable", host, user, password, port)

	// Подключаемся к PostgreSQL без указания базы данных
	db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info), // Включаем логирование для отладки
	})
	if err != nil {
		return nil, err
	}

	// Проверяем существование базы данных
	var exists bool
	if err := db.Raw("SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname = ?)", dbname).Scan(&exists).Error; err != nil {
		return nil, err
	}

	// Если база данных не существует, создаем ее
	if !exists {
		if err := db.Exec(fmt.Sprintf("CREATE DATABASE %s;", dbname)).Error; err != nil {
			return nil, err
		}
	}

	// Подключаемся к только что созданной базе данных
	dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable", host, user, password, dbname, port)
	db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		return nil, err
	}

	// Автоматическая миграция для Message
	if err := db.AutoMigrate(&models.Message{}); err != nil {
		return nil, err
	}

	return db, nil
}
