package com.droidyue.translate.core;

import com.droidyue.app.utils.AppLog;
import com.droidyue.app.utils.AppUtils;
import com.droidyue.app.utils.HttpUtils;
import com.droidyue.translate.AppSettings;
import com.droidyue.translate.R;
import com.droidyue.translate.core.TranslateModels.TranslateRequest;
import com.droidyue.translate.core.TranslateModels.TranslateResult;

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

import android.net.Uri;

import java.util.HashMap;

public class BaiduTranslator extends Translator{
	private static final String API_KEY = "20160220000012732";
	private static final String API_SECRET = "4E8sObv8T8uvmdi9HG11";
	private static final String SALT = "baidu_salty";

	private static final String REQUEST_URL =
			"http://api.fanyi.baidu.com/api/trans/vip/translate?q=%query%&from=%from%&to=%to%&appid=%api_key%&salt=%salt%&sign=%sign%";

	private static final String LOGTAG = "BaiduTranslator";
	
	private final HashMap<String, String> mSpecialLanguageMap = new HashMap<String, String>();
	/**
	 * 
		中文	zh	英语	en
		日语	jp	韩语	kor
		西班牙语	spa	法语	fra
		泰语	th	阿拉伯语	ara
		俄罗斯语	ru	葡萄牙语	pt
		粤语	yue	文言文	wyw
		白话文	zh	自动检测	auto
		德语	de	意大利语	it
	 */
	{
		putLanguageMap(R.string.pref_value_language_korean, "kor");
		putLanguageMap(R.string.pref_value_language_spanish, "spa");
		putLanguageMap(R.string.pref_value_language_french, "fra");
		putLanguageMap(R.string.pref_value_language_arabic, "ara");
		
	}
	
	private final TranslateResult mErrorResult = new TranslateResult();
	{
		mErrorResult.mErrorCode = -1;
	}

	private void putLanguageMap(int textResId, String requestLanguage) {
		mSpecialLanguageMap.put(AppSettings.getInstance().getResString(textResId), requestLanguage);
	}
	
	
	@Override
	protected TranslateResult doTranslateBackground(final TranslateRequest request) {
		String query = Uri.encode(request.mQuery);
		String fromLan = obtainFromLanguage(request);
		String toLan = obtainToLanguage(request);
		String encryptedSign = API_KEY + request.mQuery + SALT + API_SECRET;
		String sign = AppUtils.getMD5(encryptedSign.getBytes());
		String url = REQUEST_URL.replace("%api_key%", API_KEY).replace("%query%", query)
				.replace("%from%", fromLan).replace("%to%", toLan)
				.replace("%salt%", SALT).replace("%sign%", sign);
		String rawResponse = HttpUtils.doGet(url);
		AppLog.i(LOGTAG, "rawResponse=" + rawResponse + "; url=" + url);
		return parseTranslateResult(rawResponse); 
	}

	private TranslateResult parseTranslateResult(String rawResponse) {
		TranslateResult result;
		if (null != rawResponse) {
			try {
				JSONObject jsonObj = new JSONObject(rawResponse);
				TranslateResult temp = new TranslateResult();
				temp.mErrorCode = 0;
				temp.mDestText = jsonObj.getJSONArray("trans_result").getJSONObject(0).getString("dst");
				result = temp;
			} catch (JSONException e) {
				e.printStackTrace();
				result = mErrorResult;
			}
		} else {
			result = mErrorResult;
		}
		return result;
	}
	
	
	
	@Override
	public boolean isTargetLanguageSupport(String languageCode) {
		return false;
	}
	
	private String obtainFromLanguage(final TranslateRequest request) {
		return "auto";
	}
	
	private String obtainToLanguage(final TranslateRequest request) {
		String destLanguage = mSpecialLanguageMap.get(request.mToLanguage);
		if (null == destLanguage) {
			destLanguage = request.mToLanguage;
		}
		return destLanguage;
	}

}