/*
 * Copyright (c) 2002-2009 "Neo Technology,"
 *     Network Engine for Objects in Lund AB [http://neotechnology.com]
 *
 * This file is part of Neo4j.
 * 
 * Neo4j is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package org.neo4j.kernel.impl.nioneo.store;

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

public class PropertyRecord extends AbstractRecord
{
    private PropertyType type;
    private int keyIndexId = Record.NO_NEXT_BLOCK.intValue();
    private long propBlock = Record.NO_NEXT_BLOCK.intValue();
    private int prevProp = Record.NO_PREVIOUS_PROPERTY.intValue();
    private int nextProp = Record.NO_NEXT_PROPERTY.intValue();
    private List<DynamicRecord> valueRecords = new ArrayList<DynamicRecord>();
    private boolean isLight = false;
    private int nodeRelId = -1;
    private boolean nodeIdSet = false;
    private boolean isChanged = false;

    public PropertyRecord( int id )
    {
        super( id );
    }

    public void setType( PropertyType type )
    {
        this.type = type;
    }

    public void setNodeId( int nodeId )
    {
        nodeIdSet = true;
        nodeRelId = nodeId;
    }

    public void setRelId( int relId )
    {
        nodeIdSet = false;
        nodeRelId = relId;
    }

    public int getNodeId()
    {
        if ( nodeIdSet )
        {
            return nodeRelId;
        }
        return -1;
    }

    public int getRelId()
    {
        if ( !nodeIdSet )
        {
            return nodeRelId;
        }
        return -1;
    }

    void setIsLight( boolean status )
    {
        isLight = status;
    }

    public boolean isLight()
    {
        return isLight;
    }

    public Collection<DynamicRecord> getValueRecords()
    {
        assert !isLight;
        return valueRecords;
    }

    public void addValueRecord( DynamicRecord record )
    {
        assert !isLight;
        valueRecords.add( record );
    }

    public PropertyType getType()
    {
        return type;
    }

    public int getKeyIndexId()
    {
        return keyIndexId;
    }

    public void setKeyIndexId( int keyId )
    {
        this.keyIndexId = keyId;
    }

    public long getPropBlock()
    {
        return propBlock;
    }

    public void setPropBlock( long propBlock )
    {
        this.propBlock = propBlock;
    }

    public int getPrevProp()
    {
        return prevProp;
    }

    public void setPrevProp( int prevProp )
    {
        this.prevProp = prevProp;
    }

    public int getNextProp()
    {
        return nextProp;
    }

    public void setNextProp( int nextProp )
    {
        this.nextProp = nextProp;
    }

    @Override
    public String toString()
    {
        StringBuffer buf = new StringBuffer();
        buf.append( "PropertyRecord[" ).append( getId() ).append( "," ).append(
            inUse() ).append( "," ).append( type ).append( "," ).append(
            keyIndexId ).append( "," ).append( propBlock ).append( "," )
            .append( prevProp ).append( "," ).append( nextProp );
        buf.append( ", Value[" );
        for ( DynamicRecord record : valueRecords )
        {
            buf.append( record );
        }
        buf.append( "]]" );
        return buf.toString();
    }
    
    public boolean isChanged()
    {
        return isChanged;
    }
    
    public void setChanged()
    {
        isChanged = true;
    }
}