package io.github.olivierlemasle.ca;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

class KeyStoreReaderImpl implements KeyStoreReader {
  static final String KEYSTORE_TYPE = "PKCS12";

  @Override
  public List<String> listAliases(String keyStorePath, char[] password) {
    final File file = new File(keyStorePath);
    return listAliases(file, password);
  }

  @Override
  public List<String> listAliases(File keyStoreFile, char[] password) {
    try {
      if (!keyStoreFile.exists() || !keyStoreFile.isFile())
        return new ArrayList<>();

      final KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
      try (InputStream stream = new FileInputStream(keyStoreFile)) {
        keyStore.load(stream, password);
      }
      return listAliases(keyStore);
    } catch (KeyStoreException | IOException | CertificateException | NoSuchAlgorithmException e) {
      throw new CaException(e);
    }

  }

  @Override
  public List<String> listAliases(KeyStore keyStore) {
    final List<String> res = new ArrayList<>();
    try {
      for (final Enumeration<String> aliases = keyStore.aliases(); aliases.hasMoreElements();) {
        res.add(aliases.nextElement());
      }
      return res;
    } catch (final KeyStoreException e) {
      throw new CaException(e);
    }

  }

}