package handlers

import (
	"net/http"

	"github.com/gin-gonic/gin"

	"switchboard-core/models"
)

// ── Extension Dependencies (v0.38.2) ──────────────────
// Admin-only read endpoints for dependency graph visibility.
// Dependencies are created/deleted implicitly by InstallPackage/DeletePackage.

// ListDependencies returns all libraries that a package depends on.
// GET /api/v1/admin/packages/:id/dependencies
func (h *PackageHandler) ListDependencies(c *gin.Context) {
	id := c.Param("id")
	if h.stores.Dependencies == nil {
		c.JSON(http.StatusOK, gin.H{"data": []any{}})
		return
	}
	deps, err := h.stores.Dependencies.ListByConsumer(c.Request.Context(), id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to list dependencies"})
		return
	}
	if deps == nil {
		deps = []models.ExtDependency{}
	}
	c.JSON(http.StatusOK, gin.H{"data": deps})
}

// ListConsumers returns all packages that depend on a library.
// GET /api/v1/admin/packages/:id/consumers
func (h *PackageHandler) ListConsumers(c *gin.Context) {
	id := c.Param("id")
	if h.stores.Dependencies == nil {
		c.JSON(http.StatusOK, gin.H{"data": []any{}})
		return
	}
	deps, err := h.stores.Dependencies.ListByLibrary(c.Request.Context(), id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to list consumers"})
		return
	}
	if deps == nil {
		deps = []models.ExtDependency{}
	}
	c.JSON(http.StatusOK, gin.H{"data": deps})
}

// ListAllDependencies returns the full dependency graph.
// GET /api/v1/admin/dependencies
func (h *PackageHandler) ListAllDependencies(c *gin.Context) {
	if h.stores.Dependencies == nil {
		c.JSON(http.StatusOK, gin.H{"data": []any{}})
		return
	}
	deps, err := h.stores.Dependencies.ListAll(c.Request.Context())
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to list dependencies"})
		return
	}
	if deps == nil {
		deps = []models.ExtDependency{}
	}
	c.JSON(http.StatusOK, gin.H{"data": deps})
}
