/*
 * Copyright 2012-present Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package com.facebook.buck.util;

import com.facebook.buck.io.ProjectFilesystem;
import com.google.common.base.Strings;

import java.io.IOException;
import java.nio.file.Path;
import java.util.Properties;

public class KeystoreProperties {

  private final Path keystore;
  private final String storepass;
  private final String keypass;
  private final String alias;

  public KeystoreProperties(Path keystore, String storepass, String keypass, String alias) {
    this.keystore = keystore;
    this.storepass = storepass;
    this.keypass = keypass;
    this.alias = alias;
  }

  public Path getKeystore() {
    return keystore;
  }

  public String getStorepass() {
    return storepass;
  }

  public String getKeypass() {
    return keypass;
  }

  public String getAlias() {
    return alias;
  }

  public static KeystoreProperties createFromPropertiesFile(
      Path pathToStore,
      Path pathToKeystorePropertiesFile,
      ProjectFilesystem projectFilesystem) throws IOException {
    Properties properties = projectFilesystem.readPropertiesFile(pathToKeystorePropertiesFile);

    String keystorePassword = getOrThrowException(
        properties, "key.store.password", pathToKeystorePropertiesFile);
    String alias = getOrThrowException(properties, "key.alias", pathToKeystorePropertiesFile);
    String aliasPassword = getOrThrowException(
        properties, "key.alias.password", pathToKeystorePropertiesFile);

    return new KeystoreProperties(pathToStore, keystorePassword, aliasPassword, alias);
  }

  /**
   * @return a non-null, non-empty value for the specified property
   * @throws HumanReadableException if there is no value for the specified property
   */
  private static String getOrThrowException(Properties properties,
      String propertyName,
      Path pathToKeystorePropertiesFile) {
    String value = Strings.nullToEmpty(properties.getProperty(propertyName)).trim();
    if (value.isEmpty()) {
      throw new HumanReadableException(
          "properties file %s did not contain a value for the property %s",
          pathToKeystorePropertiesFile,
          propertyName);
    } else {
      return value;
    }
  }

}
