/*
 * Copyright (c) 2009 The openGion Project.
 *
 * 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 org.opengion.fukurou.queue;

import org.opengion.fukurou.util.StringUtil;
import org.opengion.hayabusa.common.HybsSystem;
import org.opengion.hayabusa.common.HybsSystemException;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.InstanceProfileCredentialsProvider;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.SendMessageRequest;
import com.sun.star.uno.RuntimeException;

/**
 * SQSサーバへのメッセージキュー送信クラス
 * 
 *  SQSサーバへのメッセージキュー送信用のクラスです。
 * AmazonSQSへの送信が可能です。
 * 
 *  @og.group メッセージ連携
 *  
 *  @og.rev 5.10.14.0 (2019/08/01) 新規作成
 *  
 * @version 5
 * @author oota
 * @since JDK7
 */
public class QueueSend_SQS implements QueueSend {
	String sqsUrl = "";
	Boolean batch = false;
	AmazonSQS client;

	/**
	 * 接続処理
	 * SQSサーバに接続を行います。
	 * 
	 * @param jmsServer jmsサーバ接続名(バッチの場合はurl)
	 */
	@Override
	public void connect(final String jmsServer) {
		sqsUrl = jmsServer;

		try {
			/** proxy設定 */
			// ローカルテスト用(テスト後に削除予定)
			if (batch) {
				final String accessKey = System.getProperty("accessKey");

				if (StringUtil.isNull(accessKey)) {
					// IAMロールによる認証
					client = AmazonSQSClientBuilder.standard()
							.withCredentials(new InstanceProfileCredentialsProvider(false)).build();
				} else {
					final String secretKey = System.getProperty("secretKey");
					AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
					// proxy情報を設定して、接続に行く
					ClientConfiguration conf = new ClientConfiguration();
					conf.setProtocol(Protocol.HTTPS);
					conf.setProxyHost("mtc-px14");
					conf.setProxyPort(8081);
					client = AmazonSQSClientBuilder.standard()
							.withCredentials(new AWSStaticCredentialsProvider(credentials))
							.withClientConfiguration(conf).withRegion(Regions.AP_NORTHEAST_1.getName()).build();
					

				}
			} else {
				// aws上での実行用
				// ｱｸｾｽｷｰ
				final String sqsAccessKey = HybsSystem.sys("CLOUD_SQS_ACCESS_KEY");
				String sqsSecretKey = "";
				String sqsServiceEndPoint = "";
				String sqsRegion = "";

				if (StringUtil.isNull(sqsAccessKey)) {
					// IAMロールによる認証
					client = AmazonSQSClientBuilder.standard()
							.withCredentials(new InstanceProfileCredentialsProvider(false)).build();
				} else {
					// アクセスキーによる認証
					// ｼｰｸﾚｯﾄｷｰ
					sqsSecretKey = HybsSystem.sys("CLOUD_SQS_SECRET_KEY");
					// ｴﾝﾄﾞﾎﾟｲﾝﾄ
					sqsServiceEndPoint = HybsSystem.sys("CLOUD_SQS_SERVICE_END_POINT");
					// ﾚｷﾞｵﾝ
					sqsRegion = HybsSystem.sys("CLOUD_SQS_REGION");

					AWSCredentials sqsCredentials = new BasicAWSCredentials(sqsAccessKey, sqsSecretKey);

					// エンドポイント設定
					EndpointConfiguration endpointConfiguration = new EndpointConfiguration(sqsServiceEndPoint,
							sqsRegion);
					client = AmazonSQSClientBuilder.standard()
							.withCredentials(new AWSStaticCredentialsProvider(sqsCredentials))
							.withEndpointConfiguration(endpointConfiguration).build();
				}
			}
		} catch (Exception e) {
			throwErrMsg("SQSサーバの接続に失敗しました。" + e.getMessage());
		}
	}

	/**
	 * エラーメッセージ送信
	 * 
	 * バッチ処理の場合は、RuntimeExceptionをスローします。
	 * 画面処理の場合は、HybsSystemExceptionをスローします。
	 * 
	 * @param errMsg エラーメッセージ
	 */
	public void throwErrMsg(final String errMsg) {
		if (batch) {
			throw new RuntimeException(errMsg);
		} else {
			throw new HybsSystemException(errMsg);
		}
	}

	/**
	 * メッセージ送信
	 * MQサーバにメッセージキューを送信します。
	 * 
	 * @param info 送信メッセージキュー情報 
	 */
	@Override
	public void sendMessage(QueueInfo info) {
		if(client == null) {
			throwErrMsg("SQSサーバに接続されていません。");
		}
		
		SendMessageRequest request = new SendMessageRequest(sqsUrl, info.getMessage());

		/** 情報設定 */
		// FIFOタイプのみ設定します。
		// グループID
		request.setMessageGroupId(info.getSqsFifoGroupId());
		// 重複禁止ID
		request.setMessageDeduplicationId(info.getSqsFifoDedupliId());

		/** 送信処理 */
		try {
			client.sendMessage(request);
		} catch (Exception e) {
			throwErrMsg("キューの送信処理に失敗しました。" + e.getMessage());
		}
	}

	/**
	 * クローズ処理
	 * SQSサーバとの接続をクローズします。
	 */
	@Override
	public void close() {
		if(client != null) {
			client.shutdown();
		}
	}

	@Override
	public void setBatchFlg(final Boolean batchFlg) {
		batch = batchFlg;
	}

	/**
	 * テスト用メソッド テスト用メソッドです。
	 * 
	 * @param args 引数
	 */
	public static void main(String[] args) {
		QueueSend queueSend = new QueueSend_SQS();
		// バッチ処理
		queueSend.setBatchFlg(true);

		QueueInfo queueInfo = new QueueInfo();

		String url = "";
		// 標準キューの場合
		url = "https://sqs.ap-northeast-1.amazonaws.com/716527209952/Standard";
		// FIFOキューの場合
		url = "https://sqs.ap-northeast-1.amazonaws.com/716527209952/MyFifo.fifo";
		queueInfo.setSqsFifoGroupId("sampleGrp");

		// 共通
		queueInfo.setMessage("サンプルメッセージ1");

		queueSend.connect(url);
		queueSend.sendMessage(queueInfo);
	}
}
