package main

// Genel imzali v2 manifest uretici (eklentiler icin). Kullanim:
//   go run main.go -anahtar everything -surum 1.0.13 -dosya plugin.exe -acilis 1 -gizli gizli-anahtar.txt -cikti manifest.json
// Imzalanan metin, bridge paket.go ile birebir ayni: fikoyt-eklenti-v2\n<anahtar>\n<surum>\n<sha256>\n<0|1>

import (
	"crypto/ed25519"
	"crypto/sha256"
	"encoding/base64"
	"encoding/hex"
	"encoding/json"
	"flag"
	"fmt"
	"os"
	"strings"
)

const gomulu = "bE1qYWOzKZasuepzdrtWGEIcDYAm6RvI6Ymy+HVpYcA="

func hata(format string, a ...any) {
	fmt.Fprintf(os.Stderr, "HATA: "+format+"\n", a...)
	os.Exit(1)
}

func main() {
	anahtar := flag.String("anahtar", "", "eklenti anahtari")
	surum := flag.String("surum", "", "surum (x.y.z)")
	dosya := flag.String("dosya", "", "paket dosyasi")
	acilis := flag.String("acilis", "0", "1: acilista baslasin, 0: baslamasin")
	gizliYolu := flag.String("gizli", "", "gizli-anahtar.txt")
	cikti := flag.String("cikti", "", "manifest.json cikti yolu")
	flag.Parse()
	if *anahtar == "" || *surum == "" || *dosya == "" || *gizliYolu == "" || *cikti == "" {
		hata("-anahtar, -surum, -dosya, -gizli, -cikti zorunlu")
	}
	if *acilis != "0" && *acilis != "1" {
		hata("-acilis 0 ya da 1 olmali")
	}
	veri, err := os.ReadFile(*dosya)
	if err != nil {
		hata("dosya okunamadi: %v", err)
	}
	gizli, err := os.ReadFile(*gizliYolu)
	if err != nil {
		hata("gizli anahtar okunamadi: %v", err)
	}
	priv, err := base64.StdEncoding.DecodeString(strings.TrimSpace(string(gizli)))
	if err != nil || len(priv) != ed25519.PrivateKeySize {
		hata("gizli anahtar bicimi gecersiz")
	}
	pub := ed25519.PrivateKey(priv).Public().(ed25519.PublicKey)
	if base64.StdEncoding.EncodeToString(pub) != gomulu {
		hata("gizli anahtar bridge'e gomulu acik anahtarla eslesmiyor")
	}
	sum := sha256.Sum256(veri)
	ozet := hex.EncodeToString(sum[:])
	mesaj := []byte("fikoyt-eklenti-v2\n" + *anahtar + "\n" + *surum + "\n" + ozet + "\n" + *acilis)
	imza := ed25519.Sign(priv, mesaj)
	if !ed25519.Verify(pub, mesaj, imza) {
		hata("imza dogrulanamadi")
	}
	m := map[string]any{
		"anahtar": *anahtar, "surum": *surum, "sha256": ozet,
		"imza": base64.StdEncoding.EncodeToString(imza), "bicim": "v2", "acilis": *acilis == "1",
	}
	out, _ := json.MarshalIndent(m, "", "  ")
	if err := os.WriteFile(*cikti, out, 0o644); err != nil {
		hata("manifest yazilamadi: %v", err)
	}
	fmt.Println("tamam:", *cikti, "sha256:", ozet)
}