package org.unicode.cldr.util;

import com.ibm.icu.text.BreakIterator;
import com.ibm.icu.util.ULocale;

public class RangeAbbreviator {
    private BreakIterator breaker1;
    private BreakIterator breaker2;
    private String separator;
    private StringBuilder buffer = new StringBuilder();

    public RangeAbbreviator(BreakIterator breaker, String separator) {
        this.breaker1 = (BreakIterator) breaker.clone();
        this.breaker2 = (BreakIterator) breaker.clone();
        this.separator = separator;
    }

    public RangeAbbreviator(ULocale breaker, String separator) {
        this(BreakIterator.getWordInstance(breaker), separator);
    }

    public String abbreviate(String firstString, String secondString) {
        if (firstString.equals(secondString)) {
            return firstString;
        }
        buffer.setLength(0);
        breaker1.setText(firstString);
        breaker2.setText(secondString);

        // find common initial section
        // we use two offset variables, in case we want to have some kind of equivalence later.
        int start1 = breaker1.first();
        int start2 = breaker2.first();
        while (true) {
            breaker1.next();
            final int current1 = breaker1.current();
            if (current1 == BreakIterator.DONE) {
                break;
            }
            breaker2.next();
            final int current2 = breaker2.current();
            if (current2 == BreakIterator.DONE) {
                break;
            }
            if (!firstString.regionMatches(start1, secondString, start2, current1 - start1)) {
                break;
            }
            start1 = current1;
            start2 = current2;
        }

        // find common initial section
        int end1 = breaker1.last();
        while (true) {
            breaker1.previous();
            final int current1 = breaker1.current();
            if (current1 == BreakIterator.DONE) {
                break;
            }
            breaker2.previous();
            final int current2 = breaker2.current();
            if (current2 == BreakIterator.DONE) {
                break;
            }
            if (!firstString.regionMatches(current1, secondString, current2, end1 - current1)) {
                break;
            }
            end1 = current1;
        }
        return buffer.append(firstString.substring(0, end1)).append(separator).append(secondString.substring(start2))
            .toString();
    }
}