package com.babariviere.sms.status;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;

import com.babariviere.sms.permisions.Permissions;

import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.PluginRegistry;

/**
 * Created by Joan Pablo on 4/17/2018.
 */

public class SmsStateHandler implements EventChannel.StreamHandler, PluginRegistry.RequestPermissionsResultListener {

    private BroadcastReceiver smsStateChangeReceiver;
    final private PluginRegistry.Registrar registrar;
    private Permissions permissions;
    EventChannel.EventSink eventSink;

    public SmsStateHandler(PluginRegistry.Registrar registrar) {
        this.registrar = registrar;
        this.permissions = new Permissions(registrar.activity());
        registrar.addRequestPermissionsResultListener(this);
    }

    @Override
    public void onListen(Object o, EventChannel.EventSink eventSink) {
        this.eventSink = eventSink;
        smsStateChangeReceiver = new SmsStateChangeReceiver(eventSink);
        if(permissions.checkAndRequestPermission(
                new String[]{Manifest.permission.RECEIVE_SMS},
                Permissions.BROADCAST_SMS)){
            registerDeliveredReceiver();
            registerSentReceiver();
        }
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void registerDeliveredReceiver() {
        registrar.context().registerReceiver(
                smsStateChangeReceiver,
                new IntentFilter("SMS_DELIVERED"));
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void registerSentReceiver() {
        registrar.context().registerReceiver(
                smsStateChangeReceiver,
                new IntentFilter("SMS_SENT"));
    }

    @Override
    public void onCancel(Object o) {
        registrar.context().unregisterReceiver(smsStateChangeReceiver);
        smsStateChangeReceiver = null;
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode != Permissions.BROADCAST_SMS) {
            return false;
        }
        boolean isOk = true;
        for (int res: grantResults) {
            if (res != PackageManager.PERMISSION_GRANTED) {
                isOk = false;
                break;
            }
        }
        if (isOk) {
            registerDeliveredReceiver();
            registerSentReceiver();
            return true;
        }
        eventSink.error("#01", "permission denied", null);

        return false;
    }
}