/*
 * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
 * Copyright (C) 2015, Sasa Zivkov <sasa.zivkov@sap.com> and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */
package org.eclipse.jgit.lfs.server.s3;

/**
 * Configuration for an Amazon AWS S3 bucket
 *
 * @since 4.3
 */
public class S3Config {
	private final String region;
	private final String bucket;
	private final String storageClass;
	private final String accessKey;
	private final String secretKey;
	private final int expirationSeconds;
	private final boolean disableSslVerify;

	/**
	 * <p>Constructor for S3Config.</p>
	 *
	 * @param region
	 *            AWS region
	 * @param bucket
	 *            S3 storage bucket
	 * @param storageClass
	 *            S3 storage class
	 * @param accessKey
	 *            access key for authenticating to AWS
	 * @param secretKey
	 *            secret key for authenticating to AWS
	 * @param expirationSeconds
	 *            period in seconds after which requests signed for this bucket
	 *            will expire
	 * @param disableSslVerify
	 *            if {@code true} disable Amazon server certificate and hostname
	 *            verification
	 */
	public S3Config(String region, String bucket, String storageClass,
			String accessKey, String secretKey, int expirationSeconds,
			boolean disableSslVerify) {
		this.region = region;
		this.bucket = bucket;
		this.storageClass = storageClass;
		this.accessKey = accessKey;
		this.secretKey = secretKey;
		this.expirationSeconds = expirationSeconds;
		this.disableSslVerify = disableSslVerify;
	}

	/**
	 * Get the <code>region</code>.
	 *
	 * @return Get name of AWS region this bucket resides in
	 */
	public String getRegion() {
		return region;
	}

	/**
	 * Get the <code>bucket</code>.
	 *
	 * @return Get S3 storage bucket name
	 */
	public String getBucket() {
		return bucket;
	}

	/**
	 * Get the <code>storageClass</code>.
	 *
	 * @return S3 storage class to use for objects stored in this bucket
	 */
	public String getStorageClass() {
		return storageClass;
	}

	/**
	 * Get the <code>accessKey</code>.
	 *
	 * @return access key for authenticating to AWS
	 */
	public String getAccessKey() {
		return accessKey;
	}

	/**
	 * Get the <code>secretKey</code>.
	 *
	 * @return secret key for authenticating to AWS
	 */
	public String getSecretKey() {
		return secretKey;
	}

	/**
	 * Get the <code>expirationSeconds</code>.
	 *
	 * @return period in seconds after which requests signed for this bucket
	 *         will expire
	 */
	public int getExpirationSeconds() {
		return expirationSeconds;
	}

	/**
	 * @return {@code true} if Amazon server certificate and hostname
	 *         verification is disabled
	 */
	boolean isDisableSslVerify() {
		return disableSslVerify;
	}

}
