package com.lemenzo.messenger.sms;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Telephony;
import android.telephony.SmsMessage;
import android.telephony.SubscriptionManager;
import com.lemenzo.messenger.data.ContactResolver;
import com.lemenzo.messenger.data.MessageRepository;
import com.lemenzo.messenger.notifications.MessageNotificationManager;
import com.lemenzo.messenger.util.ReceiverAsync;

public final class SmsDeliverReceiver extends BroadcastReceiver {
    // Framework extra used by telephony broadcasts. Raw key keeps this source compatible
    // across platform branches where the public constant name can differ.
    private static final String EXTRA_SUBSCRIPTION_INDEX =
            "android.telephony.extra.SUBSCRIPTION_INDEX";

    @Override
    public void onReceive(Context context, Intent intent) {
        SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
        if (messages == null || messages.length == 0) return;

        String address = messages[0].getOriginatingAddress();
        long time = messages[0].getTimestampMillis();
        int subscriptionId = intent.getIntExtra(
                EXTRA_SUBSCRIPTION_INDEX,
                SubscriptionManager.INVALID_SUBSCRIPTION_ID);

        StringBuilder body = new StringBuilder();
        for (SmsMessage message : messages) {
            if (message != null && message.getMessageBody() != null) {
                body.append(message.getMessageBody());
            }
        }

        final Context appContext = context.getApplicationContext();
        final String messageBody = body.toString();
        ReceiverAsync.run(this, () -> {
            MessageRepository repo = new MessageRepository(appContext);
            Uri uri;
            try {
                uri = repo.insertInbox(address, messageBody, time, subscriptionId);
            } catch (SecurityException e) {
                return;
            }

            long threadId = repo.threadIdForMessage(uri);
            String title = new ContactResolver(appContext).displayName(address);

            MessageNotificationManager.notifyIncoming(
                    appContext,
                    threadId,
                    address,
                    subscriptionId,
                    title,
                    messageBody,
                    (address + time).hashCode());
        });
    }
}
