/* ====================================================================
   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.poi.hwpf.dev;

import org.apache.poi.util.Internal;
import org.apache.poi.util.StringUtil;

/**
 * Helper functions for the record transformations. Used during model classes
 * autogeneration.
 * 
 * @author Glen Stampoultzis (glens at apache.org)
 * @author Andrew C. Oliver (acoliver at apache dot org)
 */
@Internal
public class RecordUtil
{

    public static String getBitFieldFunction( String name, String bitMask,
            String parentType, String withType )
    {
        String type = getBitFieldType( name, bitMask, parentType );

        String retVal = "";
        if ( withType.equals( "true" ) )
        {
            retVal = type + " ";
        }
        if ( type.equals( "boolean" ) )
        {
            retVal += "is" + getFieldName1stCap( name, 0 );
        }
        else
        {
            retVal += "get" + getFieldName1stCap( name, 0 );
        }
        return retVal;

    }

    public static String getBitFieldGet( String name, String bitMask,
            String parentType, String parentField )
    {
        String type = getBitFieldType( name, bitMask, parentType );

        String retVal = null;

        if ( type.equals( "boolean" ) )
            retVal = name + ".isSet(" + parentField + ");";
        else
            retVal = "( " + type + " )" + name + ".getValue(" + parentField
                    + ");";

        return retVal;
    }

    public static String getBitFieldSet( String name, String bitMask,
            String parentType, String parentField )
    {
        String type = getBitFieldType( name, bitMask, parentType );

        String retVal = null;

        if ( type.equals( "boolean" ) )
            if ( parentType.equals( "int" ) )
            {
                retVal = getFieldName( name, 0 ) + ".setBoolean(" + parentField
                        + ", value)";
            }
            else
            {
                retVal = "(" + parentType + ")" + getFieldName( name, 0 )
                        + ".setBoolean(" + parentField + ", value)";
            }
        else
        {
            if ( parentType.equals( "int" ) )
            {
                retVal = getFieldName( name, 0 ) + ".setValue(" + parentField
                        + ", value)";
            }
            else
            {
                retVal = "(" + parentType + ")" + getFieldName( name, 0 )
                        + ".setValue(" + parentField + ", value)";
            }
        }
        return retVal;
    }

    public static String getBitFieldType( String name, String bitMask,
            String parentType )
    {
        byte parentSize = 0;
        byte numBits = 0;
        int mask = (int) Long.parseLong( bitMask.substring( 2 ), 16 );

        if ( parentType.equals( "byte" ) )
            parentSize = 8;
        else if ( parentType.equals( "short" ) )
            parentSize = 16;
        else if ( parentType.equals( "int" ) )
            parentSize = 32;

        for ( int x = 0; x < parentSize; x++ )
        {
            numBits += ( mask >> x ) & 0x1;
        }

        if ( numBits == 1 )
        {
            return "boolean";
        }
        else if ( numBits < 8 )
        {
            return "byte";
        }
        else if ( numBits < 16 )
        {
            return "short";
        }
        else
        {
            return "int";
        }
    }

    public static String getConstName( String parentName, String constName,
            int padTo )
    {
        StringBuilder fieldName = new StringBuilder();
        toConstIdentifier( parentName, fieldName );
        fieldName.append( '_' );
        toConstIdentifier( constName, fieldName );
        pad( fieldName, padTo );
        return fieldName.toString();
    }

    public static String getFieldName( int position, String name, int padTo )
    {
        StringBuilder fieldName = new StringBuilder().append("field_").append(position).append('_');
        toIdentifier( name, fieldName );
        pad( fieldName, padTo );

        return fieldName.toString();
    }

    public static String getFieldName( String name, int padTo )
    {
        StringBuilder fieldName = new StringBuilder();
        toIdentifier( name, fieldName );
        pad( fieldName, padTo );

        return fieldName.toString();
    }

    public static String getFieldName1stCap( String name, int padTo )
    {
        StringBuilder fieldName = new StringBuilder();
        toIdentifier( name, fieldName );
        fieldName.setCharAt( 0, toUpperCase( fieldName.charAt(0) ) );
        pad( fieldName, padTo );

        return fieldName.toString();
    }

    public static String getType1stCap( String size, String type, int padTo )
    {
        StringBuilder result = new StringBuilder();
        result.append( type );
        result = pad( result, padTo );
        result.setCharAt( 0, toUpperCase( result.charAt( 0 ) ) );

        return result.toString();
    }

    protected static StringBuilder pad( StringBuilder fieldName, int padTo )
    {
        for ( int i = fieldName.length(); i < padTo; i++ )
            fieldName.append( ' ' );
        return fieldName;
    }

    private static void toConstIdentifier( String name, StringBuilder fieldName )
    {
        for ( int i = 0; i < name.length(); i++ )
        {
            if ( name.charAt( i ) == ' ' )
                fieldName.append( '_' );
            else
                fieldName.append( toUpperCase( name.charAt( i ) ) );
        }
    }

    private static void toIdentifier( String name, StringBuilder fieldName )
    {
        for ( int i = 0; i < name.length(); i++ )
        {
            if ( name.charAt( i ) == ' ' )
                fieldName.append( toUpperCase( name.charAt( ++i ) ) );
            else
                fieldName.append( name.charAt( i ) );
        }
    }

    private static char toUpperCase(char c) {
        return StringUtil.toUpperCase(c).charAt(0);
    }

    public RecordUtil()
    {
    }

}
