package models

import (
	"blog/config"
	"sort"
	"strings"
)

type Category struct {
	Name     string
	Quantity int
	Articles Articles
}
type Categories []Category

func GetCategoryName(path string) string {
	var categoryName string
	newPath := strings.Replace(path, config.Cfg.DocumentContentDir+"/", "", 1)

	if strings.Index(newPath, "/") == -1 { //文件在根目录下(content/)没有分类名称
		categoryName = "未分类"
	} else {
		categoryName = strings.Split(newPath, "/")[0]
	}
	return categoryName
}

// GroupByCategory 按类别对文章进行分组
func GroupByCategory(articles *Articles, articleQuantity int) Categories {

	var categories Categories
	categoryMap := make(map[string]Articles)

	// 根据类别将文章分组
	for _, article := range *articles {
		_, existedCategory := categoryMap[article.Category]
		if existedCategory {
			categoryMap[article.Category] = append(categoryMap[article.Category], article)
		} else {
			categoryMap[article.Category] = Articles{article}
		}
	}

	// 遍历类别映射,构建分类信息
	for categoryName, articles := range categoryMap {
		articleLen := len(articles)
		var articleList Articles

		// 根据指定数量截取文章列表
		if articleQuantity <= 0 {
			articleList = articles
		} else {
			if articleQuantity > articleLen {
				articleList = articles[0:articleLen]
			} else {
				articleList = articles[0:articleQuantity]
			}
		}

		// 添加分类信息到结果集
		categories = append(categories, Category{
			Name:     categoryName,
			Quantity: articleLen,
			Articles: articleList,
		})
	}

	// 对分类结果集进行排序
	sort.Sort(categories)
	return categories
}

func (c Categories) Len() int { return len(c) }

func (c Categories) Less(i, j int) bool { return c[i].Quantity > c[j].Quantity }

func (c Categories) Swap(i, j int) { c[i], c[j] = c[j], c[i] }