//////////////////////////////////////////////////////////////////////////////
//	Copyright 2011 Alex Leffelman
//	
//	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 com.leff.midi.event.meta;

import java.io.IOException;
import java.io.OutputStream;

import com.leff.midi.event.MidiEvent;
import com.leff.midi.util.VariableLengthInt;

public class KeySignature extends MetaEvent
{
    public static final int SCALE_MAJOR = 0;
    public static final int SCALE_MINOR = 1;

    private int mKey;
    private int mScale;

    public KeySignature(long tick, long delta, int key, int scale)
    {
        super(tick, delta, MetaEvent.KEY_SIGNATURE, new VariableLengthInt(2));

        this.setKey(key);
        mScale = scale;
    }

    public void setKey(int key)
    {
        mKey = (byte) key;

        if(mKey < -7)
            mKey = -7;
        else if(mKey > 7)
            mKey = 7;
    }

    public int getKey()
    {
        return mKey;
    }

    public void setScale(int scale)
    {
        mScale = scale;
    }

    public int getScale()
    {
        return mScale;
    }

    @Override
    protected int getEventSize()
    {
        return 5;
    }

    @Override
    public void writeToFile(OutputStream out) throws IOException
    {
        super.writeToFile(out);

        out.write(2);
        out.write(mKey);
        out.write(mScale);
    }

    public static MetaEvent parseKeySignature(long tick, long delta, MetaEventData info)
    {
        if(info.length.getValue() != 2)
        {
            return new GenericMetaEvent(tick, delta, info);
        }

        int key = info.data[0];
        int scale = info.data[1];

        return new KeySignature(tick, delta, key, scale);
    }

    @Override
    public int compareTo(MidiEvent other)
    {
        if(mTick != other.getTick())
        {
            return mTick < other.getTick() ? -1 : 1;
        }
        if(mDelta.getValue() != other.getDelta())
        {
            return mDelta.getValue() < other.getDelta() ? 1 : -1;
        }

        if(!(other instanceof KeySignature))
        {
            return 1;
        }

        KeySignature o = (KeySignature) other;
        if(mKey != o.mKey)
        {
            return mKey < o.mKey ? -1 : 1;
        }

        if(mScale != o.mScale)
        {
            return mKey < o.mScale ? -1 : 1;
        }

        return 0;
    }
}
