package controller

import (
	"net/http"
	"strconv"

	"metazone.cc/metalab/internal/common"

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

// SpaceController 用户空间控制器（统一页面：文章/关注/粉丝/收藏/设置）
type SpaceController struct {
	spaceService  spaceUseCase
	followSvc     followUseCase
	favoriteSvc   favoriteUseCaseForSpace
}

// NewSpaceController 构造函数
func NewSpaceController(spaceService spaceUseCase) *SpaceController {
	return &SpaceController{spaceService: spaceService}
}

// WithFollowService 注入关注服务（可选依赖）
func (ctrl *SpaceController) WithFollowService(svc followUseCase) {
	ctrl.followSvc = svc
}

// WithFavoriteService 注入收藏夹服务（可选依赖）
func (ctrl *SpaceController) WithFavoriteService(svc favoriteUseCaseForSpace) {
	ctrl.favoriteSvc = svc
}

// MySpace 自己的空间（/space）— 需登录，重定向到 /space/{uid}
func (ctrl *SpaceController) MySpace(c *gin.Context) {
	uid, _, ok := common.GetGinUser(c)
	if !ok {
		common.RedirectToLogin(c)
		return
	}
	c.Redirect(http.StatusFound, "/space/"+strconv.FormatUint(uint64(uid), 10))
}

// ShowSpace 统一空间页面（/space/:uid?tab=articles|following|followers|collections|settings）
func (ctrl *SpaceController) ShowSpace(c *gin.Context) {
	uidStr := c.Param("uid")
	uid, err := strconv.ParseUint(uidStr, 10, 64)
	if err != nil {
		c.HTML(http.StatusNotFound, "space/index.html", common.BuildPageData(c, gin.H{
			"Title":    "用户不存在",
			"Error":    "用户不存在",
			"ExtraCSS": "/static/css/space.css",
		}))
		return
	}

	spaceUser, err := ctrl.spaceService.GetSpaceUser(uint(uid))
	if err != nil || spaceUser == nil {
		c.HTML(http.StatusNotFound, "space/index.html", common.BuildPageData(c, gin.H{
			"Title":    "用户不存在",
			"Error":    "用户不存在",
			"ExtraCSS": "/static/css/space.css",
		}))
		return
	}

	// 当前登录用户
	currentUID, _, _ := common.GetGinUser(c)
	isOwnSpace := currentUID == uint(uid)

	// 当前激活的 Tab
	tab := c.DefaultQuery("tab", "articles")

	// 分页参数
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	if page < 1 { page = 1 }
	pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "18"))
	if pageSize < 1 || pageSize > 50 { pageSize = 18 }

	// 构建基础数据（含用户统计）
	postCount, _ := ctrl.spaceService.CountUserPosts(uint(uid))
	totalLikes, totalFavorites, totalReads, _ := ctrl.spaceService.GetUserStats(uint(uid))

	data := gin.H{
		"Title":         spaceUser.Username + " 的空间",
		"SpaceUser":     spaceUser,
		"IsOwnSpace":    isOwnSpace,
		"ActiveTab":     tab,
		"CurrentUID":    currentUID,
		"ExtraCSS":      "/static/css/space.css",
		"PostCount":     postCount,
		"TotalLikes":    totalLikes,
		"TotalFavorites": totalFavorites,
		"TotalReads":    totalReads,
	}

	// ---- 根据 Tab 加载对应数据 ----
	switch tab {
	case "following":
		ctrl.loadFollowingData(c, data, uint(uid), currentUID, page, pageSize)
	case "followers":
		ctrl.loadFollowersData(c, data, uint(uid), currentUID, page, pageSize)
	case "collections":
		if !isOwnSpace {
			// 访客不可看收藏夹，重定向到文章
			c.Redirect(http.StatusFound, "/space/"+uidStr+"?tab=articles")
			return
		}
		ctrl.loadCollectionsData(c, data, currentUID, page, pageSize)
	case "settings":
		if !isOwnSpace {
			c.Redirect(http.StatusFound, "/space/"+uidStr+"?tab=articles")
			return
		}
		// 设置页无需额外数据，模板中直接渲染隐私开关
	default: // articles
		ctrl.loadArticlesData(c, data, uint(uid), page, pageSize)
	}

	c.HTML(http.StatusOK, "space/index.html", common.BuildPageData(c, data))
}
