package com.product;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import javax.ws.rs.core.MediaType;
import com.alibaba.fastjson.JSONObject;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.core.util.MultivaluedMapImpl;


public class MailgunSendEmail {
	 
	//////娴嬭瘯璐﹀彿
	//private static final String API_KEY = "84d2c563e45e4aa32000a0f608a20e32-cb3791c4-580c662f";
	//private static final String DOMAIN  = "sandbox425b6a32b61840fa902c2e614f4616fc.mailgun.org";
	
	//////姝e紡璐﹀彿
	private static final String API_KEY = "8d52b0a748b20c61331587fa9a3fe6fc-cb3791c4-8cf158ef";
	private static final String DOMAIN  = "mail.purtato.com";
	private static final String API_URI = "https://api.mailgun.net/v3/"+DOMAIN+"/messages";
	
	/**
	 * 鏅€氶偖浠跺彂閫侊紝涓嶅寘鍚ā鏉�
	 * @return
	 * @throws UnirestException
	 */
	public JsonNode sendSimpleMessage() throws UnirestException {
		HttpResponse<JsonNode> request = Unirest.post(API_URI)
			.basicAuth("api", API_KEY)
			//娴嬭瘯璐﹀彿鍙戜欢浜�
			//.queryString("from", "fuller@sandbox425b6a32b61840fa902c2e614f4616fc.mailgun.org")
			//姝e紡璐﹀彿鍙戜欢浜�
			.queryString("from", "brianho@mail.purtato.com")
			//.queryString("to", "b.hokaming@gmail.com")
			//.queryString("to", "FullerFB@163.com")
			//.queryString("to","370036259@qq.com")
			//.queryString("to","brianho1023@yahoo.com")
			.queryString("subject", "Mailgun test subject")
			.queryString("html","<html>Testing some Mailgun awesomness! 娴嬭瘯娴嬭瘯娴嬭瘯<p/><i>Bruce</i></html>")
			//.queryString("text", "Mailgun Testing")
			.asJson();
		return request.getBody();
	}
	
	/**
	 * 鍖呭惈妯℃澘鐨勯偖浠跺彂閫侊紝棣栧厛鍦╩ailgun绠$悊绔繘琛屾ā鏉块厤缃�
	 * @return
	 */
	public static ClientResponse SendSimpleMessage() {
		Client client = Client.create();
		client.addFilter(new HTTPBasicAuthFilter("api", API_KEY));
		WebResource webResource = client.resource("https://api.mailgun.net/v3/mail.purtato.com/messages");
		MultivaluedMapImpl formData = new MultivaluedMapImpl();
		formData.add("from", "brianho@mail.purtato.com");
		formData.add("subject", "Hello Brian Ho");
		formData.add("template", "test");
		formData.add("h:X-Mailgun-Variables", buildTemplateParameter());
		return webResource.type(MediaType.APPLICATION_FORM_URLENCODED).post(ClientResponse.class, formData);
	}
	/**
	 * 缁勮mailgun妯℃澘鍚嶇О涓簍est鐨勶紝name銆乺eset_password_url 杩欎袱涓弬鏁拌繘琛屼紶閫掓暟鎹�
	 * @return
	 */
	public static String buildTemplateParameter() {
		Map<String, Object> map = new HashMap<String,Object>();
		map.put("name", "Fuller");
		map.put("reset_password_url", "https://www.baidu.com");
		return JSONObject.toJSONString(map);
	}
	
	
	
	@SuppressWarnings("static-access")
	public static void main(String[] args) {
		
		MailgunSendEmail latchTest = new MailgunSendEmail();
		
		//////鏅€氭祴璇曞彂閫�
		/*
		JsonNode jsonNode;
		try {
			jsonNode = latchTest.sendSimpleMessage();
			System.out.println("result......"+jsonNode.toString());
		} catch (UnirestException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		*/
		
		
		//////閭欢妯℃澘娴嬭瘯鍙戦€�
		ClientResponse clientResponse = latchTest.SendSimpleMessage();
		System.out.println(clientResponse.getStatus());

		
		//////骞跺彂閭欢鍙戦€佹祴璇�
		/*
		Runnable taskTemp = new Runnable() {

			// 娉ㄦ剰锛屾澶勬槸闈炵嚎绋嬪畨鍏ㄧ殑锛岀暀鍧�
		    private int iCounter;

		    @Override
		    public void run() {
		        for(int i = 0; i < 5; i++) {
		            
		        	JsonNode jsonNode;
					try {
						jsonNode = latchTest.sendSimpleMessage();
						System.out.println("result......"+jsonNode.toString());
					} catch (UnirestException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					
		            iCounter++;
		            System.out.println(System.nanoTime() + " [" + Thread.currentThread().getName() + "] iCounter = " + iCounter);
		            try {
		                Thread.sleep(100);
		            } catch (InterruptedException e) {
		                e.printStackTrace();
		            }
		            
		        }
		    }
		};

		try {
			latchTest.startTaskAllInOnce(5, taskTemp);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		*/
		
	}
	
	
	public long startTaskAllInOnce(int threadNums, final Runnable task) throws InterruptedException {
        final CountDownLatch startGate = new CountDownLatch(1);
        final CountDownLatch endGate = new CountDownLatch(threadNums);
        for(int i = 0; i < threadNums; i++) {
            Thread t = new Thread() {
                public void run() {
                    try {
                        // 浣跨嚎绋嬪湪姝ょ瓑寰咃紝褰撳紑濮嬮棬鎵撳紑鏃讹紝涓€璧锋秾鍏ラ棬涓�
                        startGate.await();
                        try {
                            task.run();
                        } finally {
                            // 灏嗙粨鏉熼棬鍑�1锛屽噺鍒�0鏃讹紝灏卞彲浠ュ紑鍚粨鏉熼棬浜�
                            endGate.countDown();
                        }
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                }
            };
            t.start();
        }
        long startTime = System.nanoTime();
        System.out.println(startTime + " [" + Thread.currentThread() + "] All thread is ready, concurrent going...");
        // 鍥犲紑鍚棬鍙渶涓€涓紑鍏筹紝鎵€浠ョ珛椹氨寮€鍚紑濮嬮棬
        startGate.countDown();
        // 绛夌瓑缁撴潫闂ㄥ紑鍚�
        endGate.await();
        long endTime = System.nanoTime();
        System.out.println(endTime + " [" + Thread.currentThread() + "] All thread is completed.");
        return endTime - startTime;
	}
	
}