package notifications

import (
	"bytes"
	"html/template"
	"strings"

	"switchboard-core/models"
)

// ── Template Data ───────────────────────────

type emailData struct {
	Title        string
	Body         string
	Type         string
	ResourceType string
	InstanceName string
}

// ── HTML Template ───────────────────────────

var htmlTmpl = template.Must(template.New("email").Parse(`<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; color: #333;">
  <div style="border-bottom: 2px solid #4a8af4; padding-bottom: 12px; margin-bottom: 20px;">
    <h2 style="margin: 0; color: #4a8af4;">{{.InstanceName}}</h2>
  </div>
  <div style="background: #f8f9fa; border-radius: 8px; padding: 16px; margin-bottom: 16px;">
    <h3 style="margin: 0 0 8px;">{{.Title}}</h3>
    {{if .Body}}<p style="margin: 0; color: #555;">{{.Body}}</p>{{end}}
  </div>
  <p style="font-size: 0.85em; color: #999;">
    This notification was sent by {{.InstanceName}}. You can adjust your notification preferences in Settings.
  </p>
</body>
</html>`))

// ── Plaintext Template ──────────────────────

var textTmpl = template.Must(template.New("email_text").Parse(`{{.InstanceName}} — Notification

{{.Title}}
{{if .Body}}
{{.Body}}
{{end}}
---
Adjust your notification preferences in Settings.
`))

// ── Render Functions ────────────────────────

// RenderHTML renders an HTML email body for a notification.
func RenderHTML(n *models.Notification, instanceName string) string {
	if instanceName == "" {
		instanceName = "Switchboard Core"
	}
	data := emailData{
		Title:        n.Title,
		Body:         n.Body,
		Type:         n.Type,
		ResourceType: n.ResourceType,
		InstanceName: instanceName,
	}
	var buf bytes.Buffer
	if err := htmlTmpl.Execute(&buf, data); err != nil {
		return "<p>" + template.HTMLEscapeString(n.Title) + "</p>"
	}
	return buf.String()
}

// RenderText renders a plaintext email body for a notification.
func RenderText(n *models.Notification, instanceName string) string {
	if instanceName == "" {
		instanceName = "Switchboard Core"
	}
	data := emailData{
		Title:        n.Title,
		Body:         n.Body,
		Type:         n.Type,
		ResourceType: n.ResourceType,
		InstanceName: instanceName,
	}
	var buf bytes.Buffer
	if err := textTmpl.Execute(&buf, data); err != nil {
		return n.Title
	}
	return buf.String()
}

// SubjectForNotification returns an email subject line.
func SubjectForNotification(n *models.Notification, instanceName string) string {
	if instanceName == "" {
		instanceName = "Switchboard Core"
	}
	prefix := "[" + instanceName + "] "
	switch {
	case strings.HasPrefix(n.Type, "kb."):
		return prefix + "Knowledge Base: " + n.Title
	case strings.HasPrefix(n.Type, "role."):
		return prefix + "Model Alert: " + n.Title
	case strings.HasPrefix(n.Type, "grant."):
		return prefix + "Access Change: " + n.Title
	default:
		return prefix + n.Title
	}
}
