// Package infra gère l'infrastructure (serveurs, containers, nginx).
package infra

import (
	"database/sql"
	"fmt"
	"os"
	"path/filepath"

	_ "github.com/mattn/go-sqlite3"
)

// DB représente la connexion à la base SQLite.
type DB struct {
	*sql.DB
}

// Open ouvre ou crée la base de données SQLite.
func Open(dbPath string) (*DB, error) {
	// Créer le répertoire si nécessaire
	dir := filepath.Dir(dbPath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return nil, fmt.Errorf("create db directory: %w", err)
	}

	// Ouvrir la connexion
	sqlDB, err := sql.Open("sqlite3", dbPath+"?_foreign_keys=on")
	if err != nil {
		return nil, fmt.Errorf("open database: %w", err)
	}

	// Tester la connexion
	if err := sqlDB.Ping(); err != nil {
		sqlDB.Close()
		return nil, fmt.Errorf("ping database: %w", err)
	}

	db := &DB{sqlDB}

	// Exécuter les migrations
	if err := db.Migrate(); err != nil {
		sqlDB.Close()
		return nil, fmt.Errorf("migrate database: %w", err)
	}

	return db, nil
}

// Close ferme la connexion.
func (db *DB) Close() error {
	return db.DB.Close()
}
