// Embedded template files für MobileBackup2 SendFiles.
//
// Diese Templates folgen Apple's Backup-Format-Schema. Sie wurden via
// Reverse-Engineering aus TechLockdown's Supervise-Tool als Format-
// Referenz extrahiert — die hier embedded Inhalte sind ReBreak's eigene
// Implementierung des gleichen Apple-public-Schemas.
package mobilebackup2

import (
	"bytes"
	_ "embed"
	"text/template"
	"time"
)

//go:embed templates/Status.plist.tmpl
var statusTmpl []byte

//go:embed templates/Manifest.plist.tmpl
var manifestTmpl []byte

//go:embed templates/Info.plist.tmpl
var infoTmpl []byte

//go:embed templates/TL_Manifest.db
var tlManifestDB []byte

//go:embed templates/TL_Status.plist
var tlStatusPlist []byte

//go:embed templates/TL_Manifest.plist
var tlManifestPlist []byte

// TLManifestDB returnt TL's exakte extracted Manifest.db (36864 bytes, 9 pages).
// Wird für Diagnostik-Tests genutzt: wenn iPhone mit unserer generated Manifest.db
// bail't aber mit TL's verbatim Restore-Mode triggert → Manifest.db-Generation
// ist die Wall. Erstmaliger Use: 2026-05-28 nach 2 failed MBFile-Patch-rev's.
func TLManifestDB() []byte {
	return tlManifestDB
}

// TLStatusPlist returnt TL's extrahierte Status.plist (verbatim).
func TLStatusPlist() []byte {
	return tlStatusPlist
}

// TLManifestPlist returnt TL's extrahierte Manifest.plist (verbatim).
func TLManifestPlist() []byte {
	return tlManifestPlist
}

// TemplateVars sind die runtime-substituierten Werte.
type TemplateVars struct {
	BackupUUID     string // randomly generated UUID for this backup-session
	BackupGUID     string // randomly generated GUID for Info.plist
	Date           string // RFC3339 datetime (e.g. "2026-05-26T08:00:00Z")
	BuildVersion   string // from device.GetValue("BuildVersion")
	ProductType    string // e.g. "iPhone18,4"
	ProductVersion string // e.g. "26.5"
	SerialNumber   string // device serial
	UDID           string // device unique ID
	DeviceName     string // user-set device name
}

// RenderStatusPlist returnt Status.plist mit aktuellen Vars als bytes.
func RenderStatusPlist(vars TemplateVars) ([]byte, error) {
	return renderTemplate("Status.plist", string(statusTmpl), vars)
}

// RenderManifestPlist returnt Manifest.plist mit aktuellen Vars als bytes.
func RenderManifestPlist(vars TemplateVars) ([]byte, error) {
	return renderTemplate("Manifest.plist", string(manifestTmpl), vars)
}

// RenderInfoPlist returnt Info.plist mit aktuellen Vars als bytes.
func RenderInfoPlist(vars TemplateVars) ([]byte, error) {
	return renderTemplate("Info.plist", string(infoTmpl), vars)
}

func renderTemplate(name, tmpl string, vars TemplateVars) ([]byte, error) {
	t, err := template.New(name).Parse(tmpl)
	if err != nil {
		return nil, err
	}
	var buf bytes.Buffer
	if err := t.Execute(&buf, vars); err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}

// FormatBackupDate — Apple verlangt UTC ohne sub-second precision.
func FormatBackupDate(t time.Time) string {
	return t.UTC().Format("2006-01-02T15:04:05Z")
}
