package com.ittianyu.mobileguard.service;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Telephony;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;

import com.ittianyu.mobileguard.constant.Constant;
import com.ittianyu.mobileguard.dao.BlacklistDao;
import com.ittianyu.mobileguard.db.BlacklistDb;
import com.ittianyu.mobileguard.domain.BlacklistBean;
import com.ittianyu.mobileguard.utils.CallUtils;
import com.ittianyu.mobileguard.utils.SmsUtils;

/**
 * blacklist intercept service
 * will intercept call or sms if the phone number in blacklist
 */
public class BlacklistInterceptService extends Service {
    private static final String URI_CALL = "content://call_log/calls";

    private SmsReceiver smsReceiver;
    private TelephonyManager telephonyManager;
    private PhoneStateListener phoneStateListener = new PhoneStateListener(){
        @Override
        public void onCallStateChanged(int state, final String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            // state is not CALL_STATE_RINGING
            if(TelephonyManager.CALL_STATE_RINGING != state) {
                return;
            }
            // check whether in blacklist
            BlacklistDao dao = new BlacklistDao(BlacklistInterceptService.this);
            BlacklistBean bean = dao.selectByPhone(incomingNumber);
            if(null == bean) {// not in blacklist
                return;
            }
            // check mode whether has call
            int mode = bean.getMode();
            if((BlacklistDb.MODE_CALL & mode) != 0) {// has call mode, need intercept
                // register call database data change listener
                getContentResolver().registerContentObserver(Uri.parse(URI_CALL),
                        true, new ContentObserver(new Handler()) {
                            @Override
                            public void onChange(boolean selfChange) {
                                // unregister listener, just delete once
                                getContentResolver().unregisterContentObserver(this);
                                // delete the current call record
                                int count = CallUtils.deleteLatestCall(BlacklistInterceptService.this, incomingNumber);
                                System.out.println("delete count = " + count);
                            }
                        });

                if (CallUtils.endCall()) {
                    System.out.println("call from " + incomingNumber + " was intercepted");
                } else {
                    System.out.println("call from " + incomingNumber + " was failed to intercepted");
                }
            }
        }
    };



    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
//        System.out.println("BlacklistInterceptService onCreate");
        // register call listener
        telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

        // register sms receiver
        smsReceiver = new SmsReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Constant.ACTION_SMS_RECEIVED);
        // set max priority
        filter.setPriority(Integer.MAX_VALUE);
        // register
        registerReceiver(smsReceiver, filter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("BlacklistInterceptService onDestroy");
        // unregister call listener
        telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
        // unregister sms receiver
        unregisterReceiver(smsReceiver);
    }
}




class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        // get sms messages
        SmsMessage[] messages = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
        } else {
            messages = SmsUtils.getMessagesFromIntent(intent);
        }
        // check whether sender in blacklist
        BlacklistDao dao = new BlacklistDao(context);
        for (SmsMessage message: messages) {
            // get sender
            String sender = message.getOriginatingAddress();
            // select by phone
            BlacklistBean bean = dao.selectByPhone(sender);
            if(null == bean) {// not in blacklist
                continue;
            }
            // check intercept mode
            if((BlacklistDb.MODE_SMS & bean.getMode()) != 0) {// has sms mode, need intercept
                // abort sms
                abortBroadcast();
            }
        }

    }
}