/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.core;

import java.util.ArrayList;
import java.util.Collection;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import org.codehaus.jackson.annotate.JsonProperty;
import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
import org.eclipse.osee.framework.jdk.core.util.EnumBase;
import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * @author Charles Shaw
 * @author Robert A. Fisher
 */
public class MethodFormatter implements Xmlizable, XmlizableStream {
    private final Collection<Argument> arguments = new ArrayList<>();

    public final class Argument {
        public final String Class;
        public final String Value;

        public Argument(final String Class, final String Value) {
            this.Class = Class;
            this.Value = Value;
        }

        @Override
        public String toString() {
            return "<" + Class + ">" + Value;
        }
    }

    public MethodFormatter add(float value) {
        arguments.add(new Argument(float.class.getName(), Double.toString(value)));
        return this;
    }

    public MethodFormatter add(double value) {
        arguments.add(new Argument(double.class.getName(), Double.toString(value)));
        return this;
    }

    public MethodFormatter add(byte value) {
        arguments.add(new Argument(byte.class.getName(), Double.toString(value)));
        return this;
    }

    public MethodFormatter add(short value) {
        arguments.add(new Argument(short.class.getName(), Double.toString(value)));
        return this;
    }

    public MethodFormatter add(int value) {
        arguments.add(new Argument(int.class.getName(), Integer.toString(value)));
        return this;
    }

    public MethodFormatter add(long value) {
        arguments.add(new Argument(long.class.getName(), Double.toString(value)));
        return this;
    }

    public MethodFormatter add(char value) {
        arguments.add(new Argument(char.class.getName(), Integer.toString(value)));
        return this;
    }

    public MethodFormatter add(boolean value) {
        arguments.add(new Argument(boolean.class.getName(), Boolean.toString(value)));
        return this;
    }

    public MethodFormatter add(EnumBase value) {
        arguments.add(new Argument(EnumBase.class.getName(), value.getName()));
        return this;
    }

    public MethodFormatter add(EnumBase[] value) {
        final String sep = ", ";
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < value.length; i++) {
            sb.append(value[i].getName()).append(sep);
        }
        if (sb.length() > sep.length()) {
            sb.setLength(sb.length() - sep.length());
        }
        sb.append("]");
        arguments.add(new Argument(EnumBase[].class.getName(), sb.toString()));
        return this;
    }

    public MethodFormatter add(Object value) {
        arguments.add(new Argument(value.getClass().getName(), value.toString()));
        return this;
    }

    @Override
    public String toString() {
        final String sep = ", ";
        StringBuilder sb = new StringBuilder();
        for (Argument argument : arguments) {
            sb.append(argument.toString()).append(sep);
        }
        if (sb.length() > sep.length()) {
            sb.setLength(sb.length() - sep.length());
        }
        return sb.toString();
    }

    @Override
    public Element toXml(Document doc) {
        Element toReturn = doc.createElement("MethodArguments");
        for (Argument argument : arguments) {
            Element element = doc.createElement("Argument");
            element.appendChild(Jaxp.createElement(doc, "Type", argument.Class));
            String toLog = argument.Value != null ? XmlSupport.format(argument.Value) : "null";
            element.appendChild(Jaxp.createElement(doc, "Value", toLog));
            toReturn.appendChild(element);
        }
        return toReturn;
    }

    @Override
    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
        writer.writeStartElement("MethodArguments");
        for (Argument argument : arguments) {
            writer.writeStartElement("Argument");
            XMLStreamWriterUtil.writeElement(writer, "Type", argument.Class);
            String toLog = argument.Value != null ? XmlSupport.format(argument.Value) : "null";
            XMLStreamWriterUtil.writeElement(writer, "Value", toLog);
            writer.writeEndElement();
        }
        writer.writeEndElement();
    }
    
    @JsonProperty
    public Collection<Argument> getMethodArguments() {
        return arguments;
    }
}
