/*
 *******************************************************************************
 * Copyright (C) 2004, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

package com.ibm.icu.text;

/**
 * A post-processor for Chinese text.
 */
final class RBNFChinesePostProcessor extends RBNFPostProcessor {
    private NFRuleSet lastRuleSet;
    private boolean longForm;
    private int format;

    private static final String[] rulesetNames = {
    "%traditional", "%simplified", "%accounting", "%time"
    };

    /**
     * Initialization routine for this instance, called once
     * immediately after first construction and never again.  
     */
    void init(RuleBasedNumberFormat formatter, String rules) {
    }

    /**
     * Work routine.  Post process the output, which was generated by the
     * ruleset with the given name.
     */
    void process(StringBuffer buf, NFRuleSet ruleSet) {
    // markers depend on what rule set we are using

    if (ruleSet != lastRuleSet) {
        String name = ruleSet.getName();
        for (int i = 0; i < rulesetNames.length; ++i) {
        if (rulesetNames[i].equals(name)) {
            format = i;
            longForm = i == 1 || i == 3;
            break;
        }
        }
    }

    if (longForm) {
        for (int i = buf.indexOf("*"); i != -1; i = buf.indexOf("*", i)) {
        buf.delete(i, i+1);
        }
        return;
    }

    final String DIAN = "\u9ede"; // decimal point

    final String[][] markers = {
        { "\u842c", "\u5104", "\u5146", "\u3007" }, // marker chars, last char is the 'zero'
        { "\u4e07", "\u4ebf", "\u5146", "\u3007" },
        { "\u842c", "\u5104", "\u5146", "\u96f6" }
        // need markers for time?
    };

    // remove unwanted lings
    // a '0' (ling) with * might be removed
    // mark off 10,000 'chunks', markers are Z, Y, W (zhao, yii, and wan)
    // already, we avoid two lings in the same chunk -- ling without * wins
    // now, just need  to avoid optional lings in adjacent chunks
    // process right to left

    // decision matrix:
    // state, situation
    //     state         none       opt.          req.
    //     -----         ----       ----          ----
    // none to right     none       opt.          req.  
    // opt. to right     none   clear, none  clear right, req.
    // req. to right     none   clear, none       req.

    // mark chunks with '|' for convenience
    {
        String[] m = markers[format];
        for (int i = 0; i < m.length-1; ++i) {
        int n = buf.indexOf(m[i]);
        if (n != -1) {
            buf.insert(n+m[i].length(), '|');
        }
        }
    }

    int x = buf.indexOf(DIAN);
    if (x == -1) {
        x = buf.length();
    }
    int s = 0; // 0 = none to right, 1 = opt. to right, 2 = req. to right
    int n = -1; // previous optional ling
    String ling = markers[format][3];
    while (x >= 0) {
        int m = buf.lastIndexOf("|", x);
        int nn = buf.lastIndexOf(ling, x);
        int ns = 0;
        if (nn > m) {
        ns = (nn > 0 && buf.charAt(nn-1) != '*') ? 2 : 1;
        }
        x = m - 1;

        // actually much simpler, but leave this verbose for now so it's easier to follow
        switch (s*3+ns) {
        case 0: /* none, none */
        s = ns; // redundant
        n = -1;
        break;
        case 1: /* none, opt. */
        s = ns;
        n = nn; // remember optional ling to right
        break;
        case 2: /* none, req. */
        s = ns;
        n = -1;
        break;
        case 3: /* opt., none */
        s = ns;
        n = -1;
        break;
        case 4: /* opt., opt. */
        buf.delete(nn-1, nn+ling.length()); // delete current optional ling
        s = 0;
        n = -1;
        break;
        case 5: /* opt., req. */
        buf.delete(n-1, n+ling.length()); // delete previous optional ling
        s = ns;
        n = -1;
        break;
        case 6: /* req., none */
        s = ns;
        n = -1;
        break;
        case 7: /* req., opt. */
        buf.delete(nn-1, nn+ling.length()); // delete current optional ling
        s = 0;
        n = -1;
        break;
        case 8: /* req., req. */
        s = ns;
        n = -1;
        break;
        default:
        throw new InternalError("whoops");
        }
    }

    for (int i = buf.indexOf("*"); i != -1; i = buf.indexOf("*", i)) {
        buf.delete(i, i+1);
    }
    for (int i = buf.indexOf("|"); i != -1; i = buf.indexOf("|", i)) {
        buf.delete(i, i+1);
    }

    // clean up, remove '*' and '|'
//      char[] data = buf.toString().toCharArray();
//      int w = 0;
//      for (int r = 0; r < data.length; ++r) {
//          char c;
//          if ((c = data[r]) != '*' && (c != '|')) {
//          if (w != r) {
//              data[w] = c;
//          }
//          ++w;
//          }
//      }
    }
}
