package models

import (
	"git.kirsle.net/apps/gophertype/pkg/console"
)

// TaggedPost associates tags to their posts.
type TaggedPost struct {
	ID     int `gorm:"primary_key"`
	Tag    string
	PostID int // foreign key to Post
}

// SummarizeTags returns the list of all tags ordered by frequency used.
// public: true for public view, don't count tags on private posts.
func SummarizeTags(public bool) []TagSummary {
	var result []TagSummary

	query := DB.Table("tagged_posts").
		Select("tagged_posts.tag, count(tagged_posts.post_id) AS count").
		Joins("JOIN posts ON posts.id = tagged_posts.post_id").
		Group("tagged_posts.tag").
		Order("count desc")

	if public {
		query = query.Where("posts.privacy = ?", Public)
	}

	rows, err := query.Rows()
	if err != nil {
		console.Error("SummarizeTags: query.Rows: %s", err)
	}

	for rows.Next() {
		var (
			tagName string
			count   int
		)

		if err := rows.Scan(&tagName, &count); err != nil {
			console.Error("SummarizeTags: rows.Scan: %s", err)
		}

		result = append(result, TagSummary{
			Tag:   tagName,
			Count: count,
		})
	}

	return result
}

// TagSummary holds the result for SummarizeTags
type TagSummary struct {
	Tag   string
	Count int
}
