/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.activemq.openwire.tool.commands;

import java.io.PrintWriter;
import java.util.Set;

import org.codehaus.jam.JProperty;

public class CommandSourceGenerator extends CommandCodeGenerator {

    public void generate( PrintWriter out ) {

        // Start with the license.
        generateLicence(out);

        populateIncludeFilesSet();
        for( String include : getIncludeFiles() ) {
            if( include != null ) {
                out.println("#include "+include);
            }
        }
        out.println("");
        out.println("using namespace std;");
        out.println("using namespace activemq;");
        out.println("using namespace activemq::exceptions;");
        out.println("using namespace activemq::commands;");
        out.println("using namespace decaf::lang;");
        out.println("using namespace decaf::lang::exceptions;");
        out.println("");
        out.println("/*");
        out.println(" *");
        out.println(" *  Command code for OpenWire format for "+getClassName() );
        out.println(" *");
        out.println(" *  NOTE!: This file is auto generated - do not modify!");
        out.println(" *         if you need to make a change, please see the Java Classes in the");
        out.println(" *         activemq-cpp-openwire-generator module");
        out.println(" *");
        out.println(" */");
        out.println("");
        out.println("////////////////////////////////////////////////////////////////////////////////");
        out.println(""+getClassName()+"::"+getClassName()+"() : " + getBaseClassName() + "() {");
        out.println("");
        generateDefaultConstructorBody(out);
        out.println("}");
        out.println("");
        if( isAssignable() ) {
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println(""+getClassName()+"::"+getClassName()+"( const "+getClassName()+"& other ) : " + getBaseClassName() + "() {");
            out.println("    this->copyDataStructure( &other );");
            out.println("}");
            out.println("");
        }
        generateAdditionalConstructors(out);
        out.println("////////////////////////////////////////////////////////////////////////////////");
        out.println(""+getClassName()+"::~"+getClassName()+"() {");
        generateDestructorBody(out);
        out.println("}");
        out.println("");
        out.println("////////////////////////////////////////////////////////////////////////////////");
        out.println(getClassName()+"* "+getClassName()+"::cloneDataStructure() const {");
        generateCloneDataStructureBody(out);
        out.println("}");
        out.println("");
        out.println("////////////////////////////////////////////////////////////////////////////////");
        out.println("void "+getClassName()+"::copyDataStructure( const DataStructure* src ) {");
        out.println("");
        out.println("    // Protect against invalid self assignment.");
        out.println("    if( this == src ) {");
        out.println("        return;");
        out.println("    }");
        out.println("");
        out.println("    const "+getClassName()+"* srcPtr = dynamic_cast<const "+getClassName()+"*>( src );");
        out.println("");
        out.println("    if( srcPtr == NULL || src == NULL ) {");
        out.println("        throw decaf::lang::exceptions::NullPointerException(");
        out.println("            __FILE__, __LINE__,");
        out.println("            \""+getClassName()+"::copyDataStructure - src is NULL or invalid\" );");
        out.println("    }");
        out.println("");
        if( getBaseClassName() != null ) {
            out.println("    // Copy the data of the base class or classes");
            out.println("    "+ getBaseClassName() +"::copyDataStructure( src );");
            out.println("");
        }
        generateCopyDataStructureBody(out);
        out.println("}");
        out.println("");
        out.println("////////////////////////////////////////////////////////////////////////////////");
        out.println("unsigned char "+getClassName()+"::getDataStructureType() const {");
        out.println("    return "+getClassName()+"::ID_" + getClassName().toUpperCase() + ";");
        out.println("}");
        out.println("");
        out.println("////////////////////////////////////////////////////////////////////////////////");
        out.println("std::string "+getClassName()+"::toString() const {");
        out.println("");
        out.println("    ostringstream stream;" );
        out.println("");
        out.println("    stream << \"Begin Class = "+getClassName()+"\" << std::endl;" );
        out.println("    stream << \" Value of "+getClassName()+"::ID_" + getClassName().toUpperCase() + " = "+getOpenWireOpCode()+"\" << std::endl;");
        generateToStringBody(out);
        if( getBaseClassName() != null ) {
            out.println("    stream << "+ getBaseClassName() +"::toString();");
        }
        out.println("    stream << \"End Class = "+getClassName()+"\" << std::endl;" );
        out.println("");
        out.println("    return stream.str();");
        out.println("}");
        out.println("");
        out.println("////////////////////////////////////////////////////////////////////////////////");
        out.println("bool "+getClassName()+"::equals( const DataStructure* value ) const {");
        out.println("");
        out.println("    if( this == value ) {");
        out.println("        return true;");
        out.println("    }");
        out.println("");
        out.println("    const "+getClassName()+"* valuePtr = dynamic_cast<const "+getClassName()+"*>( value );");
        out.println("");
        out.println("    if( valuePtr == NULL || value == NULL ) {");
        out.println("        return false;");
        out.println("    }");
        out.println("");
        generateEqualsBody(out);
        if( getBaseClassName() != null ) {
            out.println("    if( !"+ getBaseClassName() +"::equals( value ) ) {");
            out.println("        return false;");
            out.println("    }");
        }
        out.println("    return true;" );
        out.println("}");
        out.println("");
        generatePropertyAccessors(out);
        if( isComparable() ) {
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println("int " + getClassName() + "::compareTo( const "+getClassName()+"& value ) const {");
            out.println("");
            out.println("    if( this == &value ) {");
            out.println("        return 0;");
            out.println("    }");
            out.println("");
            generateCompareToBody(out);
            out.println("    return 0;");
            out.println("}");
            out.println("");
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println("bool " + getClassName() + "::equals( const "+getClassName()+"& value ) const {");
            out.println("    return this->equals( &value );");
            out.println("}");
            out.println("");
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println("bool " + getClassName() + "::operator==( const "+getClassName()+"& value ) const {");
            out.println("    return this->compareTo( value ) == 0;");
            out.println("}");
            out.println("");
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println("bool " + getClassName() + "::operator<( const "+getClassName()+"& value ) const {");
            out.println("    return this->compareTo( value ) < 0;");
            out.println("}");
            out.println("");
        }

        if( isAssignable() ) {
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println(""+getClassName()+"& "+getClassName()+"::operator= ( const "+getClassName()+"& other ) {");
            out.println("    this->copyDataStructure( &other );");
            out.println("    return *this;");
            out.println("}");
            out.println("");
        }

        if( getBaseClassName().equals( "BaseCommand" ) ) {
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println("decaf::lang::Pointer<commands::Command> "+getClassName()+"::visit( activemq::state::CommandVisitor* visitor ) ");
            out.println("    throw( activemq::exceptions::ActiveMQException ) {");
            out.println("");
            out.println("    return visitor->process"+getClassName()+"( this );");
            out.println("}");
        }

        generateAdditionalMethods(out);
    }

    protected void populateIncludeFilesSet() {
        Set<String> includes = getIncludeFiles();
        includes.add("<activemq/commands/"+getClassName()+".h>");
        includes.add("<activemq/state/CommandVisitor.h>");
        includes.add("<activemq/exceptions/ActiveMQException.h>");
        includes.add("<decaf/lang/exceptions/NullPointerException.h>");
        if( isComparable() ) {
            includes.add("<apr_strings.h>");
        }
    }

    protected void generateDefaultConstructorBody( PrintWriter out ) {
        for( JProperty property : getProperties() ) {
            String type = toCppType(property.getType());
            String value = toCppDefaultValue(property.getType());
            String propertyName = property.getSimpleName();
            String parameterName = decapitalize(propertyName);

            if( property.getType().isPrimitiveType() ||
                type.startsWith("std::string") ) {

                out.println("    this->"+parameterName+" = "+value+";");
            }
        }
    }

    protected void generateDestructorBody( PrintWriter out ) {
    }

    protected void generateAdditionalConstructors( PrintWriter out ) {
    }

    protected void generateCloneDataStructureBody( PrintWriter out ) {
        String newInstance = decapitalize( getClassName() );

        out.println("    std::auto_ptr<"+getClassName()+"> "+newInstance+"( new "+getClassName()+"() );");
        out.println("");
        out.println("    // Copy the data from the base class or classes");
        out.println("    "+newInstance+"->copyDataStructure( this );");
        out.println("");
        out.println("    return "+newInstance+".release();");
    }

    protected void generateCopyDataStructureBody( PrintWriter out ) {
        for( JProperty property : getProperties() ) {
            String getter = property.getGetter().getSimpleName();
            String setter = property.getSetter().getSimpleName();
            out.println("    this->"+setter+"( srcPtr->"+getter+"() );");
        }
    }

    protected void generateToStringBody( PrintWriter out ) {
        for( JProperty property : getProperties() ) {
            String type = toCppType(property.getType());
            String propertyName = property.getSimpleName();
            String parameterName = decapitalize(propertyName);
            String getter = property.getGetter().getSimpleName();

            if( property.getType().getSimpleName().equals("ByteSequence") ) {
                out.println("    for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
                out.println("        stream << \" Value of "+propertyName+"[\" << i" + parameterName+" << \"] = \" << this->"+getter+"()[i"+parameterName+"] << std::endl;" );
                out.println("    }" );
            } else if( type.equals("unsigned char") ){
                out.println("    stream << \" Value of "+propertyName+" = \" << (int)this->"+getter+"() << std::endl;");
            } else if( property.getType().isPrimitiveType() ||
                       type.equals("std::string") ){

                out.println("    stream << \" Value of "+propertyName+" = \" << this->"+getter+"() << std::endl;");
            } else if( property.getType().isArrayType() &&
                       !property.getType().getArrayComponentType().isPrimitiveType() ) {

                out.println("    for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
                out.println("        stream << \" Value of "+propertyName+"[\" << i" + parameterName+" << \"] is Below:\" << std::endl;" );
                out.println("        if( this->"+getter+"()[i"+parameterName+"] != NULL ) {");
                out.println("            stream << this->"+getter+"()[i"+parameterName+"]->toString() << std::endl;");
                out.println("        } else {");
                out.println("            stream << \"   Object is NULL\" << std::endl;");
                out.println("        }");
                out.println("    }");
            } else if( property.getType().isArrayType() &&
                       property.getType().getArrayComponentType().isPrimitiveType() ) {

                out.println("    for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
                out.println("        stream << \" Value of "+propertyName+"[\" << i"+parameterName+" << \"] = \" << this->"+getter+"()[i"+parameterName+"] << std::endl;");
                out.println("    }");
            } else {
                out.println("    stream << \" Value of "+propertyName+" is Below:\" << std::endl;" );
                out.println("    if( this->"+getter+"() != NULL ) {");
                out.println("        stream << this->"+getter+"()->toString() << std::endl;");
                out.println("    } else {");
                out.println("        stream << \"   Object is NULL\" << std::endl;");
                out.println("    }");
            }
        }
    }

    protected void generateEqualsBody( PrintWriter out ) {
        for( JProperty property : getProperties() ) {
            String type = toCppType(property.getType());
            String propertyName = property.getSimpleName();
            String parameterName = decapitalize(propertyName);
            String getter = property.getGetter().getSimpleName();

            if( property.getType().getSimpleName().equals("ByteSequence") ) {
                out.println("    for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
                out.println("        if( this->"+getter+"()[i" + parameterName+"] != valuePtr->"+getter+"()[i"+parameterName+"] ) {" );
                out.println("            return false;" );
                out.println("        }" );
                out.println("    }" );
            } else if( property.getType().isPrimitiveType() || type.equals("std::string") ){
                out.println("    if( this->"+getter+"() != valuePtr->"+getter+"() ) {");
                out.println("        return false;" );
                out.println("    }" );
            } else if( property.getType().isArrayType() &&
                       !property.getType().getArrayComponentType().isPrimitiveType() ) {

                out.println("    for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
                out.println("        if( this->"+getter+"()[i"+parameterName+"] != NULL ) {" );
                out.println("            if( !this->"+getter+"()[i"+parameterName+"]->equals( valuePtr->"+getter+"()[i"+parameterName+"].get() ) ) {" );
                out.println("                return false;");
                out.println("            }");
                out.println("        } else if( valuePtr->"+getter+"()[i"+parameterName+"] != NULL ) {");
                out.println("            return false;");
                out.println("        }");
                out.println("    }");
            } else if( property.getType().isArrayType() &&
                       property.getType().getArrayComponentType().isPrimitiveType() ) {

                out.println("    for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
                out.println("        if( this->"+getter+"()[i"+parameterName+"] != valuePtr->"+getter+"()[i"+parameterName+"] ) {");
                out.println("            return false;");
                out.println("        }");
                out.println("    }");
            } else {
                out.println("    if( this->"+getter+"() != NULL ) {");
                out.println("        if( !this->"+getter+"()->equals( valuePtr->"+getter+"().get() ) ) {" );
                out.println("            return false;");
                out.println("        }");
                out.println("    } else if( valuePtr->"+getter+"() != NULL ) {");
                out.println("        return false;");
                out.println("    }");
            }
        }
    }

    protected void generatePropertyAccessors( PrintWriter out ) {
        for( JProperty property : getProperties() ) {

            String type = toCppType(property.getType());
            String propertyName = property.getSimpleName();
            String parameterName = decapitalize(propertyName);
            String getter = property.getGetter().getSimpleName();
            String setter = property.getSetter().getSimpleName();
            String constNess = "";

            if( !property.getType().isPrimitiveType() &&
                !property.getType().getSimpleName().equals("ByteSequence") &&
                !property.getType().getSimpleName().equals("String") &&
                !type.startsWith("std::vector") ) {

                type = "decaf::lang::Pointer<" + type + ">&";
                constNess = "const ";
            } else if( property.getType().getSimpleName().equals("String") ||
                       type.startsWith( "std::vector") ) {
                type = type + "&";
                constNess = "const ";
            }

            if( property.getType().isPrimitiveType() ) {
                out.println("////////////////////////////////////////////////////////////////////////////////");
                out.println(type+" "+getClassName()+"::"+getter+"() const {");
                out.println("    return "+parameterName+";");
                out.println("}");
                out.println("");
            } else {
                out.println("////////////////////////////////////////////////////////////////////////////////");
                out.println("const "+type+" "+getClassName()+"::"+getter+"() const {");
                out.println("    return "+parameterName+";");
                out.println("}");
                out.println("");
                out.println("////////////////////////////////////////////////////////////////////////////////");
                out.println(""+type+" "+getClassName()+"::"+getter+"() {");
                out.println("    return "+parameterName+";");
                out.println("}");
                out.println("");
            }
            out.println("////////////////////////////////////////////////////////////////////////////////");
            out.println("void " + getClassName() + "::" + setter+"( " + constNess + type+ " " + parameterName +" ) {");
            out.println("    this->"+parameterName+" = "+parameterName+";");
            out.println("}");
            out.println("");
        }
    }

    protected void generateCompareToBody( PrintWriter out ) {
        for( JProperty property : getProperties() ) {

            String type = toCppType(property.getType());
            String propertyName = property.getSimpleName();
            String parameterName = decapitalize(propertyName);

            if( !property.getType().isPrimitiveType() &&
                !property.getType().getSimpleName().equals("ByteSequence") &&
                !property.getType().getSimpleName().equals("String") &&
                !type.startsWith("std::vector") ) {

                out.println("    int "+parameterName+"Comp = this->"+parameterName+"->compareTo( *( value."+parameterName+" ) );");
                out.println("    if( "+parameterName+"Comp != 0 ) {");
                out.println("        return "+parameterName+"Comp;");
                out.println("    }");
                out.println("");
            } else if( property.getType().getSimpleName().equals("String") ) {
                out.println("    int "+parameterName+"Comp = apr_strnatcasecmp( this->"+parameterName+".c_str(), value."+parameterName+".c_str() );");
                out.println("    if( "+parameterName+"Comp != 0 ) {");
                out.println("        return "+parameterName+"Comp;");
                out.println("    }");
                out.println("");
            } else {
                out.println("    if( this->"+parameterName+" > value."+parameterName+" ) {");
                out.println("        return 1;");
                out.println("    } else if( this->"+parameterName+" < value."+parameterName+" ) {");
                out.println("        return -1;");
                out.println("    }");
                out.println("");
            }
        }
    }

    protected void generateAdditionalMethods( PrintWriter out ) {}

}
