// internal/controllers/match_controller.go
package controllers

import (
	"lost-and-found/internal/models"
	"lost-and-found/internal/services"
	"lost-and-found/internal/utils"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type MatchController struct {
	matchService *services.MatchService
}

func NewMatchController(db *gorm.DB) *MatchController {
	return &MatchController{
		matchService: services.NewMatchService(db),
	}
}

// FindSimilarItems finds similar items for a lost item
// POST /api/lost-items/:id/find-similar
func (c *MatchController) FindSimilarItems(ctx *gin.Context) {
	userObj, _ := ctx.Get("user")
	user := userObj.(*models.User)

	lostItemID, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid lost item ID", err.Error())
		return
	}

	// Only allow managers or the owner to search
	// Add ownership check here if needed

	results, err := c.matchService.FindSimilarItems(uint(lostItemID))
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to find similar items", err.Error())
		return
	}

	utils.SuccessResponse(ctx, http.StatusOK, "Similar items found", gin.H{
		"total":   len(results),
		"matches": results,
		"user_id": user.ID,
	})
}

// GetMatchesForLostItem gets all matches for a lost item
// GET /api/lost-items/:id/matches
func (c *MatchController) GetMatchesForLostItem(ctx *gin.Context) {
	lostItemID, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid lost item ID", err.Error())
		return
	}

	matches, err := c.matchService.GetMatchesForLostItem(uint(lostItemID))
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to get matches", err.Error())
		return
	}

	utils.SuccessResponse(ctx, http.StatusOK, "Matches retrieved", matches)
}

// GetMatchesForItem gets all matches for an item
// GET /api/items/:id/matches
func (c *MatchController) GetMatchesForItem(ctx *gin.Context) {
	itemID, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid item ID", err.Error())
		return
	}

	matches, err := c.matchService.GetMatchesForItem(uint(itemID))
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to get matches", err.Error())
		return
	}

	utils.SuccessResponse(ctx, http.StatusOK, "Matches retrieved", matches)
}