/*
 * Created on 23-nov-2005
 *
 */
package org.herac.tuxguitar.song.models;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.herac.tuxguitar.song.factory.TGFactory;
/**
 * @author julian
 *
 */
public abstract class TGTrack {
	public static final int MAX_OFFSET = 24;
	public static final int MIN_OFFSET = -24;
	
	private int number;
	private int offset;
	private boolean solo;
	private boolean mute;
	private String name;
	private List measures;
	private List strings;
	private TGChannel channel;
	private TGColor color;
	private TGLyric lyrics;
	private TGSong song;
	
	public TGTrack(TGFactory factory) {
		this.number = 0;
		this.offset = 0;
		this.solo = false;
		this.mute = false;
		this.name = new String();
		this.measures = new ArrayList();
		this.strings = new ArrayList();
		this.channel = factory.newChannel();
		this.color = factory.newColor();
		this.lyrics = factory.newLyric();
	}
	
	public int getNumber() {
		return this.number;
	}
	
	public void setNumber(int number) {
		this.number = number;
	}
	
	public Iterator getMeasures() {
		return this.measures.iterator();
	}
	
	public void addMeasure(TGMeasure measure){
		measure.setTrack(this);
		this.measures.add(measure);
	}
	
	public void addMeasure(int index,TGMeasure measure){
		measure.setTrack(this);
		this.measures.add(index,measure);
	}
	
	public TGMeasure getMeasure(int index){
		if(index >= 0 && index < countMeasures()){
			return (TGMeasure)this.measures.get(index);
		}
		return null;
	}
	
	public void removeMeasure(int index){
		this.measures.remove(index);
	}
	
	public int countMeasures(){
		return this.measures.size();
	}
	
	public TGChannel getChannel() {
		return this.channel;
	}
	
	public void setChannel(TGChannel channel) {
		this.channel = channel;
	}
	
	public List getStrings() {
		return this.strings;
	}
	
	public void setStrings(List strings) {
		this.strings = strings;
	}
	
	public TGColor getColor() {
		return this.color;
	}
	
	public void setColor(TGColor color) {
		this.color = color;
	}
	
	public String getName() {
		return this.name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getOffset() {
		return this.offset;
	}
	
	public void setOffset(int offset) {
		this.offset = offset;
	}
	
	public boolean isSolo() {
		return this.solo;
	}
	
	public void setSolo(boolean solo) {
		this.solo = solo;
	}
	
	public boolean isMute() {
		return this.mute;
	}
	
	public void setMute(boolean mute) {
		this.mute = mute;
	}
	
	public TGLyric getLyrics() {
		return this.lyrics;
	}
	
	public void setLyrics(TGLyric lyrics) {
		this.lyrics = lyrics;
	}
	
	public TGString getString(int number){
		return (TGString)this.strings.get(number - 1);
	}
	
	public int stringCount(){
		return this.strings.size();
	}
	
	public boolean isPercussionTrack(){
		return (getChannel().isPercussionChannel());
	}
	
	public TGSong getSong() {
		return this.song;
	}
	
	public void setSong(TGSong song) {
		this.song = song;
	}
	
	public void clear(){
		this.strings.clear();
		this.measures.clear();
	}
	
	public TGTrack clone(TGFactory factory,TGSong song){
		TGTrack track = factory.newTrack();
		copy(factory, song, track);
		return track;
	}
	
	public void copy(TGFactory factory,TGSong song,TGTrack track){
		track.clear();
		track.setNumber(getNumber());
		track.setName(getName());
		track.setOffset(getOffset());
		getChannel().copy(track.getChannel());
		getColor().copy(track.getColor());
		getLyrics().copy(track.getLyrics());
		for (int i = 0; i < getStrings().size(); i++) {
			TGString string = (TGString) getStrings().get(i);
			track.getStrings().add(string.clone(factory));
		}
		for (int i = 0; i < countMeasures(); i++) {
			TGMeasure measure = getMeasure(i);
			track.addMeasure(measure.clone(factory,song.getMeasureHeader(i)));
		}
	}
	
}
