package handler

import (
	"net/http"

	"backend/internal/service"
	"github.com/gin-gonic/gin"
)

type ShowcaseHandler struct {
	showcase *service.ShowcaseService
}

func NewShowcaseHandler(showcase *service.ShowcaseService) *ShowcaseHandler {
	return &ShowcaseHandler{showcase: showcase}
}

func (h *ShowcaseHandler) List(c *gin.Context) {
	grouped, err := h.showcase.Grouped(c.Request.Context())
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"detail": "failed to load showcase"})
		return
	}
	out := gin.H{}
	for kind, items := range grouped {
		rows := make([]gin.H, 0, len(items))
		for _, item := range items {
			rows = append(rows, gin.H{
				"id":         item.ID,
				"kind":       item.Kind,
				"title":      item.Title,
				"subtitle":   item.Subtitle,
				"prompt":     item.Prompt,
				"gradient":   item.Gradient,
				"span":       item.Span,
				"image":      item.Image,
				"weight":     item.Weight,
				"created_at": item.CreatedAt,
				"updated_at": item.UpdatedAt,
			})
		}
		out[kind] = rows
	}
	c.JSON(http.StatusOK, gin.H{"data": out})
}

// AdminList is the paginated flat view for the admin 首页内容 page — the public
// List keeps its grouped shape for the home page, this one adds kind filter +
// limit/offset/total. Order mirrors the old client flattening: hero → bento → work.
func (h *ShowcaseHandler) AdminList(c *gin.Context) {
	grouped, err := h.showcase.Grouped(c.Request.Context())
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"detail": "failed to load showcase"})
		return
	}
	kindFilter := c.Query("kind") // "" | hero | bento | work
	flat := make([]gin.H, 0, 16)
	for _, kind := range []string{"hero", "bento", "work"} {
		if kindFilter != "" && kind != kindFilter {
			continue
		}
		for _, item := range grouped[kind] {
			flat = append(flat, gin.H{
				"id":         item.ID,
				"kind":       item.Kind,
				"title":      item.Title,
				"subtitle":   item.Subtitle,
				"prompt":     item.Prompt,
				"gradient":   item.Gradient,
				"span":       item.Span,
				"image":      item.Image,
				"weight":     item.Weight,
				"created_at": item.CreatedAt,
				"updated_at": item.UpdatedAt,
			})
		}
	}
	total := len(flat)
	limit, offset := pageParams(c, 12)
	page := pageSlice(flat, limit, offset)
	c.JSON(http.StatusOK, gin.H{"data": page, "total": total, "limit": limit, "offset": offset})
}
