package com.google.wireless.gdata2.spreadsheets.serializer.xml;

import com.google.wireless.gdata2.data.Entry;
import com.google.wireless.gdata2.data.StringUtils;
import com.google.wireless.gdata2.parser.ParseException;
import com.google.wireless.gdata2.parser.xml.XmlParserFactory;
import com.google.wireless.gdata2.serializer.xml.XmlEntryGDataSerializer;
import com.google.wireless.gdata2.spreadsheets.data.CellEntry;

import org.xmlpull.v1.XmlSerializer;

import java.io.IOException;

/**
 * A serializer for handling GData Spreadsheets Cell entries.
 */
public class XmlCellEntryGDataSerializer extends XmlEntryGDataSerializer {
    /** The namespace to use for the GData Cell attributes */
    public static final String NAMESPACE_GS = "gs";

    /** The URI of the GData Cell namespace */
    public static final String NAMESPACE_GS_URI =
            "http://schemas.google.com/spreadsheets/2006";

    /**
     * Creates a new XmlCellEntryGDataSerializer.
     * 
     * @param entry the entry to be serialized
     */
    public XmlCellEntryGDataSerializer(XmlParserFactory xmlFactory,
            Entry entry) {
        super(xmlFactory, entry);
    }

    /**
     * Sets up the GData Cell namespace.
     * 
     * @param serializer the serializer to use
     */
    protected void declareExtraEntryNamespaces(XmlSerializer serializer)
            throws IOException {
        serializer.setPrefix(NAMESPACE_GS, NAMESPACE_GS_URI);
    }

    /*
     * Handles the non-Atom data belonging to the GData Spreadsheets Cell
     * namespace.
     * 
     * @param serializer the XML serializer to use
     * @param format unused
     * @throws ParseException if the data could not be serialized
     * @throws IOException on network error
     */
    protected void serializeExtraEntryContents(XmlSerializer serializer,
            int format) throws ParseException, IOException {
        CellEntry entry = (CellEntry) getEntry();
        int row = entry.getRow();
        int col = entry.getCol();
        String value = entry.getValue();
        String inputValue = entry.getInputValue();
        if (row < 0 || col < 0) {
            throw new ParseException("Negative row or column value");
        }

        // cells require row & col attrs, and allow inputValue and
        // numericValue
        serializer.startTag(NAMESPACE_GS_URI, "cell");
        serializer.attribute(null /* ns */, "row", "" + row);
        serializer.attribute(null /* ns */, "col", "" + col);
        if (inputValue != null) {
            serializer.attribute(null /* ns */, "inputValue", inputValue);
        }
        if (entry.hasNumericValue()) {
            serializer.attribute(null /* ns */, "numericValue", entry
                    .getNumericValue());
        }

        // set the child text...
        value = StringUtils.isEmpty(value) ? "" : value;
        serializer.text(value);
        serializer.endTag(NAMESPACE_GS_URI, "cell");
    }
}
