package org.unicode.cldr.icu;

import java.io.File;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

/**
 * Class for converting CLDR dayPeriods data into a format suitable for writing
 * to ICU data. The regex-mapping method can't be used here because the special
 * handling of sets.
 * 
 * @author jchye
 */
public class DayPeriodsMapper {
    private String supplementalDir;

    public DayPeriodsMapper(String supplementalDir) {
        this.supplementalDir = supplementalDir;
    }

    /**
     * @return CLDR data converted to an ICU-friendly format
     */
    public IcuData fillFromCldr() {
        IcuData icuData = new IcuData("dayPeriods.xml", "dayPeriods", false);
        DayPeriodsHandler handler = new DayPeriodsHandler(icuData);
        File inputFile = new File(supplementalDir, "dayPeriods.xml");
        MapperUtils.parseFile(inputFile, handler);
        return icuData;
    }

    private class DayPeriodsHandler extends MapperUtils.EmptyHandler {
        private IcuData icuData;
        private int setNum;

        public DayPeriodsHandler(IcuData icuData) {
            this.icuData = icuData;
            setNum = 0;
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attr) throws SAXException {
            if (qName.equals("dayPeriodRules")) {
                setNum++;
                String[] locales = attr.getValue("locales").split("\\s+");
                for (String locale : locales) {
                    icuData.add("/locales/" + locale, "set" + setNum);
                }
            } else if (qName.equals("dayPeriodRule")) {
                String type = attr.getValue("type");
                String prefix = "/rules/set" + setNum + "/" + type + "/";
                // Possible attribute names: type, before, after, at.
                for (int i = 0; i < attr.getLength(); i++) {
                    String attrName = attr.getLocalName(i);
                    if (!attrName.equals("type")) {
                        icuData.add(prefix + attrName, attr.getValue(i));
                    }
                }
            }
        }
    }
}
