// twister_user.js
// 2013 Miguel Freitas
//
// Load/save current user to localStorage
// keep track of lastPostId (used for posting as defaultScreenName)
// Load/save profile (profile-edit.html)

var defaultScreenName = undefined;
var localUsernames = [];
var lastPostId = undefined;

// basic user functions
// -------------------------------

function initUser(cbFunc, cbArg) {
    loadWalletlUsers( function() {
                       var $localUsersList = $("select.local-usernames");
                       if( $localUsersList.length ) {
                           for( var i = 0; i < localUsernames.length; i++ ) {
                               var $existingOption = $localUsersList.find("option[value='" + localUsernames[i] + "']");
                               if( !$existingOption.length ) {
                                   var $userOption = $("<option/>");
                                   $userOption.val(localUsernames[i]);
                                   $userOption.text(localUsernames[i]);
                                   $localUsersList.append($userOption);
                               }
                           }
                       }

                       loadScreenName();
                       if( !defaultScreenName || localUsernames.indexOf(defaultScreenName) < 0 ) {
                           defaultScreenName = undefined;
                       } else {
                           var $localUsersLogin = $("select.local-usernames.login-user");
                           if( $localUsersLogin.length ) {
                               $localUsersLogin.val(defaultScreenName);
                           }

                           var $userMenuConfig = $(".userMenu-config");
                           if( $userMenuConfig.length ) {
                               $userMenuConfig.find("a.mini-profile-name").attr("href",$.MAL.userUrl(defaultScreenName));
                               $userMenuConfig.find(".mini-profile-name").text(defaultScreenName);
                               getFullname( defaultScreenName, $userMenuConfig.find(".mini-profile-name") );
                           }
                       }
                       lastPostId = undefined;
                       if( cbFunc )
                           cbFunc(cbArg);
    });
}

function incLastPostId( optionalNewValue ) {
    if( optionalNewValue != undefined ) {
        if( lastPostId == undefined || optionalNewValue > lastPostId ) {
            lastPostId = optionalNewValue;
        }
    } else {
        lastPostId++;
    }
    $.MAL.updateMyOwnPostCount(lastPostId+1);
}

function loadWalletlUsers(cbFunc, cbArg) {
    twisterRpc("listwalletusers", [],
               function(args, ret) {
                   localUsernames = [];
                   for( var i = 0; i < ret.length; i++ ) {
                        // filter out group aliases
                        if( ret.length && ret[i][0] !== '*' ) {
                            localUsernames.push(ret[i]);
                        }
                   }
                   args.cbFunc(args.cbArg);
               }, {cbFunc:cbFunc, cbArg:cbArg},
               function(args, ret) {
                   alert(polyglot.t("error_connecting_to_daemon"));
               }, {});
}

function loadScreenName() {
    if( $.localStorage.isSet("defaultScreenName") ) {
        defaultScreenName = $.localStorage.get("defaultScreenName").toString();
    }
}

function saveScreenName() {
    $.localStorage.set("defaultScreenName", defaultScreenName);
}


// user-related functions used by login page (desktop/mobile)
// ----------------------------------------------------------

function loginLocalUsername() {
    defaultScreenName = $("select.local-usernames.login-user").val();
    if(defaultScreenName) {
        saveScreenName();
        $.MAL.changedUser();
        $.MAL.goHome();
    }
}

function checkUsernameAvailability() {
    var $newUsername = $(".new-username");
    var username = $newUsername.val().toLowerCase();
    $newUsername.val(username);
    var $availField = $(".availability");

    if( !username.length )
        return;
    if( username.length > 16 ) {
        $availField.text(polyglot.t("Must be 16 characters or less."));
        return;
    }

    //Check for non-alphabetic characters and space
    if(username.search(/[^a-z0-9_]/) != -1) {
        $availField.text(polyglot.t("Only alphanumeric and underscore allowed."));
        return;
    }

    $availField.text(polyglot.t("Checking..."));

    dumpPubkey(username, function(dummy, pubkey) {
                            var notAvailable =  pubkey.length > 0
                            var $availField = $(".availability");
                            if( notAvailable ) {
                                $availField.text(polyglot.t("Not available"));
                            } else {
                                $availField.text(polyglot.t("Available"));

                                var $createButton = $(".create-user");
                                $.MAL.enableButton( $createButton );
                            }
                        }, null);
}

function newUserNameKeypress() {
    var $availField = $(".availability");
    $availField.text("");
    var $createButton = $(".create-user");
    $.MAL.disableButton( $createButton );
}

// create user and call cbFunc(username, privkey)
function createUserClick(cbFunc) {
    var $newUsername = $(".new-username");
    var username = $newUsername.val().toLowerCase();

    if( localUsernames.indexOf(username) < 0 ) {
        twisterRpc("createwalletuser", [username],
                   function(args, ret) {
                       args.cbFunc(args.username, ret);
                   }, {username:username, cbFunc:cbFunc},
                   function(args, ret) {
                       alert(polyglot.t("Error in 'createwalletuser' RPC."));
                   }, {cbFunc:cbFunc});
    } else {
        // user exists in wallet but transaction not sent
        dumpPrivkey(username,
                    function(args, ret) {
                       args.cbFunc(args.username, ret);
                    }, {username:username, cbFunc:cbFunc});
    }
}

function sendNewUserTransaction(username, cbFunc) {
    twisterRpc("sendnewusertransaction", [username],
               function(args, ret) {
                   args.cbFunc();
               }, {cbFunc:cbFunc},
               function(args, ret) {
                   alert(polyglot.t("Error in 'sendnewusertransaction' RPC."));
               }, {});
}

function importSecretKeyClick() {
    var secretKey = $(".secret-key-import").val();
    var username = $(".username-import").val().toLowerCase();

    twisterRpc("importprivkey", [secretKey,username],
               function(args, ret) {
                   processNewSecretKeyImported(args.username);
               }, {username:username},
               function(args, ret) {
                   alert(polyglot.t("Error in 'importprivkey'", {rpc: ret.message }));
               }, {});
}

function processNewSecretKeyImported(username) {
    defaultScreenName = username;
    saveScreenName();
    $.MAL.changedUser();
    $.MAL.goHome();
}

// handlers common to both desktop and mobile
function interfaceCommonLoginHandlers() {
    $( ".login-local-username" ).bind( "click", loginLocalUsername );
    $( ".check-availability").bind( "click", checkUsernameAvailability );
    /* must specialize: $( ".create-user").bind( "click", function() { createUserClick( processCreateUser ); } ); */
    /* must specialize: $( ".login-created-user").bind( "click", loginCreatedUser ); */
    $( ".new-username" ).keyup( newUserNameKeypress );
    $('.secret-key-import').on('input', importSecretKeypress);
    $('.username-import').on('input', importSecretKeypress);
    $( ".import-secret-key").bind( "click", importSecretKeyClick );
}

// profile-related functions used by profile-edit
// ----------------------------------------------
var avatarSeqNum = 0;
var profileSeqNum = 0;

function loadAvatarForEdit() {
    dhtget( defaultScreenName, "avatar", "s",
           function(args, imagedata, rawdata) {
               if( rawdata ) {
                   var seq = parseInt(rawdata[0]["p"]["seq"]);
                   if( seq > avatarSeqNum ) avatarSeqNum = seq;
               }
               if( imagedata && imagedata.length ) {
                   $(".profile-card-photo.forEdition").attr("src", imagedata);
               }
           }, {} );
}

function loadProfileForEdit() {
    dhtget( defaultScreenName, "profile", "s",
           function(args, profile, rawdata) {
               if( rawdata ) {
                   var seq = parseInt(rawdata[0]["p"]["seq"]);
                   if( seq > profileSeqNum ) profileSeqNum = seq;
               }
               if( profile ) {
                   if( "fullname" in profile)
                       $(".input-name").val(profile.fullname);
                   if( "bio" in profile)
                       $(".input-description").val(profile.bio);
                   if( "location" in profile)
                       $(".input-city").val(profile.location);
                   if( "url" in profile)
                       $(".input-website").val(profile.url);
                   if( "tox" in profile)
                       $(".input-tox").val(profile.tox);
                   if( "bitmessage" in profile)
                       $(".input-bitmessage").val(profile.bitmessage);
               }
           }, {} );
}

function saveProfile(e) {
    function saveAvatar(req, isProfileDataSaved) {
        dhtput(defaultScreenName, 'avatar', 's',
            req.avatarImgSrc,
            defaultScreenName, ++avatarSeqNum,
            completeProfileSaving, {isProfileDataSaved: isProfileDataSaved}
        );
    }

    function completeProfileSaving(req, isAvatarDataSaved) {
        if (req.isProfileDataSaved && isAvatarDataSaved) {
            clearAvatarAndProfileCache(defaultScreenName);
            var txtTitle = '';
            var txtMessage = polyglot.t('profile_saved');
        } else {
            var txtTitle = polyglot.t('error', {error: ''});
            var txtMessage = polyglot.t('profile_not_saved');
        }
        alertPopup({
            txtTitle: txtTitle,
            txtMessage: txtMessage,
            cbConfirm: $.MAL.enableButton,
            cbConfirmReq: $('.submit-changes'),
            cbClose: 'cbConfirm'
        });
    }

    $.MAL.disableButton($('.submit-changes'));

    dhtput(defaultScreenName, 'profile', 's',
        setObjPropFromElemVal({}, {
            fullname:   '.input-name',
            bio:        '.input-description',
            location:   '.input-city',
            url:        '.input-website',
            tox:        '.input-tox',
            bitmessage: '.input-bitmessage'
        }),
        defaultScreenName, ++profileSeqNum,
        saveAvatar, {avatarImgSrc: $('.profile-card-photo.forEdition').attr('src')}
    );
}

function setObjPropFromElemVal(object, req) {
    var props = Object.getOwnPropertyNames(req);  // req's props names will be object's props names

    for (var i = 0; i < props.length; i++) {
        elem = $(req[props[i]]);  // req's props values are elements selectors
        if (elem.length && elem.val())
            object[props[i]] = elem.val();
    }

    return object;
}