package economy

import (
	"context"
	"crypto"
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha1"
	"crypto/x509"
	"encoding/base64"
	"testing"
)

// TestBazaarRSAVerify امضای معتبر را می‌پذیرد و امضای/دیتای دستکاری‌شده را رد می‌کند.
func TestBazaarRSAVerify(t *testing.T) {
	key, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		t.Fatal(err)
	}
	der, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
	if err != nil {
		t.Fatal(err)
	}
	pubB64 := base64.StdEncoding.EncodeToString(der) // مثلِ خروجیِ کنسولِ کافه‌بازار

	v, err := NewBazaarRSAVerifier(pubB64)
	if err != nil {
		t.Fatalf("new verifier: %v", err)
	}

	data := `{"orderId":"1","productId":"coin_small","purchaseToken":"tok123","purchaseState":0}`
	h := sha1.Sum([]byte(data))
	sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA1, h[:])
	if err != nil {
		t.Fatal(err)
	}
	sigB64 := base64.StdEncoding.EncodeToString(sig)

	ctx := context.Background()

	ok, err := v.Verify(ctx, IAPProof{PurchaseData: data, Signature: sigB64})
	if err != nil || !ok {
		t.Fatalf("valid signature rejected: ok=%v err=%v", ok, err)
	}

	// دیتای دستکاری‌شده ⇒ رد
	ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data + " ", Signature: sigB64})
	if ok {
		t.Fatal("tampered data accepted")
	}

	// امضای دستکاری‌شده ⇒ رد
	bad := base64.StdEncoding.EncodeToString([]byte("not-a-real-signature"))
	ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data, Signature: bad})
	if ok {
		t.Fatal("bad signature accepted")
	}
}

// TestStoreRouter مسیر‌دهی بر اساس store و fallback را بررسی می‌کند.
func TestStoreRouter(t *testing.T) {
	ctx := context.Background()

	// بدونِ پیکربندی و بدونِ fallback ⇒ خطا.
	r := StoreRouter{}
	if ok, err := r.Verify(ctx, IAPProof{Store: "myket", Token: "x"}); ok || err == nil {
		t.Fatal("unconfigured store should error")
	}

	// با devFallback ⇒ توکنِ غیرخالی معتبر است.
	r = StoreRouter{DevFallback: true}
	if ok, err := r.Verify(ctx, IAPProof{Store: "bazaar", Token: "x"}); err != nil || !ok {
		t.Fatalf("dev fallback failed: ok=%v err=%v", ok, err)
	}
}
