var Clay = require('pebble-clay');
var clayConfig = require('./config');
var clay = new Clay(clayConfig);

var messageKeys = require('message_keys');

var sid;
var status;
var retry;
retry = 1;

function xhr_to_syno(method, url_path, onload_function, max_retry) {
  console.log('------xhr start')
  status = "";
  if (localStorage.getItem('username') && localStorage.getItem('password') && localStorage.getItem('server')) {
    var username = localStorage.getItem('username');
    var password = localStorage.getItem('password');
    var server = localStorage.getItem('server');
    url = server + url_path;
    var xhr = new XMLHttpRequest();
    xhr.timeout = 3000; // time in milliseconds

    xhr.open(method, url, true);
    console.log('------xhr opened')
    xhr.onload = function () {
      console.log('------xhr onload')
      if (xhr.readyState === 4) {
        retry = 1;
        console.log('------xhr request returned');
        if (xhr.status == 200) {
          onload_function(xhr);
          return true;
        } else {
          console.log('------xhr request returned error code ' + xhr.status);
          return false;
        }
      }
    }

    xhr.ontimeout = function (e) {
      retry++;
      if (retry < max_retry) {
        console.log('------xhr timed out retrying another time ');
        xhr_to_syno(method, url_path, onload_function, max_retry);
      } else {
        console.log('------xhr timed out ' + retry + ' time');
        //send back "timeout" to watch
        message = "Call to server timed out, verify settings and connectivity";

        // Build message
        var dict = {
          'status': message,
        };

        // Send the message
        Pebble.sendAppMessage(dict, function (e) {
          console.log('sent');
        }, function () {
          console.log('failed');
        });
        return false;
      }
    }

  } else {
    Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server.");
  }

}


function authenticate() {
  var response;
  sid = "";
  console.log('---- authenticate');
  if (localStorage.getItem('username') && localStorage.getItem('password') && localStorage.getItem('server')) {
    var username = localStorage.getItem('username');
    var password = localStorage.getItem('password');
    var url_path = "/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=" + username + "&passwd=" + password + "&session=SurveillanceStation&format=sid";
    var method = "GET";
    onload_function = function (xhr) {
      response = JSON.parse(xhr.responseText);
      if (response.success == true) {
        sid = response.data.sid;
        console.log('------Authentication succeeded');
        if (sid != "") {
          message = "Welcome to Syno Cam Switch ! ready & authenticated";
          // Build message
          var dict = {
            'auth': message,
          };
          // Send the message
          Pebble.sendAppMessage(dict, function (e) {
            console.log('sent');
          }, function () {
            console.log('failed');
          });
        } else {
          console.log('------Unexpected error : authentication is OK but no SID retrieved');
        }
      } else {
        console.log('------Authentication failed : ' + response.toString());
      }
    };
    max_retry = 1;
    xhr_to_syno(method, url_path, onload_function, max_retry);
  } else {
    Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server.");
  }


}


function get_status() {
  var response;

  if (sid != ""){
    status = "";
    console.log('---- get_status');
    if (localStorage.getItem('username')  && localStorage.getItem('password') && localStorage.getItem('server') ){
      var username=localStorage.getItem('username');
      var password=localStorage.getItem('password');
      var server=localStorage.getItem('server');
      url = server + "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=GetInfo&_sid="+sid;
      var xhr = new XMLHttpRequest();
      xhr.timeout = 3000; // time in milliseconds

      xhr.open("GET", url,true);

      xhr.onload = function () {
        if (xhr.readyState === 4) {
          retry=0;
          console.log('------Get-status request returned');
          if(xhr.status == 200) {
            response = JSON.parse(xhr.responseText);
            if (response.success == true){
              status = response.data.on;
              var message;
              switch (status) {
                case true:
                  message = "Your Home mode is ON";
                  break;
                case false:
                  message = "Your Home mode is OFF";
                  break;
                default:
                  message = "home mode is unknown !";
              }
              // Build message
              var dict = {
                'status': message,
              };

              // Send the message
              Pebble.sendAppMessage(dict, function(e) {
                console.log('sent');
              }, function() {
                console.log('failed');
              });
            }
          }else {
            console.log('------Request returned error code ' + xhr.status);
          }
        }
      }

      xhr.ontimeout = function (e){
        retry++;
        if (retry<=1){
          console.log('------Get-Status timed out retrying another time ');
          get_status();
        }else{
          console.log('------Get-Status timed out a second time');
          //send back "timeout" to watch
          message ="Get-Status timed out, verify settings and connectivity";

          // Build message
          var dict = {
            'status': message,
          };

          // Send the message
          Pebble.sendAppMessage(dict, function(e) {
            console.log('sent');
          }, function() {
            console.log('failed');
          });
        }
      }

      xhr.send();


    }else{
      Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server.");
    }
  }

}


function switch_home(bool) {
  var response;
  console.log('---- authenticate');
  if (sid != ""){
    status = "";
    console.log('---- get_status');
    if (localStorage.getItem('username')  && localStorage.getItem('password') && localStorage.getItem('server') ){
      var username=localStorage.getItem('username');
      var password=localStorage.getItem('password');
      var server=localStorage.getItem('server');
      var xhr = new XMLHttpRequest();

      url = server + "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=GetInfo&_sid="+sid;

      xhr.open("GET", url,false);
      xhr.send();

      if(xhr.status == 200) {
        response = JSON.parse(xhr.responseText);
        if (response.success == true){
          status = response.data.on;
          console.log('------ status:'+status);
          var message;
          var dict;
          if ( status != bool){
            console.log('---- switching home mode to '+ bool);
            url = server + "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=Switch&on="+bool+"&_sid="+sid;

            xhr.open("GET", url,false);
            xhr.send();

            if(xhr.status == 200) {
              response = JSON.parse(xhr.responseText);
              if (response.success == true){
                status=bool;
                switch (status) {
                  case true:
                    message = "You just set Home mode ON";
                    break;
                  case false:
                    message = "You just set Home mode OFF";
                    break;
                  default:
                    message = "something happened, try again !";
                }
                // Build message
                dict = {
                  'status': message,
                };

                // Send the message
                Pebble.sendAppMessage(dict, function(e) {
                  console.log('sent');
                }, function() {
                  console.log('failed');
                });
              }
            }else {
              console.log('------Request returned error code ' + xhr.status.toString());
            }
          }else{
            console.log('---- nothing to do, status already '+status);
            switch (status) {
              case true:
                message = "Your Home Mode is already ON";
                break;
              case false:
                message = "Your Home Mode is already OFF";
                break;
              default:
                message = "something happened, try again !";
            }
            // Build message
            dict = {
              'status': message,
            };

            // Send the message
            Pebble.sendAppMessage(dict, function(e) {
              console.log('sent');
            }, function() {
              console.log('failed');
            });
          }
        }
      }else {
        console.log('------Request returned error code ' + xhr.status.toString());
      }
    }else{
      Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server.");
    }
   }

}

// Get JS readiness events
Pebble.addEventListener('ready',function(e){
  console.log('PebbleKit JS is ready');
  // Update Watch on this
  Pebble.sendAppMessage({'JSReady':1});
});

// Get AppMessage events
Pebble.addEventListener('appmessage', function(e) {
  // Get the dictionary from the message
  var dict = e.payload;
  console.log(dict[0].toString());
  switch (dict[0]) {
    case 'auth':
      authenticate();
      break;
    case 'get':
      get_status();
      break;
    case 'home_on':
      switch_home(true);
      break;
    case 'home_off':
      switch_home(false);
      break;
    default:
      console.log('Sorry. I don\'t understand your request :'+ dict[0]);
  }

});