package com.nifty.cloud.ncs.service;

import com.nifty.cloud.ncs.NiftyCloudClientException;

import java.io.File;
import java.io.InputStream;

/**
 * UploadPartの要求内容を保持するクラスです。
 *
 */
public class UploadPartRequest
{
	private String bucketName;
	private String objectName;
	private String uploadId;
	private int partNumber;
	private int partSize = 5 * 1024 * 1024;
	private InputStream inputStream;
	private String md5Digest;
	private String contentSHA256;
	private File file;
	private long fileOffset;
	private boolean lastPart;

	/**
	 * バケット名を取得します。
	 *
	 * @return バケット名
	 */
	public String getBucketName()
	{
		return (bucketName);
	}

	/**
	 * バケット名を設定します。
	 *
	 * @param bucketName
	 *  バケット名
	 */
	public void setBucketName(String bucketName)
	{
		this.bucketName = bucketName;
	}

	/**
	 * バケット名を設定し、自身を返却します。
	 *
	 * @param bucketName
	 *  バケット名
	 * @return バケット名が設定された自身のオブジェクト
	 */
	public UploadPartRequest withBucketName(String bucketName)
	{
		this.bucketName = bucketName;
		return (this);
	}

	/**
	 * オブジェクト名を取得します。
	 *
	 * @return オブジェクト名
	 */
	public String getObjectName()
	{
		return (objectName);
	}

	/**
	 * オブジェクト名を設定します。
	 *
	 * @param objectName
	 *  オブジェクト名
	 */
	public void setObjectName(String objectName)
	{
		this.objectName = objectName;
	}

	/**
	 * オブジェクト名を設定し、自身を返却します。
	 *
	 * @param objectName
	 *  オブジェクト名
	 * @return オブジェクト名を設定した、自身のオブジェクト
	 */
	public UploadPartRequest withKey(String objectName)
	{
		this.objectName = objectName;
		return (this);
	}

	/**
	 * アップロードIDを取得します。
	 *
	 * @return アップロードID
	 */
	public String getUploadId()
	{
		return (uploadId);
	}

	/**
	 * アップロードIDを設定します。
	 *
	 * @param uploadId
	 *  アップロードID
	 */
	public void setUploadId(String uploadId)
	{
		this.uploadId = uploadId.trim();
	}

	/**
	 * アップロードIDを設定し、自身を返却します。
	 *
	 * @param uploadId
	 *  アップロードID
	 * @return アップロードIDを設定した、自身のオブジェクト
	 */
	public UploadPartRequest withUploadId(String uploadId)
	{
		this.uploadId = uploadId.trim();
		return (this);
	}

	/**
	 * パート番号を取得します。
	 *
	 * @return パート番号
	 */
	public int getPartNumber()
	{
		return (partNumber);
	}

	/**
	 * パート番号を設定します。
	 *
	 * @param partNumber
	 *  パート番号
	 */
	public void setPartNumber(int partNumber)
	{
		this.partNumber = partNumber;
	}

	/**
	 * パート番号を設定し、自身を返却します。
	 *
	 * @param partNumber
	 *  パート番号
	 * @return パート番号を設定した、自身のオブジェクト
	 */
	public UploadPartRequest withPartNumber(int partNumber)
	{
		this.partNumber = partNumber;
		return (this);
	}

	/**
	 * パートサイズを取得します。
	 *
	 * @return パートサイズ
	 */
	public int getPartSize()
	{
		return (partSize);
	}

	/**
	 * パートサイズを設定します。
	 *
	 * @param partSize
	 *  パートサイズ
	 */
	public void setPartSize(int partSize)
	{
		this.partSize = partSize;
	}

	/**
	 * パートサイズを設定し、自身を返却します。
	 *
	 * @param partSize
	 *  パートサイズ
	 * @return パートサイズを設定した、自身のオブジェクト
	 */
	public UploadPartRequest withPartSize(int partSize)
	{
		this.partSize = partSize;
		return (this);
	}

	/**
	 * 入力ストリームを取得します。
	 *
	 * @return 入力ストリーム
	 */
	public InputStream getInputStream()
	{
		return (inputStream);
	}

	/**
	 * 入力ストリームを設定します。
	 *
	 * @param inputStream
	 *  入力ストリーム
	 * @param contentSHA256
	 *  入力ストリームのSHA256ハッシュ値
	 */
	public void setInputStream(InputStream inputStream, String contentSHA256)
	{
		this.inputStream = inputStream;

		if (contentSHA256 == null) {
			throw (new NiftyCloudClientException("contentSHA256 must not be null."));
		}

		this.contentSHA256 = contentSHA256;
	}

	/**
	 * SHA256ハッシュ値を取得します。
	 *
	 * @return SHA256ハッシュ値
	 */
	public String getContentSHA256() { return this.contentSHA256; }

	/**
	 * 入力ストリームを設定し、自身を返却します。
	 *
	 * @param inputStream
	 *  入力ストリーム
	 * @return 入力ストリームを設定した、自身のオブジェクト
	 */
	public UploadPartRequest withInputStream(InputStream inputStream)
	{
		this.inputStream = inputStream;
		return (this);
	}

	/**
	 * MD5ハッシュ値を取得します。
	 *
	 * @return MD5ハッシュ値
	 */
	public String getMd5Digest()
	{
		return (md5Digest);
	}

	/**
	 * MD5ハッシュ値を設定します。<br>
	 *
	 * @param md5Digest
	 *  MD5ハッシュ値<br>
	 *  この値はMD5のバイト列に対し、Base64エンコードを行ったものです。
	 */
	public void setMd5Digest(String md5Digest)
	{
		this.md5Digest = md5Digest;
	}

	/**
	 * MD5ハッシュ値を設定し、自身を返却します。<br>
	 *
	 * @param md5Digest
	 *  MD5ハッシュ値<br>
	 *  この値はMD5のバイト列に対し、Base64エンコードを行ったものです。
	 * @return MD5ハッシュ値を設定した、自身のオブジェクト
	 */
	public UploadPartRequest withMD5Digest(String md5Digest)
	{
		this.md5Digest = md5Digest;
		return (this);
	}

	/**
	 * ファイルを取得します。
	 *
	 * @return ファイル
	 */
	public File getFile()
	{
		return (file);
	}

	/**
	 * ファイルを設定します。
	 *
	 * @param file
	 *  ファイル
	 */
	public void setFile(File file)
	{
		this.file = file;
	}

	/**
	 * ファイルを設定し、自身を返却します。
	 *
	 * @param file
	 *  ファイル
	 * @return ファイルを設定した、自身のオブジェクト
	 */
	public UploadPartRequest withFile(File file)
	{
		setFile(file);
		return (this);
	}

	/**
	 * ファイルのoffsetを取得します。
	 *
	 * @return ファイルのoffset
	 */
	public long getFileOffset()
	{
		return (fileOffset);
	}

	/**
	 * ファイルのoffsetを設定します。
	 *
	 * @param fileOffset
	 *  ファイルのoffset
	 */
	public void setFileOffset(long fileOffset)
	{
		this.fileOffset = fileOffset;
	}

	/**
	 * ファイルのoffsetを設定し、自身を返却します。
	 *
	 * @param fileOffset
	 *  ファイルのoffset
	 * @return ファイルのoffsetを設定した、自身のオブジェクト
	 */
	public UploadPartRequest withFileOffset(long fileOffset)
	{
		setFileOffset(fileOffset);
		return (this);
	}

	/**
	 * 最終パートかどうかのフラグを取得します。
	 *
	 * @return 最終パートかどうかのフラグ
	 */
	public boolean isLastPart()
	{
		return (lastPart);
	}

	/**
	 * 最終パートかどうかのフラグを設定します。
	 *
	 * @param lastPart
	 *  最終パートかどうかのフラグ
	 */
	public void setLastPart(boolean lastPart)
	{
		this.lastPart = lastPart;
	}

	/**
	 * 最終パートかどうかのフラグを設定し、自身を返却します。
	 *
	 * @param lastPart
	 *  最終パートかどうかのフラグ
	 * @return 最終パートかどうかのフラグを設定した、自身のオブジェクト
	 */
	public UploadPartRequest withLastPart(boolean lastPart)
	{
		this.lastPart = lastPart;
		return (this);
	}
}
