package ru.zetit.bridgeandjoins.crypto;

/**
 * Provider-абстракция над хранилищем ключей. На Linux используется
 * АПК «Валидата Клиент L» через Pki1.LocalIface (JNI-биндинг к
 * libzpki1jni.so). Если BJ_CRYPTO_PROVIDER=stub — поднимается
 * заглушка для дев-стендов без реальной криптографии.
 */
public interface KeystoreProvider {

    /** Уникальное имя провайдера (используется в HealthResponse.provider). */
    String name();

    /** true, если провайдер инициализирован и готов к работе. */
    boolean ready();

    /** Короткое описание состояния (для Health и диагностики). */
    String message();

    /**
     * Возвращает Pki1.LocalIface, если провайдер — Валидата и
     * инициализация прошла; иначе null.
     */
    Pki1.LocalIface pki();

    /** Закрывает контекст провайдера (для shutdown). */
    void close();

    /**
     * Подбирает реализацию по имени из BJ_CRYPTO_PROVIDER.
     * Неизвестное имя — Stub.
     */
    static KeystoreProvider byName(String name) {
        if ("validata".equals(name)) {
            return new ValidataProvider();
        }
        return new StubProvider();
    }
}

/** Заглушка для дев-стендов: ready()=false, реальная криптография недоступна. */
final class StubProvider implements KeystoreProvider {
    @Override public String name() { return "stub"; }
    @Override public boolean ready() { return false; }
    @Override public String message() {
        return "Провайдер stub — реальная криптография не подключена.";
    }
    @Override public Pki1.LocalIface pki() { return null; }
    @Override public void close() { /* no-op */ }
}
