package funkin.play.event;

import funkin.data.song.SongData.SongEventData;
import funkin.data.event.SongEventSchema;

/**
 * This class represents a handler for a type of song event.
 * It is used by the ScriptedSongEvent class to handle user-defined events.
 */
class SongEvent
{
  /**
   * These variables are used in two different events (and may be in more), and in order not to create unnecessary variables, we store them here
   */
  public static final DEFAULT_EASE:String = 'linear';

  public static final DEFAULT_EASE_DIR:String = 'in';
  public static final EASE_TYPE_DIR_REGEX:EReg = ~/(In|Out|InOut)$/i;

  /**
   * The internal song event ID that this handler is responsible for.
   */
  public var id:String;

  public function new(id:String)
  {
    this.id = id;
  }

  /**
   * Handles a song event that matches this handler's ID.
   * @param data The data associated with the event.
   */
  public function handleEvent(data:SongEventData):Void
  {
    throw 'SongEvent.handleEvent() must be overridden!';
  }

  /**
   * Retrieves the chart editor schema for this song event type.
   * @return The schema, or null if this event type does not have a schema.
   */
  public function getEventSchema():SongEventSchema
  {
    return null;
  }

  /**
   * Retrieves the asset path to the icon this event type should use in the chart editor.
   * To customize this, override getIconPath().
   */
  public function getIconPath():String
  {
    return 'ui/chart-editor/events/default';
  }

  /**
   * Retrieves the human readable title of this song event type.
   * Used for the chart editor.
   * @return The title.
   */
  public function getTitle():String
  {
    return this.id.toTitleCase();
  }

  public function toString():String
  {
    return 'SongEvent(${this.id})';
  }
}
