package cryptocli_test

import (
	"context"
	"strings"
	"testing"

	"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/cryptocli"
)

func TestStubProviderHealthOK(t *testing.T) {
	cli := cryptocli.New(cryptocli.Config{Provider: cryptocli.ProviderStub})
	h, err := cli.Health(context.Background())
	if err != nil {
		t.Fatalf("Health: %v", err)
	}
	if h.Provider != string(cryptocli.ProviderStub) {
		t.Errorf("Provider = %q", h.Provider)
	}
	if !strings.Contains(h.Message, "stub") {
		t.Errorf("сообщение не содержит 'stub': %q", h.Message)
	}
}

func TestModulePathMissing(t *testing.T) {
	cli := cryptocli.New(cryptocli.Config{
		Provider:   cryptocli.ProviderCryptoPro,
		ModulePath: "/nonexistent/libcppkcs11.so",
	})
	_, err := cli.Health(context.Background())
	if err == nil {
		t.Fatal("ожидалась ошибка о ненайденном модуле")
	}
	if !strings.Contains(err.Error(), "не найден") {
		t.Errorf("неинформативная ошибка: %v", err)
	}
}

func TestEmptyModulePath(t *testing.T) {
	cli := cryptocli.New(cryptocli.Config{Provider: cryptocli.ProviderCryptoPro})
	_, err := cli.Health(context.Background())
	if err == nil {
		t.Fatal("ожидалась ошибка о пустом ModulePath")
	}
}

func TestDefaultModulePath(t *testing.T) {
	cases := []struct {
		p    cryptocli.Provider
		want string
	}{
		{cryptocli.ProviderCryptoPro, "/opt/cprocsp/lib/amd64/libcppkcs11.so"},
		{cryptocli.ProviderRutoken, "/usr/lib64/librtpkcs11ecp.so"},
		{cryptocli.ProviderStub, ""},
	}
	for _, c := range cases {
		got := cryptocli.DefaultModulePath(c.p)
		if got != c.want {
			t.Errorf("DefaultModulePath(%s) = %q, ожидалось %q", c.p, got, c.want)
		}
	}
}
