package common

import (
	"regexp"

	"metazone.cc/metalab/internal/model"

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

// mdImageRe 匹配 Markdown 图片语法 ![alt](url)
var mdImageRe = regexp.MustCompile(`!\[.*?\]\((.*?)\)`)

// ExtractFirstImage 从 Markdown 正文提取第一张图片 URL
func ExtractFirstImage(md string) string {
	match := mdImageRe.FindStringSubmatch(md)
	if len(match) > 1 {
		return match[1]
	}
	return ""
}

// BuildPageData 构建页面模板数据，自动注入登录状态、站点信息与 CSRF token
func BuildPageData(c *gin.Context, extra gin.H) gin.H {
	data := gin.H{}
	for k, v := range extra {
		data[k] = v
	}
	if username, exists := c.Get("username"); exists {
		data["IsLoggedIn"] = true
		data["Username"] = username
	}
	// 注入 CSRF token（由 CSRF 中间件设置到上下文中）
	if token, exists := c.Get("csrf_token"); exists {
		data["CSRFToken"] = token
	}
	// 注入站点信息（由 InjectSiteInfo 中间件设置）
	injectSiteInfo(c, data)
	// 注入管理入口权限（moderator 及以上可看到页脚管理面板链接）
	if role, exists := c.Get("role"); exists {
		data["CanAccessAdmin"] = model.HasMinRole(role.(string), model.RoleModerator)
		data["IsOwner"] = model.HasMinRole(role.(string), model.RoleOwner)
	}
	// 注入维护状态
	if isMaintenance, exists := c.Get("is_maintenance"); exists {
		data["IsMaintenance"] = isMaintenance
	}
	return data
}

// BuildAdminPageData 构建管理后台模板数据
// 额外注入 UID、Role、CanManageUsers、CurrentPath 等权限信息
func BuildAdminPageData(c *gin.Context, extra gin.H) gin.H {
	data := BuildPageData(c, extra)
	data["IsAdmin"] = true
	data["CurrentPath"] = c.Request.URL.Path

	if uid, exists := c.Get("uid"); exists {
		data["UID"] = uid
	}
	if role, exists := c.Get("role"); exists {
		roleStr := role.(string)
		data["Role"] = roleStr
		if name, ok := model.RoleDisplayNames[roleStr]; ok {
			data["RoleDisplayName"] = name
		} else {
			data["RoleDisplayName"] = roleStr
		}
		data["CanManageUsers"] = model.HasMinRole(roleStr, model.RoleAdmin)
		data["CanManageAudits"] = model.HasMinRole(roleStr, model.RoleAdmin)
		data["CanManageSettings"] = model.HasMinRole(roleStr, model.RoleOwner)
		data["IsOwner"] = model.HasMinRole(roleStr, model.RoleOwner)
	}
	return data
}

// injectSiteInfo 从 context 注入站点展示信息
func injectSiteInfo(c *gin.Context, data gin.H) {
	if framework, exists := c.Get("site_framework"); exists {
		data["Framework"] = framework
	}
	if copyrightStart, exists := c.Get("site_copyright_start"); exists {
		data["CopyrightStart"] = copyrightStart
	}
}
