package prompts

import (
	"bytes"
	"crypto/sha256"
	"embed"
	"encoding/hex"
	"fmt"
	"strings"
	"text/template"
)

//go:embed agent/*.md wire/*.md events/*.md notices/*.md platform/*.md platform/*/*.md
var files embed.FS

func Render(path string, data any) (string, error) {
	raw, err := files.ReadFile(path)
	if err != nil {
		return "", fmt.Errorf("load prompt template %q: %w", path, err)
	}
	tmpl, err := template.New(path).Option("missingkey=error").Parse(string(raw))
	if err != nil {
		return "", fmt.Errorf("parse prompt template %q: %w", path, err)
	}
	var b bytes.Buffer
	if err := tmpl.Execute(&b, data); err != nil {
		return "", fmt.Errorf("render prompt template %q: %w", path, err)
	}
	return strings.TrimSpace(b.String()), nil
}

func MustRender(path string, data any) string {
	rendered, err := Render(path, data)
	if err != nil {
		panic(err)
	}
	return rendered
}

// Validate parses an embedded template without executing it. Registry/build
// checks use this to catch missing or malformed templates independently from
// any particular domain payload.
func Validate(path string) error {
	raw, err := files.ReadFile(path)
	if err != nil {
		return fmt.Errorf("load prompt template %q: %w", path, err)
	}
	if _, err := template.New(path).Option("missingkey=error").Parse(string(raw)); err != nil {
		return fmt.Errorf("parse prompt template %q: %w", path, err)
	}
	return nil
}

func Version(path string) string {
	raw, err := files.ReadFile(path)
	if err != nil {
		panic(fmt.Errorf("load prompt template %q: %w", path, err))
	}
	sum := sha256.Sum256(raw)
	return hex.EncodeToString(sum[:8])
}
