/*
 * Input Mask plugin for jquery
 * http://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) Robin Herbots
 * Licensed under the MIT license
 */
import $ from "jquery";

import Inputmask from "./inputmask";

if ($.fn.inputmask === undefined) {
  // jquery plugin
  $.fn.inputmask = function (fn, options) {
    let nptmask,
      input = this[0];
    if (options === undefined) options = {};
    if (typeof fn === "string") {
      switch (fn) {
        case "unmaskedvalue":
          return input && input.inputmask
            ? input.inputmask.unmaskedvalue()
            : $(input).val();
        case "remove":
          return this.each(function () {
            if (this.inputmask) this.inputmask.remove();
          });
        case "getemptymask":
          return input && input.inputmask ? input.inputmask.getemptymask() : "";
        case "hasMaskedValue": // check whether the returned value is masked or not; currently only works reliable when using jquery.val fn to retrieve the value
          return input && input.inputmask
            ? input.inputmask.hasMaskedValue()
            : false;
        case "isComplete":
          return input && input.inputmask ? input.inputmask.isComplete() : true;
        case "getmetadata": // return mask metadata if exists
          return input && input.inputmask
            ? input.inputmask.getmetadata()
            : undefined;
        case "setvalue":
          Inputmask.setValue(input, options);
          break;
        case "option":
          if (typeof options === "string") {
            if (input && input.inputmask !== undefined) {
              return input.inputmask.option(options);
            }
          } else {
            return this.each(function () {
              if (this.inputmask !== undefined) {
                return this.inputmask.option(options);
              }
            });
          }
          break;
        default:
          options.alias = fn;
          nptmask = new Inputmask(options);
          return this.each(function () {
            nptmask.mask(this);
          });
      }
    } else if (Array.isArray(fn)) {
      options.alias = fn;
      nptmask = new Inputmask(options);
      return this.each(function () {
        nptmask.mask(this);
      });
    } else if (typeof fn === "object") {
      nptmask = new Inputmask(fn);
      if (fn.mask === undefined && fn.alias === undefined) {
        return this.each(function () {
          if (this.inputmask !== undefined) {
            return this.inputmask.option(fn);
          } else nptmask.mask(this);
        });
      } else {
        return this.each(function () {
          nptmask.mask(this);
        });
      }
    } else if (fn === undefined) {
      // look for data-inputmask atributes
      return this.each(function () {
        nptmask = new Inputmask(options);
        nptmask.mask(this);
      });
    }
  };
}
