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 (JSON.parse(localStorage.getItem('clay-settings')).server) {
        var server = JSON.parse(localStorage.getItem('clay-settings')).server
        url = server + url_path;
        var xhr = new XMLHttpRequest();
        xhr.timeout = 4000; // time in milliseconds

        xhr.open(method, url, true);
        console.log('------xhr opened on ' + url + ' # retry=' + retry)
        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;
            }
        };
        xhr.send(null);

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

}


function authenticate() {
    var response;
    sid = "";
    console.log('---- authenticate');
    if (JSON.parse(localStorage.getItem('clay-settings')).username && JSON.parse(localStorage.getItem('clay-settings')).password) {
        var username = JSON.parse(localStorage.getItem('clay-settings')).username;
        var password = JSON.parse(localStorage.getItem('clay-settings')).password;
        console.log('-- username:' + username);
        console.log('-- password:' + 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 = 10;
        xhr_to_syno(method, url_path, onload_function, max_retry);
    } else {
        console.log("--- failed to get settings");
        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');

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

        onload_function = function(xhr) {
            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');
                });
            }
        }

        max_retry = 10;
        xhr_to_syno(method, url_path, onload_function, max_retry);

    } else {
        authenticate();
        get_status();
    }

}


function switch_home(bool) {
    var response;
    console.log('---- authenticate');
    if (sid != "") {
        status = "";
        console.log('---- get_status');
        url_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=GetInfo&_sid=" + sid;
        var method = "GET";

        onload_status_function = function(xhr) {
            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_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=Switch&on=" + bool + "&_sid=" + sid;
                    method = "GET"
                    onload_switch_function = function(xhr) {
                        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');
                            });
                        }
                    }
                    max_retry = 10;
                    xhr_to_syno(method, url_path, onload_switch_function, max_retry);

                } 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');
                    });

                }
            }
        }

        max_retry = 10;
        xhr_to_syno(method, url_path, onload_status_function, max_retry);

    } else {
        authenticate();
        switch_home(bool);
    }

}

// Get JS readiness events
Pebble.addEventListener('ready', function(e) {
    console.log("---- local storage:");
    console.log("user " + JSON.parse(localStorage.getItem('clay-settings')).username);
    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]);
    }

});