package interceptor

import (
	"bindbox-game/internal/code"
	"bindbox-game/internal/pkg/core"
	"bindbox-game/internal/repository/mysql/model"
	"net/http"
)

// CheckBlacklist 检查用户是否在黑名单中
func (i *interceptor) CheckBlacklist() core.HandlerFunc {
	return func(ctx core.Context) {
		// 1. 获取当前用户 ID (需在 Token 认证后使用)
		userID := ctx.SessionUserInfo().Id
		if userID <= 0 {
			// 如果没有用户信息，可能是不需要认证的接口误用了此中间件，或者 Token 解析失败
			// 这里偏向于放行还是拦截需根据业务决定，一般拦截
			ctx.AbortWithError(core.Error(http.StatusUnauthorized, code.AuthorizationError, "未授权访问"))
			return
		}

		// 2. 查询用户状态
		// 这里每次请求都查库，如果有性能问题后续可加 Redis 缓存
		var status int32
		err := i.db.GetDbR().Model(&model.Users{}).
			Select("status").
			Where("id = ?", userID).
			Scan(&status).Error

		if err != nil {
			// 数据库错误，安全起见放行还是报错？建议报错
			ctx.AbortWithError(core.Error(http.StatusInternalServerError, code.ServerError, "系统繁忙"))
			return
		}

		// 3. 检查黑名单状态
		if status == model.UserStatusBlacklist {
			ctx.AbortWithError(core.Error(http.StatusForbidden, code.ForbiddenError, "账号异常，禁止操作"))
			return
		}

		// 4. 用户被禁用
		if status == model.UserStatusDisabled {
			ctx.AbortWithError(core.Error(http.StatusForbidden, code.ForbiddenError, "账号已被禁用"))
			return
		}

	}
}
