(function () {
  var DEBUG = false;
  var log = (message) => {
    if (DEBUG) {
      console.log(JSON.stringify(message));
    }
  };

  var storedPatterns;
  var CIRCLE_RADIUS = 25;
  var CIRCLE_RADIUS_2 = Math.pow(CIRCLE_RADIUS, 2);
  var positions = [];
  var getPattern = (positions) => {
    var circles = [
      { x: 25, y: 25, i: 0 },
      { x: 87, y: 25, i: 1 },
      { x: 150, y: 25, i: 2 },
      { x: 25, y: 87, i: 3 },
      { x: 87, y: 87, i: 4 },
      { x: 150, y: 87, i: 5 },
      { x: 25, y: 150, i: 6 },
      { x: 87, y: 150, i: 7 },
      { x: 150, y: 150, i: 8 },
    ];
    return positions.reduce((pattern, p, i, arr) => {
      var idx = circles.findIndex((c) => {
        var dx = p.x > c.x ? p.x - c.x : c.x - p.x;
        if (dx > CIRCLE_RADIUS) {
          return false;
        }
        var dy = p.y > c.y ? p.y - c.y : c.y - p.y;
        if (dy > CIRCLE_RADIUS) {
          return false;
        }
        if (dx + dy <= CIRCLE_RADIUS) {
          return true;
        }
        return dx * dx + dy * dy <= CIRCLE_RADIUS_2;
      });
      if (idx >= 0) {
        pattern += circles[idx].i;
        circles.splice(idx, 1);
      }
      if (circles.length === 0) {
        arr.splice(1);
      }
      return pattern;
    }, "");
  };
  var dragHandler = (position) => {
    positions.push(position);
    if (position.b === 0 || positions.length >= 200) {
      var pattern = getPattern(positions);
      log(pattern);

      if (pattern) {
        if (storedPatterns[pattern]) {
          var app = storedPatterns[pattern].app;
          if (!!app && !!app.src) {
            if (storedPatterns.settings) {
              if (storedPatterns.settings.lockDisabled) {
                Bangle.setLCDPower(true);
              }
            }

            Bangle.removeListener("drag", dragHandler);
            load(app.src);
          }
        }
      }

      positions = [];
    }
  };

  var sui = Bangle.setUI;
  Bangle.setUI = function (mode, cb) {
    sui(mode, cb);
    if (typeof mode === "object") mode = (mode.clock ? "clock" : "") + mode.mode;
    if (!mode || !mode.startsWith("clock")) {
      storedPatterns = {};
      Bangle.removeListener("drag", dragHandler);
      return;
    }

    var storage = require("Storage");
    storedPatterns = storage.readJSON("ptlaunch.patterns.json", 1) || {};
    if (Object.keys(storedPatterns).length > 0) {
      Bangle.on("drag", dragHandler);
      if (storedPatterns.settings) {
        if (storedPatterns.settings.lockDisabled) {
          Bangle.setOptions({ lockTimeout: 1000 * 60 * 60 * 24 * 365 });
        }
      }
    }
  };
})();
