package ru.zetit.bridgeandjoins.crypto;

/**
 * Provider-абстракция над хранилищем ключей. Реальные реализации
 * подключаются вместе с соответствующими jar-ами (КриптоПро JCP,
 * Валидата JCP, ViPNet). На M1 — Stub.
 */
public interface KeystoreProvider {

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

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

    /**
     * Подбирает реализацию по имени из переменной окружения
     * BJ_CRYPTO_PROVIDER. Неизвестное имя — Stub.
     */
    static KeystoreProvider byName(String name) {
        switch (name == null ? "" : name) {
            case "cryptopro": return new CryptoProJcpProvider();
            case "validata":  return new ValidataJcpProvider();
            case "vipnet":    return new VipNetProvider();
            default:          return new StubProvider();
        }
    }
}

/** Заглушка по умолчанию. Возвращает ready()=false. */
final class StubProvider implements KeystoreProvider {
    @Override public String name() { return "stub"; }
    @Override public boolean ready() { return false; }
}

/** КриптоПро JCP. Реализация — после получения jar и лицензии. */
final class CryptoProJcpProvider implements KeystoreProvider {
    // TODO(M2): инициализация Provider'а через Security.addProvider(new ru.CryptoPro.JCP.JCP());
    @Override public String name() { return "cryptopro"; }
    @Override public boolean ready() { return false; }
}

/** Валидата JCP. Заглушка. */
final class ValidataJcpProvider implements KeystoreProvider {
    @Override public String name() { return "validata"; }
    @Override public boolean ready() { return false; }
}

/** ViPNet. Заглушка. */
final class VipNetProvider implements KeystoreProvider {
    @Override public String name() { return "vipnet"; }
    @Override public boolean ready() { return false; }
}
