package controller

import (
	"net/http"
	"strconv"

	"metazone.cc/metalab/internal/common"
	"metazone.cc/metalab/internal/model"

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

// notifProvider MessageController 所需的通知服务接口（ISP：4 个方法）
type notifProvider interface {
	List(userID uint, page, pageSize int) (*model.NotificationListResult, error)
	CountUnread(userID uint) (int64, error)
	MarkRead(id, userID uint) error
	MarkAllRead(userID uint) error
}

// MessageController 消息中心控制器
type MessageController struct {
	notifService notifProvider
}

// NewMessageController 构造函数
func NewMessageController(notifService notifProvider) *MessageController {
	return &MessageController{notifService: notifService}
}

// UnreadCount 获取未读消息数（API，供导航栏轮询）
func (mc *MessageController) UnreadCount(c *gin.Context) {
	uidVal, exists := c.Get("uid")
	if !exists {
		common.Ok(c, gin.H{"unread": 0})
		return
	}

	count, err := mc.notifService.CountUnread(uidVal.(uint))
	if err != nil {
		common.Ok(c, gin.H{"unread": 0})
		return
	}

	common.Ok(c, gin.H{"unread": count})
}

// MarkRead 标记单条消息已读（API）
func (mc *MessageController) MarkRead(c *gin.Context) {
	uidVal, exists := c.Get("uid")
	if !exists {
		common.Error(c, http.StatusUnauthorized, "请先登录")
		return
	}

	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 64)
	if err != nil {
		common.Error(c, http.StatusBadRequest, "消息 ID 无效")
		return
	}

	if err := mc.notifService.MarkRead(uint(id), uidVal.(uint)); err != nil {
		common.Error(c, http.StatusInternalServerError, "操作失败")
		return
	}

	common.OkMessage(c, "已标记为已读")
}

// MarkAllRead 一键全部已读（API）
func (mc *MessageController) MarkAllRead(c *gin.Context) {
	uidVal, exists := c.Get("uid")
	if !exists {
		common.Error(c, http.StatusUnauthorized, "请先登录")
		return
	}

	if err := mc.notifService.MarkAllRead(uidVal.(uint)); err != nil {
		common.Error(c, http.StatusInternalServerError, "操作失败")
		return
	}

	common.OkMessage(c, "已全部标为已读")
}
