text: "use strict";
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
      if (k2 === undefined) k2 = k;
      Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
  }) : (function(o, m, k, k2) {
      if (k2 === undefined) k2 = k;
      o[k2] = m[k];
  }));
  var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
      Object.defineProperty(o, "default", { enumerable: true, value: v });
  }) : function(o, v) {
      o["default"] = v;
  });
  var __importStar = (this && this.__importStar) || function (mod) {
      if (mod && mod.__esModule) return mod;
      var result = {};
      if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
      __setModuleDefault(result, mod);
      return result;
  };
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
      function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
      return new (P || (P = Promise))(function (resolve, reject) {
          function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
          function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
          function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
          step((generator = generator.apply(thisArg, _arguments || [])).next());
      });
  };
  var __generator = (this && this.__generator) || function (thisArg, body) {
      var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
      return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
      function verb(n) { return function (v) { return step([n, v]); }; }
      function step(op) {
          if (f) throw new TypeError("Generator is already executing.");
          while (_) try {
              if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
              if (y = 0, t) op = [op[0] & 2, t.value];
              switch (op[0]) {
                  case 0: case 1: t = op; break;
                  case 4: _.label++; return { value: op[1], done: false };
                  case 5: _.label++; y = op[1]; op = [0]; continue;
                  case 7: op = _.ops.pop(); _.trys.pop(); continue;
                  default:
                      if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                      if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                      if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                      if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                      if (t[2]) _.ops.pop();
                      _.trys.pop(); continue;
              }
              op = body.call(thisArg, _);
          } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
          if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
      }
  };
  var __importDefault = (this && this.__importDefault) || function (mod) {
      return (mod && mod.__esModule) ? mod : { "default": mod };
  };
  /*---------------------------------------------------------------------------------------------
   *  Copyright (c) Neil Enns. All rights reserved.
   *  Licensed under the MIT License. See LICENSE in the project root for license information.
   *--------------------------------------------------------------------------------------------*/
  var discover_1 = __importDefault(require("./controllers/discover"));
  var effects_1 = __importDefault(require("./controllers/effects"));
  var helpers = __importStar(require("./helpers"));
  var NodeGlobals = __importStar(require("./nodeGlobals"));
  var palettes_1 = __importDefault(require("./controllers/palettes"));
  var WledDevice_1 = __importDefault(require("./WledDevice"));
  module.exports = function (RED) {
      NodeGlobals.setRed(RED);
      RED.httpAdmin.get("/wled2/discover", discover_1.default);
      RED.httpAdmin.get("/wled2/effects/:address", effects_1.default);
      RED.httpAdmin.get("/wled2/palettes/:address", palettes_1.default);
      RED.nodes.registerType("wled2", function (props) {
          var _this = this;
          this.config = props;
          RED.nodes.createNode(this, props);
          // When this is loaded for the node palette there's no address
          // so just skip the rest and return silently.
          if (!this.config.address) {
              return;
          }
          this.wled = new WledDevice_1.default({ server: this.config.address });
          this.on("input", setState.bind(this));
          this.wled.on("connected", onConnected.bind(this));
          this.wled.on("connecting", onConnecting.bind(this));
          this.wled.on("disconnected", onDisconnected.bind(this));
          this.wled.on("error", onError.bind(this));
          // On failures the node can just do nothing. Error state
          // will get set automatically by an event fired from the WledDevice object.
          this.wled.getState().catch(function (e) {
              _this.error("Unable to get state at startup: " + e);
              return;
          });
      });
      function setState(msg) {
          var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
          return __awaiter(this, void 0, void 0, function () {
              var payload, delay, targetState, requestedState, e_1, on, state, i;
              return __generator(this, function (_z) {
                  switch (_z.label) {
                      case 0:
                          // Any setting of state stops any prior delayed attempt to set the state to solid
                          clearTimeout(this.solidTimer);
                          payload = msg.payload;
                          delay = (_b = (_a = payload === null || payload === void 0 ? void 0 : payload.delay) !== null && _a !== void 0 ? _a : Number(this.config.delay)) !== null && _b !== void 0 ? _b : 0;
                          requestedState = (_d = (_c = payload === null || payload === void 0 ? void 0 : payload.state) !== null && _c !== void 0 ? _c : this.config.state) !== null && _d !== void 0 ? _d : "on";
                          _z.label = 1;
                      case 1:
                          _z.trys.push([1, 5, , 6]);
                          if (!(requestedState.toLowerCase() === "toggle")) return [3 /*break*/, 3];
                          return [4 /*yield*/, this.wled.getCurrentOnState().catch(function (e) {
                                  throw Error("Unable to obtain current device on state to perform toggle: " + e);
                              })];
                      case 2:
                          targetState = !(_z.sent());
                          return [3 /*break*/, 4];
                      case 3:
                          targetState = requestedState.toLowerCase() === "on";
                          _z.label = 4;
                      case 4: return [3 /*break*/, 6];
                      case 5:
                          e_1 = _z.sent();
                          // This means the current on state couldn't be retrieved so just give up.
                          this.error(e_1);
                          return [2 /*return*/];
                      case 6:
                          // If the targetState couldn't be obtained for toggle then bail as failed.
                          if (targetState == null)
                              return [2 /*return*/];
                          on = delay ? true : targetState;
                          state = {
                              on: on,
                          };
                          // If a preset was set then that overrides everything else
                          if ((payload === null || payload === void 0 ? void 0 : payload.preset) || this.config.preset) {
                              state.ps = (_e = payload === null || payload === void 0 ? void 0 : payload.preset) !== null && _e !== void 0 ? _e : Number(this.config.preset);
                          }
                          else {
                              state.bri = (_f = payload === null || payload === void 0 ? void 0 : payload.brightness) !== null && _f !== void 0 ? _f : Number(this.config.brightness);
                              // Multi-segment support is provided via the incoming payload. If the
                              // seg object is specified in the payload then it's what gets used
                              // to set the entire segment object. Otherwise the individual
                              // properties are set manually.
                              if (payload === null || payload === void 0 ? void 0 : payload.seg) {
                                  state.seg = payload.seg;
                              }
                              else {
                                  // if segment range is provided add multiple segmenent objects to the array with id: 0 to segRange
                                  // this will ignore SegmentId
                                  if (payload === null || payload === void 0 ? void 0 : payload.segRange) {
                                      state.seg = [];
                                      for (i = 0; i < payload.segRange; i++) {
                                          state.seg.push({
                                              id: i,
                                              on: (_g = payload === null || payload === void 0 ? void 0 : payload.state) !== null && _g !== void 0 ? _g : true,
                                              col: [
                                                  (_h = payload === null || payload === void 0 ? void 0 : payload.color1) !== null && _h !== void 0 ? _h : helpers.hexToRgb(this.config.color1),
                                                  (_j = payload === null || payload === void 0 ? void 0 : payload.color2) !== null && _j !== void 0 ? _j : helpers.hexToRgb(this.config.color2),
                                                  (_k = payload === null || payload === void 0 ? void 0 : payload.color3) !== null && _k !== void 0 ? _k : helpers.hexToRgb(this.config.color3),
                                              ],
                                              fx: (_l = payload === null || payload === void 0 ? void 0 : payload.effect) !== null && _l !== void 0 ? _l : Number(this.config.effect),
                                              ix: (_m = payload === null || payload === void 0 ? void 0 : payload.effectIntensity) !== null && _m !== void 0 ? _m : Number(this.config.effectIntensity),
                                              pal: (_o = payload === null || payload === void 0 ? void 0 : payload.palette) !== null && _o !== void 0 ? _o : Number(this.config.palette),
                                              sx: (_p = payload === null || payload === void 0 ? void 0 : payload.effectSpeed) !== null && _p !== void 0 ? _p : Number(this.config.effectSpeed),
                                          });
                                      }
                                  }
                                  else {
                                      state.seg = [{
                                              id: (_q = payload === null || payload === void 0 ? void 0 : payload.segmentId) !== null && _q !== void 0 ? _q : Number(this.config.segmentId),
                                              on: (_r = payload === null || payload === void 0 ? void 0 : payload.state) !== null && _r !== void 0 ? _r : true,
                                              col: [
                                                  (_s = payload === null || payload === void 0 ? void 0 : payload.color1) !== null && _s !== void 0 ? _s : helpers.hexToRgb(this.config.color1),
                                                  (_t = payload === null || payload === void 0 ? void 0 : payload.color2) !== null && _t !== void 0 ? _t : helpers.hexToRgb(this.config.color2),
                                                  (_u = payload === null || payload === void 0 ? void 0 : payload.color3) !== null && _u !== void 0 ? _u : helpers.hexToRgb(this.config.color3),
                                              ],
                                              fx: (_v = payload === null || payload === void 0 ? void 0 : payload.effect) !== null && _v !== void 0 ? _v : Number(this.config.effect),
                                              ix: (_w = payload === null || payload === void 0 ? void 0 : payload.effectIntensity) !== null && _w !== void 0 ? _w : Number(this.config.effectIntensity),
                                              pal: (_x = payload === null || payload === void 0 ? void 0 : payload.palette) !== null && _x !== void 0 ? _x : Number(this.config.palette),
                                              sx: (_y = payload === null || payload === void 0 ? void 0 : payload.effectSpeed) !== null && _y !== void 0 ? _y : Number(this.config.effectSpeed),
                                          }];
                                  }
                              }
                          }
                          // debug: todo set flag in object for this?
                          if (this.config.debug === "on") {
                              this.warn(state);
                          }
                          // On failures the node can just do nothing. Error state
                          // will get set automatically by an event fired from the WledDevice object.
                          return [4 /*yield*/, this.wled.setState(state).catch(function () {
                                  return;
                              })];
                      case 7:
                          // On failures the node can just do nothing. Error state
                          // will get set automatically by an event fired from the WledDevice object.
                          _z.sent();
                          // If a delay was requested flip to solid state after the specified number of seconds.
                          if (delay) {
                              this.solidTimer = setTimeout(setSolidState.bind(this), delay * 1000, targetState);
                          }
                          // Pass the message on
                          this.send(msg);
                          return [2 /*return*/];
                  }
              });
          });
      }
      function setSolidState(on) {
          this.wled
              .setState({
              on: on,
              seg: [
                  {
                      id: Number(this.config.segmentId),
                      fx: 0,
                  },
              ],
          })
              // On failures the node can just do nothing. Error state
              // will get set automatically by an event fired from the WledDevice object.
              .catch(function () {
              return;
          });
      }
      function onConnected() {
          this.status({ fill: "green", shape: "dot", text: "Connected to " + this.config.address });
      }
      function onConnecting() {
          this.status({ fill: "yellow", shape: "dot", text: "Connecting to " + this.config.address });
      }
      function onDisconnected() {
          this.status({ fill: "red", shape: "dot", text: "Disconnected" });
      }
      function onError() {
          this.status({ fill: "red", shape: "dot", text: "Error at " + getPrettyDate() });
      }
      function getPrettyDate() {
          return new Date().toLocaleDateString("en-US", {
              month: "short",
              day: "numeric",
              hour12: false,
              hour: "numeric",
              minute: "numeric",
          });
      }
  };
  //# sourceMappingURL=wled2.js.map