package glaze.examples.twitter.api.text;

import glaze.examples.twitter.api.stream.Entities.Hashtag;
import glaze.examples.twitter.api.stream.Entities.Mention;
import glaze.examples.twitter.api.stream.Entities.Url;
import lombok.Data;


@Data
public class Entity implements Comparable<Entity>
{
   public enum Type {
      URL, HASHTAG, MENTION, CASHTAG
   }

   protected int start;
   protected int end;
   protected final String value;
   // listSlug is used to store the list portion of @mention/list.
   protected final String listSlug;
   protected final Type type;

   protected String displayURL = null;
   protected String expandedURL = null;

   public Entity(Hashtag h)
   {
      fromIndices(h.getIndices());
      this.value = h.getText();
      this.type = Type.HASHTAG;
      this.listSlug = null;
   }

   public Entity(int start, int end, String value, String listSlug, Type type)
   {
      this.start = start;
      this.end = end;
      this.value = value;
      this.listSlug = listSlug;
      this.type = type;
   }

   public Entity(int start, int end, String value, Type type)
   {
      this(start, end, value, null, type);
   }

   public Entity(Mention m)
   {
      fromIndices(m.getIndices());
      this.value = m.getScreenName();
      this.type = Type.MENTION;
      this.listSlug = null;
   }

   public Entity(Url u)
   {
      fromIndices(u.getIndices());
      this.value = u.getUrl();
      this.displayURL = u.getDisplayUrl();
      this.expandedURL = u.getExpandedUrl();
      this.type = Type.URL;
      this.listSlug = null;
   }

   @Override
   public int compareTo(Entity entity)
   {
      return start - entity.start;
   }

   protected void fromIndices(Integer[] idx)
   {
      this.start = idx[0];
      this.end = idx[1];
   }

}
