package web

import (
	"embed"
	"sort"
	"strings"
	"time"

	"git.arav.su/Arav/dwelling-home/pkg/article"
	"github.com/gomarkdown/markdown"
)

const (
	articleFileExtension = ".md"
	articleMetaExtension = ".meta"
)

//go:embed articles
var articlesFS embed.FS
var articles map[string]article.Article = make(map[string]article.Article)

// ArticleMetadata holds date, title and URL of an article used in articles list
// on the Stuff page.
type ArticleMetadata struct {
	ID    int64
	Date  time.Time
	Title string
	URL   string
}

// GetArticleMetadata returns a slice of metadata that is sorted by ID
func GetArticleMetadata() (meta []ArticleMetadata) {
	for urlid, article := range articles {

		meta = append(meta,
			ArticleMetadata{
				ID:    article.ID,
				Date:  article.Date,
				Title: article.Title,
				URL:   "stuff/article/" + urlid})
	}

	sort.Slice(meta, func(i, j int) bool {
		return meta[i].ID > meta[j].ID
	})

	return
}

func GetArticle(name string) (*article.Article, error) {
	if artcl, ok := articles[name]; ok {
		return &artcl, nil
	}

	meta, err := articlesFS.ReadFile("articles/" + name + articleMetaExtension)
	if err != nil {
		return nil, err
	}

	md, err := articlesFS.ReadFile("articles/" + name + articleFileExtension)
	if err != nil {
		return nil, err
	}

	artcl := article.Article{
		Body: markdown.ToHTML(md, nil, nil)}

	artcl.ParseMetadata(meta)

	articles[name] = artcl

	return &artcl, nil
}

func init() {
	entries, _ := articlesFS.ReadDir("articles")

	for _, entry := range entries {
		if strings.HasSuffix(entry.Name(), articleFileExtension) {
			GetArticle(strings.TrimSuffix(entry.Name(), articleFileExtension))
		}
	}
}
