package uk.tim740.skUtilities.convert;

import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import org.bukkit.event.Event;

import javax.annotation.Nullable;

/**
 * Created by tim740 on 22/02/2016
 */
public class ExprMorse extends SimpleExpression<String> {
  private int ty;
  private Expression<String> str;
  private static final char[] engL = {' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
  private static final String[] morseL = {"_", "-----", ".----", "..---", "...--", "....-", "......", "-.....", "--...", "---..", "----.",
      ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

  @Override
  @Nullable
  protected String[] get(Event e) {
    String out = "";
    if (ty == 0) {
      for (char v : str.getSingle(e).toLowerCase().toCharArray()) {
        for (int j = 0; j < engL.length; j++) {
          if (engL[j] == v) {
            out += morseL[j] + " ";
            break;
          }
        }
      }
    } else {
      for (String w : str.getSingle(e).split("\\s\\s\\s")) {
        for (String l : w.split("\\s")) {
          for (int j = 0; j < morseL.length; j++) {
            if (l.equals(morseL[j])) {
              out += engL[j];
              break;
            }
          }
        }
      }
    }
    return new String[]{out};
  }

  @SuppressWarnings("unchecked")
  @Override
  public boolean init(Expression<?>[] e, int i, Kleenean k, SkriptParser.ParseResult p) {
    ty = p.mark;
    str = (Expression<String>) e[0];
    return true;
  }

  @Override
  public Class<? extends String> getReturnType() {
    return String.class;
  }

  @Override
  public boolean isSingle() {
    return true;
  }

  @Override
  public String toString(@Nullable Event e, boolean b) {
    return getClass().getName();
  }
}