import { useEffect, useState } from 'react';

export default function useKonamiListener() {
  const [isActive, setIsActive] = useState(false);
  useEffect(() => {
    let listener;
    if (!listener) {
      listener = new Konami(() => setIsActive(!isActive));
    }
    return () => {
      listener = null;
    };
  }, [isActive]);

  return isActive;
}

/* eslint-disable */
/*
 * Konami-JS ~
 * :: Now with support for touch events and multiple instances for
 * :: those situations that call for multiple easter eggs!
 * Code: https://github.com/snaptortoise/konami-js
 * Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
 * Version: 1.6.2 (7/17/2018)
 * Licensed under the MIT License (http://opensource.org/licenses/MIT)
 * Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1+ and Android
 */
var Konami = function(callback) {
  var konami = {
    addEvent: function(obj, type, fn, ref_obj) {
      if (obj.addEventListener) obj.addEventListener(type, fn, false);
      else if (obj.attachEvent) {
        // IE
        obj['e' + type + fn] = fn;
        obj[type + fn] = function() {
          obj['e' + type + fn](window.event, ref_obj);
        };
        obj.attachEvent('on' + type, obj[type + fn]);
      }
    },
    removeEvent: function(obj, eventName, eventCallback) {
      if (obj.removeEventListener) {
        obj.removeEventListener(eventName, eventCallback);
      } else if (obj.attachEvent) {
        obj.detachEvent(eventName);
      }
    },
    input: '',
    pattern: '38384040373937396665',
    keydownHandler: function(e, ref_obj) {
      if (ref_obj) {
        konami = ref_obj;
      } // IE
      konami.input += e ? e.keyCode : event.keyCode;

      if (konami.input.length > konami.pattern.length) {
        konami.input = konami.input.substr(konami.input.length - konami.pattern.length);
      }
      if (konami.input === konami.pattern) {
        konami.code(konami._currentLink);
        konami.input = '';
        e.preventDefault();
        return false;
      }
    },
    load: function(link) {
      this._currentLink = link;
      this.addEvent(document, 'keydown', this.keydownHandler, this);
      this.iphone.load(link);
    },
    unload: function() {
      this.removeEvent(document, 'keydown', this.keydownHandler);
      this.iphone.unload();
    },
    code: function(link) {
      window.location = link;
    },
    iphone: {
      start_x: 0,
      start_y: 0,
      stop_x: 0,
      stop_y: 0,
      tap: false,
      capture: false,
      orig_keys: '',
      keys: ['UP', 'UP', 'DOWN', 'DOWN', 'LEFT', 'RIGHT', 'LEFT', 'RIGHT', 'TAP', 'TAP'],
      input: [],
      code: function(link) {
        konami.code(link);
      },
      touchmoveHandler: function(e) {
        if (e.touches.length === 1 && konami.iphone.capture === true) {
          var touch = e.touches[0];
          konami.iphone.stop_x = touch.pageX;
          konami.iphone.stop_y = touch.pageY;
          konami.iphone.tap = false;
          konami.iphone.capture = false;
          konami.iphone.check_direction();
        }
      },
      touchendHandler: function() {
        konami.iphone.input.push(konami.iphone.check_direction());

        if (konami.iphone.input.length > konami.iphone.keys.length) konami.iphone.input.shift();

        if (konami.iphone.input.length === konami.iphone.keys.length) {
          var match = true;
          for (var i = 0; i < konami.iphone.keys.length; i++) {
            if (konami.iphone.input[i] !== konami.iphone.keys[i]) {
              match = false;
            }
          }
          if (match) {
            konami.iphone.code(konami._currentLink);
          }
        }
      },
      touchstartHandler: function(e) {
        konami.iphone.start_x = e.changedTouches[0].pageX;
        konami.iphone.start_y = e.changedTouches[0].pageY;
        konami.iphone.tap = true;
        konami.iphone.capture = true;
      },
      load: function(link) {
        this.orig_keys = this.keys;
        konami.addEvent(document, 'touchmove', this.touchmoveHandler);
        konami.addEvent(document, 'touchend', this.touchendHandler, false);
        konami.addEvent(document, 'touchstart', this.touchstartHandler);
      },
      unload: function() {
        konami.removeEvent(document, 'touchmove', this.touchmoveHandler);
        konami.removeEvent(document, 'touchend', this.touchendHandler);
        konami.removeEvent(document, 'touchstart', this.touchstartHandler);
      },
      check_direction: function() {
        var x_magnitude = Math.abs(this.start_x - this.stop_x);
        var y_magnitude = Math.abs(this.start_y - this.stop_y);
        var x = this.start_x - this.stop_x < 0 ? 'RIGHT' : 'LEFT';
        var y = this.start_y - this.stop_y < 0 ? 'DOWN' : 'UP';
        var result = x_magnitude > y_magnitude ? x : y;
        result = this.tap === true ? 'TAP' : result;
        return result;
      },
    },
  };

  typeof callback === 'string' && konami.load(callback);
  if (typeof callback === 'function') {
    konami.code = callback;
    konami.load();
  }

  return konami;
};
/* eslint-enable */