package com.dbs.mplus.fatima.framework.util;

import com.dbs.mplus.fatima.framework.MPlusFrameworkConstants;
import com.dbs.mplus.fatima.framework.util.http.MPlusHostnameVerifier;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

/**
 * https 요청을 보내고 응답을 반환 받음 
 * 
 * @author aple
 *
 */
public class MPlusHttpsClientUtil {

	/**
	 * 앱버전 확인 
	 * @param urlStr
	 * @param appName
	 * @param uuid
	 * @return
	 */
	public static String requestAppVersion(String urlStr, String appName, String uuid) {
		// POST 내용 만들기 
		String message = null; 
		
		try { 
			JSONObject obj = null; 
			obj = new JSONObject(); 
			obj.put("platformType", "A"); 
			obj.put("certType", MPlusFrameworkConstants.CERT_TYPE);
			obj.put("appName", appName); 
			message = obj.toString(); 
		}
		catch(final JSONException ex) { 
			MPlusLogUtil.DEBUG(MPlusHttpsClientUtil.class, "요청객체 생성 실패", ex);
			return null; 
		}
		
		// 서버 연결 
		try { 
			//MPlusLogUtil.DEBUG(MPlusHttpsClientUtil.class, "req : " + message);
			return MPlusHttpsClientUtil.request(urlStr, "POST", uuid, message);
		}
		catch(final Exception ex) { 
			MPlusLogUtil.DEBUG(MPlusHttpsClientUtil.class, "요청오류발생", ex);
			// 버전체크 기능이 지나갈 수 있도록 null을 리턴하는 수 밖에... 
		}
		
		return null; 		
	}
	
	/**
	 * 요청을 보내고 응답을 받아서 반환 
	 * @param urlStr 요청주소 
	 * @param method GET/POST 
	 * @param uuid 단말기 식별정보 
	 * @param data 전송할 데이터 
	 * @return
	 * @throws Exception
	 */
	private static String request(String urlStr, String method, String uuid, String data) throws Exception { 
		//HttpsURLConnection conn = null;
		HttpURLConnection conn = null;
		PrintWriter writer = null; 
		BufferedReader reader = null; 

		try { 
			final URL url = new URL(urlStr);
			boolean bSecure = urlStr.startsWith("https");

			// 서버연결
			if(bSecure) {
				conn = (HttpsURLConnection) url.openConnection();
			}
			else {
				conn = (HttpURLConnection) url.openConnection();
			}

			// 필요한 설정들 잡아주고
			if(bSecure) {
				((HttpsURLConnection) conn).setHostnameVerifier(new MPlusHostnameVerifier());
			}

			conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
			conn.setRequestProperty("User-Agent", "uuid=" + uuid);
			conn.setRequestMethod(method);
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setConnectTimeout(MPlusFrameworkConstants.HTTP_CONNECT_TIMEOUT);
			conn.setReadTimeout(MPlusFrameworkConstants.HTTP_READ_TIMEOUT);
	
			// 요청 보내기 
			writer = new PrintWriter(new OutputStreamWriter(conn.getOutputStream())); 
			writer.println(data); 
			writer.flush(); 
			
			// 입력스트림 뽑기 
			reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
			
			// 실패면 코드만 반환
			if(conn.getResponseCode() != HttpsURLConnection.HTTP_OK) { 
//				// TODO 배포할때는 로그 막아서 배포  
//				LogUtil.DEBUG(HttpsClientUtil.class, HttpsClientUtil.read(reader));
				return conn.getResponseCode() + ""; 				
			}

			// 성공이면 결과를 읽어서 반환 
			return MPlusHttpsClientUtil.read(reader);
		}
		catch(final Exception ex) {
			MPlusLogUtil.ERROR(MPlusHttpsClientUtil.class, "버전확인 오류발생", ex);
			throw ex; 
		}
		finally {
			// 입력 스트림 정리 
			if(reader != null) { 
				try { 
					reader.close();
				}
				catch(final IOException io) { 
					MPlusLogUtil.DEBUG(MPlusHttpsClientUtil.class, "입력스트림 닫기 실패", io);
				}
				finally { 
					reader = null; 
				} 
			}
			// 출력 스트림 정리 
			if(writer != null) { 
				writer.close(); 
				writer = null;
			} 
		
			// 컨넥션 정리 
			if(conn != null) { 
				conn.disconnect();
				conn = null; 
			}
		}
	}
	
	/**
	 * 데이터 읽기 
	 * @param reader
	 * @return
	 */
	private static String read(BufferedReader reader) { 
		final StringBuilder builder = new StringBuilder();
		String line = null; 
		
		try { 
			while((line = reader.readLine()) != null) { 
				builder.append(line); 
			}		
		}
		catch(final IOException ex) { 
			MPlusLogUtil.DEBUG(MPlusHttpsClientUtil.class, "스트림 읽기 실패", ex);
			return ""; 
		}
		
		return builder.toString();
	}
}
