package models_pages

import (
	"bytes"
	"fmt"
	"html/template"
	"io"
	"main/tools"
	"os"
	"path/filepath"
	"sort"
	"strings"
	"time"
)

const (
	// Имя соответствующего шаблона
	PostsPageTmplName = "posts.gohtml"
)

type Posts map[PostLink]*Post

func LoadPosts(dir string) (Posts, error) {

	posts := Posts{}

	err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !f.IsDir() && strings.HasSuffix(f.Name(), ".md") {

			file, err := os.Open(path)
			if err != nil {
				return err
			}

			md, err := io.ReadAll(file)
			if err != nil {
				return err
			}

			html := tools.MdToHTML(md)
			link := fmt.Sprintf("/%s/", strings.TrimSuffix(filepath.Base(path), ".md"))
			timestamp := f.ModTime().Unix()
			posts[PostLink(link)] = newPost(link, html, timestamp)
		}
		return nil
	})

	if err != nil {
		return nil, err
	}

	return posts, nil
}

func (p *Posts) RenderPostsPage(templates *template.Template, version int64) ([]byte, error) {
	var pageData bytes.Buffer

	postsSlice := make([]*Post, 0, len(*p))
	for _, post := range *p {
		postsSlice = append(postsSlice, post)
	}

	// Сортирую по ModTimestamp (новые сначала)
	sort.Slice(postsSlice, func(i, j int) bool {
		return postsSlice[i].Timestamp > postsSlice[j].Timestamp
	})

	context := map[string]any{
		"version":            version,
		"renderingTimestamp": time.Now().Unix(),
		"posts":              postsSlice,
	}

	if err := templates.ExecuteTemplate(&pageData, PostsPageTmplName, context); err != nil {
		return nil, err
	}

	return pageData.Bytes(), nil
}