/*****************************************************************************
 * Open MCT, Copyright (c) 2014-2024, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 * Open MCT includes source code licensed under additional open source
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 * this source code distribution or the Licensing information page available
 * at runtime from the About dialog for additional information.
 *****************************************************************************/

// Set of connection states; changing among these states will be
// reflected in the indicator's appearance.
// CONNECTED: Everything nominal, expect to be able to read/write.
// DISCONNECTED: HTTP failed; maybe misconfigured, disconnected.
// PENDING: Still trying to connect, and haven't failed yet.
const CONNECTED = {
  statusClass: 's-status-on'
};
const PENDING = {
  statusClass: 's-status-warning-lo'
};
const DISCONNECTED = {
  statusClass: 's-status-warning-hi'
};
export default function URLIndicator(options, simpleIndicator) {
  this.bindMethods();
  this.count = 0;

  this.indicator = simpleIndicator;
  this.setDefaultsFromOptions(options);
  this.setIndicatorToState(PENDING);

  this.fetchUrl();
  setInterval(this.fetchUrl, this.interval);
}

URLIndicator.prototype.setIndicatorToState = function (state) {
  switch (state) {
    case CONNECTED: {
      this.indicator.text(this.label + ' is connected');
      this.indicator.description(
        this.label + ' is online, checking status every ' + this.interval + ' milliseconds.'
      );
      break;
    }

    case PENDING: {
      this.indicator.text('Checking status of ' + this.label + ' please stand by...');
      this.indicator.description('Checking status of ' + this.label + ' please stand by...');
      break;
    }

    case DISCONNECTED: {
      this.indicator.text(this.label + ' is offline');
      this.indicator.description(
        this.label + ' is offline, checking status every ' + this.interval + ' milliseconds'
      );
      break;
    }
  }

  this.indicator.statusClass(state.statusClass);
};

URLIndicator.prototype.fetchUrl = function () {
  fetch(this.URLpath)
    .then((response) => {
      if (response.ok) {
        this.handleSuccess();
      } else {
        this.handleError();
      }
    })
    .catch((error) => {
      this.handleError();
    });
};

URLIndicator.prototype.handleError = function (e) {
  this.setIndicatorToState(DISCONNECTED);
};

URLIndicator.prototype.handleSuccess = function () {
  this.setIndicatorToState(CONNECTED);
};

URLIndicator.prototype.setDefaultsFromOptions = function (options) {
  this.URLpath = options.url;
  this.label = options.label || options.url;
  this.interval = options.interval || 10000;
  this.indicator.iconClass(options.iconClass || 'icon-chain-links');
};

URLIndicator.prototype.bindMethods = function () {
  this.fetchUrl = this.fetchUrl.bind(this);
  this.handleSuccess = this.handleSuccess.bind(this);
  this.handleError = this.handleError.bind(this);
  this.setIndicatorToState = this.setIndicatorToState.bind(this);
};
