package controller

import (
	"metazone.cc/metalab/internal/middleware"
	"metazone.cc/metalab/internal/model"
	"metazone.cc/metalab/internal/service"
	"metazone.cc/metalab/internal/session"
)

// authUseCase AuthController 对 AuthService 的最小依赖（ISP：5 个方法）
// 注意：Login/Register/ConfirmRestore 不再返回 JWT，session 由 controller 通过 SessionManager 创建
type authUseCase interface {
	Register(req model.RegisterRequest, regIP string) (*model.User, error)
	Login(req model.LoginRequest, loginIP string) (*model.User, error)
	ConfirmRestore(req model.LoginRequest, loginIP string) (*model.User, error)
	CheckEmail(email string) (bool, error)
	IsRegistrationEnabled() bool
}

// rateLimiter AuthController 对 RateLimiter 的最小依赖（ISP：3 个方法）
type rateLimiter interface {
	AllowAccount(email string) (middleware.RateLimitResult, func())
	AllowIP(ip string) (middleware.RateLimitResult, func())
	Clear(email, ip string)
}

// postUseCase PostController 对 PostService 的最小依赖（ISP：7 个方法）
type postUseCase interface {
	Create(userID uint, title, body string) (*model.Post, error)
	GetByID(id uint) (*model.Post, error)
	List(keyword string, page, pageSize int) ([]model.Post, int64, error)
	Update(postID uint, title, body string) error
	Delete(postID uint) error
	SubmitForAudit(postID uint) error
	IsPostAccessible(userID uint, role string, postUserID uint) bool
}

// studioUseCase StudioController 对 PostService 的最小依赖（ISP：8 个方法）
type studioUseCase interface {
	Create(userID uint, title, body string) (*model.Post, error)
	GetByID(id uint) (*model.Post, error)
	Update(postID uint, title, body string) error
	Delete(postID uint) error
	SubmitForAudit(postID uint) error
	ListByUser(userID uint, status string, page, pageSize int) ([]model.Post, int64, error)
	GetOverview(userID uint) (*service.StudioOverview, error)
	IsPostAccessible(userID uint, role string, postUserID uint) bool
}

// spaceUseCase SpaceController 对 SpaceService 的最小依赖（ISP：2 个方法）
type spaceUseCase interface {
	GetSpaceUser(uid uint) (*model.User, error)
	GetPostsByUser(uid uint, page, pageSize int) ([]model.Post, int64, error)
}

// sessionManager 登录管理对会话管理的最小依赖（ISP：4 个方法）
type sessionManager interface {
	ListByUID(uid uint) ([]*session.Session, error)
	Destroy(sid string) error
	DestroyOtherByUID(uid uint, currentSID string) error
	UpdateRemark(sid string, uid uint, remark string) error
}
