package guard.api.sensitive.ui.sapiguard.hookedapis;

import java.util.ArrayList;
import java.util.List;

import guard.api.sensitive.ui.sapiguard.utils.PrivacyManager;
import guard.api.sensitive.ui.sapiguard.XHook;
import guard.api.sensitive.ui.sapiguard.utils.XParam;

public class XSmsManager extends XHook {
	private Methods mMethod;

	private XSmsManager(Methods method, String restrictionName) {
		super(restrictionName, method.name().replace("Srv_", ""), method.name());
		mMethod = method;
	}

	public String getClassName() {
		if (mMethod.name().startsWith("Srv_"))
			return "com.android.internal.telephony.IccSmsInterfaceManager";
		else
			return "android.telephony.SmsManager";
	}

	// @formatter:off

	// public static ArrayList<SmsMessage> getAllMessagesFromIcc()
	// public Bundle getCarrierConfigValues()
	// public void sendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent)
	// public void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents)
	// public void sendMultimediaMessage(Context context, Uri contentUri, String locationUrl, Bundle configOverrides, PendingIntent sentIntent)
	// public void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
	// frameworks/base/telephony/java/android/telephony/SmsManager.java
	// http://developer.android.com/reference/android/telephony/SmsManager.html

	// public List<SmsRawData> getAllMessagesFromIccEf(String callingPackage)
	// public void sendData(java.lang.String callingPkg, java.lang.String destAddr, java.lang.String scAddr, int destPort, byte[] data, android.app.PendingIntent sentIntent, android.app.PendingIntent deliveryIntent)
	// public void sendMultipartText(java.lang.String callingPkg, java.lang.String destinationAddress, java.lang.String scAddress, java.util.List<java.lang.String> parts, java.util.List<android.app.PendingIntent> sentIntents, java.util.List<android.app.PendingIntent> deliveryIntents)
	// public void sendText(java.lang.String callingPkg, java.lang.String destAddr, java.lang.String scAddr, java.lang.String text, android.app.PendingIntent sentIntent, android.app.PendingIntent deliveryIntent)
	// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/com/android/internal/telephony/IccSmsInterfaceManager.java/

	// @formatter:on

	// @formatter:off
	private enum Methods {
		getAllMessagesFromIcc, getCarrierConfigValues, sendDataMessage, sendMultipartTextMessage, sendMultimediaMessage, sendTextMessage,
		Srv_getAllMessagesFromIccEf, Srv_sendData, Srv_sendMultipartText, Srv_sendText
	};
	// @formatter:on

	public static List<XHook> getInstances(boolean server) {
		List<XHook> listHook = new ArrayList<XHook>();
		if (server) {
			listHook.add(new XSmsManager(Methods.Srv_getAllMessagesFromIccEf, PrivacyManager.cMessages));
			listHook.add(new XSmsManager(Methods.Srv_sendData, PrivacyManager.cCalling));
			listHook.add(new XSmsManager(Methods.Srv_sendMultipartText, PrivacyManager.cCalling));
			listHook.add(new XSmsManager(Methods.Srv_sendText, PrivacyManager.cCalling));
		} else {
			listHook.add(new XSmsManager(Methods.getAllMessagesFromIcc, PrivacyManager.cMessages));
			listHook.add(new XSmsManager(Methods.getCarrierConfigValues, PrivacyManager.cMessages));
			listHook.add(new XSmsManager(Methods.sendDataMessage, PrivacyManager.cCalling));
			listHook.add(new XSmsManager(Methods.sendMultimediaMessage, PrivacyManager.cCalling));
			listHook.add(new XSmsManager(Methods.sendMultipartTextMessage, PrivacyManager.cCalling));
			listHook.add(new XSmsManager(Methods.sendTextMessage, PrivacyManager.cCalling));
		}
		return listHook;
	}

	@Override
	protected void before(XParam param) throws Throwable {
		switch (mMethod) {
		case getAllMessagesFromIcc:
		case getCarrierConfigValues:
			// Do nothing
			break;

		case sendDataMessage:
		case sendMultipartTextMessage:
		case sendTextMessage:

		case sendMultimediaMessage:


		case Srv_getAllMessagesFromIccEf:
			// Do nothing
			break;

		case Srv_sendData:
		case Srv_sendText:
		case Srv_sendMultipartText:

		}
	}

	@Override
	@SuppressWarnings("rawtypes")
	protected void after(XParam param) throws Throwable {
		switch (mMethod) {
		case getAllMessagesFromIcc:

		case getCarrierConfigValues:


		case sendDataMessage:
		case sendMultimediaMessage:
		case sendMultipartTextMessage:
		case sendTextMessage:
			// Do nothing
			break;

		case Srv_getAllMessagesFromIccEf:


		case Srv_sendData:
		case Srv_sendText:
		case Srv_sendMultipartText:
			// Do nothing
			break;
		}
	}
}
