/**
 * 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;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.List;

import org.codehaus.jam.JClass;
import org.codehaus.jam.JProperty;

/**
 * 
 */
public class CSharpClassesGenerator extends MultiSourceGenerator {

    protected String targetDir = "./src/main/csharp";

    public Object run() {
        filePostFix = ".cs";
        if (destDir == null) {
            destDir = new File(targetDir + "/ActiveMQ/Commands");
        }
        return super.run();
    }

    public String makeHashCodeBody() throws Exception {
        if (simpleName.endsWith("Id")) {
            StringWriter buffer = new StringWriter();
            PrintWriter out = new PrintWriter(buffer);
            out.println("            int answer = 0;");
            Iterator iter = getProperties().iterator();
            while (iter.hasNext()) {
                JProperty property = (JProperty)iter.next();
                out.println("            answer = (answer * 37) + HashCode(" + property.getSimpleName() + ");");
            }
            out.println("            return answer;");
            return buffer.toString();
        }
        return null;
    }

    public String makeEqualsBody() throws Exception {
        if (simpleName.endsWith("Id")) {
            StringWriter buffer = new StringWriter();
            PrintWriter out = new PrintWriter(buffer);

            Iterator iter = getProperties().iterator();
            while (iter.hasNext()) {
                JProperty property = (JProperty)iter.next();
                String name = property.getSimpleName();
                out.println("            if (! Equals(this." + name + ", that." + name + ")) return false;");
            }
            out.println("            return true;");
            return buffer.toString();
        }
        return null;
    }

    public String makeToStringBody() throws Exception {
        StringWriter buffer = new StringWriter();
        PrintWriter out = new PrintWriter(buffer);
        out.println("            return GetType().Name + \"[\"");
        Iterator iter = getProperties().iterator();
        while (iter.hasNext()) {
            JProperty property = (JProperty)iter.next();
            String name = property.getSimpleName();
            out.println("                + \" " + name + "=\" + " + name);
        }
        out.println("                + \" ]\";");
        return buffer.toString();
    }

    private void generateLicence(PrintWriter out) {
        out.println("/*");
        out.println(" * Licensed to the Apache Software Foundation (ASF) under one or more");
        out.println(" * contributor license agreements.  See the NOTICE file distributed with");
        out.println(" * this work for additional information regarding copyright ownership.");
        out.println(" * The ASF licenses this file to You under the Apache License, Version 2.0");
        out.println(" * (the \"License\"); you may not use this file except in compliance with");
        out.println(" * the License.  You may obtain a copy of the License at");
        out.println(" *");
        out.println(" * http://www.apache.org/licenses/LICENSE-2.0");
        out.println(" *");
        out.println(" * Unless required by applicable law or agreed to in writing, software");
        out.println(" * distributed under the License is distributed on an \"AS IS\" BASIS,");
        out.println(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
        out.println(" * See the License for the specific language governing permissions and");
        out.println(" * limitations under the License.");
        out.println(" */");
    }

    protected void generateFile(PrintWriter out) throws Exception {
        generateLicence(out);

        out.println("//");
        out.println("//  NOTE!: This file is autogenerated - do not modify!");
        out.println("//         if you need to make a change, please see the Groovy scripts in the");
        out.println("//         activemq-core module");
        out.println("//");
        out.println("");
        out.println("using System;");
        out.println("using System.Collections;");
        out.println("");
        out.println("using ActiveMQ.OpenWire;");
        out.println("using ActiveMQ.Commands;");
        out.println("");
        out.println("namespace ActiveMQ.Commands");
        out.println("{");
        out.println("    /// <summary>");
        out.println("    ///  The ActiveMQ " + jclass.getSimpleName() + " Command");
        out.println("    /// </summary>");
        out.print("    public class " + jclass.getSimpleName() + " : " + baseClass);

        for (int i = 0; i < jclass.getInterfaces().length; i++) {
            JClass intf = jclass.getInterfaces()[i];
            out.print(", " + intf.getSimpleName());
        }

        out.println("");
        out.println("    {");
        out.println("        public const byte ID_" + jclass.getSimpleName() + " = " + getOpenWireOpCode(jclass) + ";");
        out.println("                ");

        List properties = getProperties();
        String type;
        Object name;
        for (Iterator iter = properties.iterator(); iter.hasNext();) {
            JProperty property = (JProperty)iter.next();
            type = toCSharpType(property.getType());
            name = decapitalize(property.getSimpleName());
            out.println("        " + type + " " + name + ";");
        }

        String text = makeHashCodeBody();
        if (text != null) {
            out.println("");
            out.println("        public override int GetHashCode() {");
            out.println("" + text + "");
            out.println("        }");
        }

        text = makeEqualsBody();
        if (text != null) {
            out.println("");
            out.println("        public override bool Equals(object that) {");
            out.println("            if (that is " + className + ") {");
            out.println("                return Equals((" + className + ") that);");
            out.println("            }");
            out.println("            return false;");
            out.println("        }");
            out.println("");
            out.println("        public virtual bool Equals(" + className + " that) {");
            out.println("" + text + "");
            out.println("        }");
        }

        text = makeToStringBody();
        if (text != null) {
            out.println("");
            out.println("        public override string ToString() {");
            out.println("" + text + "");
            out.println("        }");
        }

        out.println("");
        out.println("        public override byte GetDataStructureType() {");
        out.println("            return ID_" + jclass.getSimpleName() + ";");
        out.println("        }");
        out.println("");
        out.println("");
        out.println("        // Properties");

        for (Iterator iter = properties.iterator(); iter.hasNext();) {
            JProperty property = (JProperty)iter.next();
            type = toCSharpType(property.getType());
            name = decapitalize(property.getSimpleName());
            String propertyName = property.getSimpleName();

            out.println("");
            out.println("        public " + type + " " + propertyName + "");
            out.println("        {");
            out.println("            get { return " + name + "; }");
            out.println("            set { this." + name + " = value; }            ");
            out.println("        }");
        }

        out.println("");
        out.println("    }");
        out.println("}");
    }

    public String getTargetDir() {
        return targetDir;
    }

    public void setTargetDir(String targetDir) {
        this.targetDir = targetDir;
    }
}
