package com.lemenzo.messenger.mms;

import android.content.Context;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SubscriptionManager;

/** Carrier-specific MMS policy resolved for one SIM subscription. */
public final class MmsConfig {
    private static final int FALLBACK_MAX_MESSAGE_SIZE = 300 * 1024;
    private static final int FALLBACK_MAX_IMAGE_WIDTH = 1600;
    private static final int FALLBACK_MAX_IMAGE_HEIGHT = 1600;
    private static final int ABSOLUTE_HARD_MAX = 10 * 1024 * 1024;

    public final int maxMessageSize;
    public final int maxImageWidth;
    public final int maxImageHeight;
    public final int recipientLimit;
    public final boolean mmsEnabled;
    public final boolean groupMmsEnabled;
    public final boolean deliveryReportsEnabled;
    public final boolean appendTransactionId;

    private MmsConfig(Bundle b) {
        int configuredMax = b.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE, FALLBACK_MAX_MESSAGE_SIZE);
        maxMessageSize = clamp(configuredMax, 64 * 1024, ABSOLUTE_HARD_MAX);
        maxImageWidth = positiveOr(b.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_WIDTH, FALLBACK_MAX_IMAGE_WIDTH), FALLBACK_MAX_IMAGE_WIDTH);
        maxImageHeight = positiveOr(b.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_HEIGHT, FALLBACK_MAX_IMAGE_HEIGHT), FALLBACK_MAX_IMAGE_HEIGHT);
        recipientLimit = positiveOr(b.getInt(SmsManager.MMS_CONFIG_RECIPIENT_LIMIT, Integer.MAX_VALUE), Integer.MAX_VALUE);
        mmsEnabled = b.getBoolean(SmsManager.MMS_CONFIG_MMS_ENABLED, true);
        groupMmsEnabled = b.getBoolean(SmsManager.MMS_CONFIG_GROUP_MMS_ENABLED, true);
        deliveryReportsEnabled = b.getBoolean(SmsManager.MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED, true);
        appendTransactionId = b.getBoolean(SmsManager.MMS_CONFIG_APPEND_TRANSACTION_ID, false);
    }

    public static MmsConfig forSubscription(Context context, int subscriptionId) {
        SmsManager base = context.getSystemService(SmsManager.class);
        if (base == null) return new MmsConfig(new Bundle());
        SmsManager manager = subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
                ? base : base.createForSubscriptionId(subscriptionId);
        try {
            Bundle values = manager.getCarrierConfigValues();
            return new MmsConfig(values == null ? new Bundle() : values);
        } catch (RuntimeException e) {
            return new MmsConfig(new Bundle());
        }
    }

    /** Leaves protocol/PDU overhead so the final composed message stays below carrier max. */
    public int attachmentBudget(int textBytes) {
        int reserve = Math.max(8 * 1024, Math.min(32 * 1024, maxMessageSize / 10));
        return Math.max(16 * 1024, maxMessageSize - Math.max(0, textBytes) - reserve);
    }

    private static int positiveOr(int value, int fallback) {
        return value > 0 ? value : fallback;
    }

    private static int clamp(int value, int min, int max) {
        if (value < min) return min;
        if (value > max) return max;
        return value;
    }
}
