package com.lemenzo.multisms;

import android.telephony.SmsMessage;

final class SmsLengthCalculator {
    private SmsLengthCalculator() {}

    static final class Result {
        final int segments;
        final int codeUnitsUsed;
        final int codeUnitsRemaining;
        final int encoding;
        final int visibleCharacters;

        Result(int segments, int codeUnitsUsed, int codeUnitsRemaining,
               int encoding, int visibleCharacters) {
            this.segments = Math.max(0, segments);
            this.codeUnitsUsed = Math.max(0, codeUnitsUsed);
            this.codeUnitsRemaining = Math.max(0, codeUnitsRemaining);
            this.encoding = encoding;
            this.visibleCharacters = Math.max(0, visibleCharacters);
        }

        boolean isUnicode() {
            return encoding == SmsMessage.ENCODING_16BIT;
        }

        int singleSegmentCapacity() {
            return isUnicode() ? 70 : 160;
        }

        int concatenatedSegmentCapacity() {
            return isUnicode() ? 67 : 153;
        }
    }

    static Result calculate(String text) {
        if (text == null || text.isEmpty()) {
            return new Result(0, 0, 0, SmsMessage.ENCODING_7BIT, 0);
        }

        int[] length = SmsMessage.calculateLength(text, false);
        int segments = length != null && length.length > 0 ? length[0] : 0;
        int used = length != null && length.length > 1 ? length[1] : 0;
        int remaining = length != null && length.length > 2 ? length[2] : 0;
        int encoding = length != null && length.length > 3
                ? length[3] : SmsMessage.ENCODING_UNKNOWN;

        int visible = text.codePointCount(0, text.length());
        return new Result(segments, used, remaining, encoding, visible);
    }
}
