// Package modules définit le contrat d'interface pour les modules ProxmoxPanel.
// Chaque module implémente l'interface Module et s'enregistre auprès du ModuleRegistry.
package modules

import (
	"database/sql"
	"net/http"
)

// Module est l'interface que chaque module doit implémenter.
type Module interface {
	// ID retourne l'identifiant unique du module (doit correspondre à la table modules en DB).
	ID() string

	// Register est appelé au chargement du module actif.
	// Il reçoit le registry pour enregistrer ses routes, widgets, etc.
	Register(registry Registry) error
}

// Registry est l'interface exposée aux modules pour s'enregistrer dans le CORE.
type Registry interface {
	// RegisterRoute enregistre une route HTTP dans le router principal.
	RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool)

	// RegisterWSChannel enregistre un handler WebSocket pour un channel nommé.
	RegisterWSChannel(channel string, handler WSHandler)

	// RegisterWidget déclare un type de widget disponible pour le dashboard.
	RegisterWidget(widget WidgetDef)

	// RegisterSettingsTab ajoute un onglet dans la page paramètres.
	RegisterSettingsTab(tab SettingsTabDef)

	// RegisterTranslations fusionne des clés de traduction pour une langue donnée.
	RegisterTranslations(lang string, keys map[string]string)

	// RegisterMigration déclare une migration de base de données propre au module.
	RegisterMigration(version int, sql string, fn MigrationFn)

	// DB retourne un accès à SQLite avec isolation par module (préfixe de tables).
	DB() *sql.DB
}

// WSHandler est un handler WebSocket pour un channel nommé.
type WSHandler func(userID int64, send chan<- []byte, recv <-chan []byte)

// WidgetDef décrit un type de widget disponible pour le dashboard.
type WidgetDef struct {
	Type        string `json:"type"`
	Name        string `json:"name"`
	Description string `json:"description"`
	DefaultW    int    `json:"default_width"`
	DefaultH    int    `json:"default_height"`
}

// SettingsTabDef décrit un onglet de paramètres fourni par un module.
type SettingsTabDef struct {
	ID    string `json:"id"`
	Label string `json:"label"`
	Icon  string `json:"icon"`
	// Path est le chemin frontend du composant Vue à charger (lazy import).
	ComponentPath string `json:"component_path"`
}

// MigrationFn est une fonction de migration optionnelle (pour les migrations non-SQL).
type MigrationFn func(db *sql.DB) error
