/**
 * $Revision$
 * $Date$
 *
 * Copyright 2003-2007 Jive Software.
 *
 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jivesoftware.smackx.workgroup.ext.macros;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * MacroGroup datamodel.
 */
public class MacroGroup {
    private List<Macro> macros;
    private List<MacroGroup> macroGroups;


    // Define MacroGroup
    private String title;

    public MacroGroup() {
        macros = new ArrayList<Macro>();
        macroGroups = new ArrayList<MacroGroup>();
    }

    public void addMacro(Macro macro) {
        macros.add(macro);
    }

    public void removeMacro(Macro macro) {
        macros.remove(macro);
    }

    public Macro getMacroByTitle(String title) {
        Collection<Macro> col = Collections.unmodifiableList(macros);
        Iterator<Macro> iter = col.iterator();
        while (iter.hasNext()) {
            Macro macro = (Macro)iter.next();
            if (macro.getTitle().equalsIgnoreCase(title)) {
                return macro;
            }
        }
        return null;
    }

    public void addMacroGroup(MacroGroup group) {
        macroGroups.add(group);
    }

    public void removeMacroGroup(MacroGroup group) {
        macroGroups.remove(group);
    }

    public Macro getMacro(int location) {
        return (Macro)macros.get(location);
    }

    public MacroGroup getMacroGroupByTitle(String title) {
        Collection<MacroGroup> col = Collections.unmodifiableList(macroGroups);
        Iterator<MacroGroup> iter = col.iterator();
        while (iter.hasNext()) {
            MacroGroup group = (MacroGroup)iter.next();
            if (group.getTitle().equalsIgnoreCase(title)) {
                return group;
            }
        }
        return null;
    }

    public MacroGroup getMacroGroup(int location) {
        return (MacroGroup)macroGroups.get(location);
    }


    public List<Macro>  getMacros() {
        return macros;
    }

    public void setMacros(List<Macro> macros) {
        this.macros = macros;
    }

    public List<MacroGroup> getMacroGroups() {
        return macroGroups;
    }

    public void setMacroGroups(List<MacroGroup> macroGroups) {
        this.macroGroups = macroGroups;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    
    public String toXML() {
    	StringBuilder buf = new StringBuilder();
    	buf.append("<macrogroup>");
    	buf.append("<title>" +  getTitle() + "</title>");
    	buf.append("<macros>");
    	for (Macro macro : getMacros())
		{
    		buf.append("<macro>");
    		buf.append("<title>" + macro.getTitle() + "</title>");
    		buf.append("<type>" + macro.getType() + "</type>");
    		buf.append("<description>" + macro.getDescription() + "</description>");
    		buf.append("<response>" + macro.getResponse() + "</response>");
    		buf.append("</macro>");
		}
    	buf.append("</macros>");
    	
    	if (getMacroGroups().size() > 0) {
    		buf.append("<macroGroups>");
    		for (MacroGroup groups : getMacroGroups()) {
    			buf.append(groups.toXML());
    		}
    		buf.append("</macroGroups>");
    	}
    	buf.append("</macrogroup>");
    	return buf.toString(); 
    }
}
