package net.alcuria.umbracraft.definitions.anim;

import net.alcuria.umbracraft.annotations.Tooltip;
import net.alcuria.umbracraft.definitions.Definition;

import com.badlogic.gdx.utils.Array;

/** Defines an entire animation.
 * @author Andrew Keturi */
public class AnimationDefinition extends Definition implements Comparable<AnimationDefinition> {

	@Tooltip("Filename, inside to the internal /sprites/animations/\n folder, to the asset.")
	public String filename;
	@Tooltip("The frames for the animation")
	public Array<AnimationFrameDefinition> frames;
	@Tooltip("The height of a single frame")
	public int height;
	@Tooltip("Whether or not to hold on last frame")
	public boolean keepLast;
	@Tooltip("Whether or not the animation loops")
	public boolean loop;
	@Tooltip("A friendly name")
	public String name;
	@Tooltip("The x origin of a frame")
	public int originX;
	@Tooltip("The x origin of a frame")
	public int originY;
	@Tooltip("A tag for the animation to help with sorting")
	public String tag = "";
	@Tooltip("The width of a frame")
	public int width;

	/** Uused for serialization */
	public AnimationDefinition() {
	}

	/** Creates an {@link AnimationDefinition} from an existing animation, by
	 * making a copy
	 * @param nextId
	 * @param definition */
	public AnimationDefinition(AnimationDefinition definition, int id) {
		filename = definition.filename;
		frames = new Array<AnimationFrameDefinition>();
		for (int i = 0; i < definition.frames.size; i++) {
			frames.add(definition.frames.get(i).copy());
		}
		height = definition.height;
		keepLast = definition.keepLast;
		loop = definition.loop;
		name = definition.name + " Copy " + id;
		width = definition.width;
		originX = definition.originX;
		originY = definition.originY;
		tag = definition.tag;
	}

	public AnimationDefinition(int id) {
		name = "Animation " + id;
		tag = "!New";
	}

	@Override
	public int compareTo(AnimationDefinition other) {
		if (tag.equals(other.tag)) {
			return name.compareTo(other.name);
		}
		return tag.compareTo(other.tag);
	}

	@Override
	public String getName() {
		return name;
	}
}

package net.alcuria.umbracraft.definitions.anim;

import net.alcuria.umbracraft.annotations.Order;
import net.alcuria.umbracraft.annotations.Tooltip;
import net.alcuria.umbracraft.definitions.Definition;

import com.badlogic.gdx.utils.Array;

/** Defines an entire animation.
 * @author Andrew Keturi */
public class AnimationDefinition extends Definition implements Comparable<AnimationDefinition> {

	@Tooltip("Filename, inside to the internal /sprites/animations/\n folder, to the asset.")
	@Order(3)
	public String filename;
	@Tooltip("The frames for the animation")
	public Array<AnimationFrameDefinition> frames;
	@Tooltip("The height of a single frame")
	@Order(5)
	public int height;
	@Tooltip("Whether or not to hold on last frame")
	public boolean keepLast;
	@Tooltip("Whether or not the animation loops")
	public boolean loop;
	@Tooltip("A friendly name")
	@Order(1)
	public String name;
	@Tooltip("The x origin of a frame")
	@Order(6)
	public int originX;
	@Tooltip("The x origin of a frame")
	@Order(7)
	public int originY;
	@Tooltip("A tag for the animation to help with sorting")
	@Order(2)
	public String tag = "";
	@Tooltip("The width of a frame")
	@Order(4)
	public int width;

	/** Uused for serialization */
	public AnimationDefinition() {
	}

	/** Creates an {@link AnimationDefinition} from an existing animation, by
	 * making a copy
	 * @param nextId
	 * @param definition */
	public AnimationDefinition(AnimationDefinition definition, int id) {
		filename = definition.filename;
		frames = new Array<AnimationFrameDefinition>();
		for (int i = 0; i < definition.frames.size; i++) {
			frames.add(definition.frames.get(i).copy());
		}
		height = definition.height;
		keepLast = definition.keepLast;
		loop = definition.loop;
		name = definition.name + " Copy " + id;
		width = definition.width;
		originX = definition.originX;
		originY = definition.originY;
		tag = definition.tag;
	}

	public AnimationDefinition(int id) {
		name = "Animation " + id;
		tag = "!New";
	}

	@Override
	public int compareTo(AnimationDefinition other) {
		if (tag.equals(other.tag)) {
			return name.compareTo(other.name);
		}
		return tag.compareTo(other.tag);
	}

	@Override
	public String getName() {
		return name;
	}
}

Order AnimationDefinitions