package templates

import (
	"net/http"
	"time"

	"git.kirsle.net/apps/gosocial/pkg/config"
	"git.kirsle.net/apps/gosocial/pkg/log"
	"git.kirsle.net/apps/gosocial/pkg/models"
	"git.kirsle.net/apps/gosocial/pkg/session"
)

// MergeVars mixes in globally available template variables. The http.Request is optional.
func MergeVars(r *http.Request, m map[string]interface{}) {
	m["Title"] = config.Title
	m["Subtitle"] = config.Subtitle
	m["YYYY"] = time.Now().Year()

	if r == nil {
		return
	}

	m["Request"] = r
}

// MergeUserVars mixes in global template variables: LoggedIn and CurrentUser. The http.Request is optional.
func MergeUserVars(r *http.Request, m map[string]interface{}) {
	// Defaults
	m["LoggedIn"] = false
	m["CurrentUser"] = nil
	m["SessionImpersonated"] = false

	// User notification counts for nav bar.
	m["NavUnreadMessages"] = 0     // New messages
	m["NavFriendRequests"] = 0     // Friend requests
	m["NavTotalNotifications"] = 0 // Total of above

	// Admin notification counts for nav bar.
	m["NavCertificationPhotos"] = 0 // Cert. photos needing approval
	m["NavAdminFeedback"] = 0       // Unacknowledged feedback
	m["NavAdminNotifications"] = 0  // Total of above

	if r == nil {
		return
	}

	m["SessionImpersonated"] = session.Impersonated(r)

	if user, err := session.CurrentUser(r); err == nil {
		m["LoggedIn"] = true
		m["CurrentUser"] = user

		// Collect notification counts.
		var (
			// For users
			countMessages   int64
			countFriendReqs int64

			// For admins
			countCertPhotos int64
			countFeedback   int64
		)

		// Get unread message count.
		if count, err := models.CountUnreadMessages(user.ID); err == nil {
			m["NavUnreadMessages"] = count
			countMessages = count
		} else {
			log.Error("MergeUserVars: couldn't CountUnreadMessages for %d: %s", user.ID, err)
		}

		// Get friend request count.
		if count, err := models.CountFriendRequests(user.ID); err == nil {
			m["NavFriendRequests"] = count
			countFriendReqs = count
		} else {
			log.Error("MergeUserVars: couldn't CountFriendRequests for %d: %s", user.ID, err)
		}

		// Are we admin?
		if user.IsAdmin {
			// Any pending certification photos or feedback?
			countCertPhotos = models.CountCertificationPhotosNeedingApproval()
			countFeedback = models.CountUnreadFeedback()
			m["NavCertificationPhotos"] = countCertPhotos
			m["NavAdminFeedback"] = countFeedback

			// Total notification count for admin actions.
			m["NavAdminNotifications"] = countCertPhotos + countFeedback
		}

		// Total count for user notifications.
		m["NavTotalNotifications"] = countMessages + countFriendReqs + countCertPhotos + countFeedback
	}
}
