// internal/controllers/notification_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 NotificationController struct {
	notificationService *services.NotificationService
}

func NewNotificationController(db *gorm.DB) *NotificationController {
	return &NotificationController{
		notificationService: services.NewNotificationService(db),
	}
}

// GetUserNotifications gets notifications for current user
// GET /api/notifications
func (c *NotificationController) GetUserNotifications(ctx *gin.Context) {
	userObj, _ := ctx.Get("user")
	user := userObj.(*models.User)

	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
	limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
	onlyUnread := ctx.Query("unread") == "true"

	notifications, total, err := c.notificationService.GetUserNotifications(user.ID, page, limit, onlyUnread)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to get notifications", err.Error())
		return
	}

	count, _ := c.notificationService.CountUnread(user.ID)

	utils.SuccessResponse(ctx, http.StatusOK, "Notifications retrieved", gin.H{
		"notifications": notifications,
		"total":         total,
		"unread_count":  count,
	})
}

// MarkAsRead marks a notification as read
// PATCH /api/notifications/:id/read
func (c *NotificationController) MarkAsRead(ctx *gin.Context) {
	userObj, _ := ctx.Get("user")
	user := userObj.(*models.User)

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

	if err := c.notificationService.MarkAsRead(user.ID, uint(id)); err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "Failed to mark as read", err.Error())
		return
	}

	utils.SuccessResponse(ctx, http.StatusOK, "Notification marked as read", nil)
}

// MarkAllAsRead marks all notifications as read
// PATCH /api/notifications/read-all
func (c *NotificationController) MarkAllAsRead(ctx *gin.Context) {
	userObj, _ := ctx.Get("user")
	user := userObj.(*models.User)

	if err := c.notificationService.MarkAllAsRead(user.ID); err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to mark all as read", err.Error())
		return
	}

	utils.SuccessResponse(ctx, http.StatusOK, "All notifications marked as read", nil)
}