const Service = require('../service.js');

class Account extends Service {

    /**
     * Get Account
     *
     * Get currently logged in user data as JSON object.
     *
     * @throws Exception
     * @return {}
     */
    async get() {
        let path = '/account';
        
        return await this.client.call('get', path, {'content-type': 'application/json'},
            {
            });
    }

    /**
     * Delete Account
     *
     * Delete currently logged in user account.
     *
     * @throws Exception
     * @return {}
     */
    async delete() {
        let path = '/account';
        
        return await this.client.call('delete', path, {'content-type': 'application/json'},
            {
            });
    }

    /**
     * Update Account Email
     *
     * Update currently logged in user account email address. After changing user
     * address, user confirmation status is being reset and a new confirmation
     * mail is sent. For security measures, user password is required to complete
     * this request.
     *
     * @param string email
     * @param string password
     * @throws Exception
     * @return {}
     */
    async updateEmail(email, password) {
        let path = '/account/email';
        
        return await this.client.call('patch', path, {'content-type': 'application/json'},
            {
                'email': email,
                'password': password
            });
    }

    /**
     * Update Account Name
     *
     * Update currently logged in user account name.
     *
     * @param string name
     * @throws Exception
     * @return {}
     */
    async updateName(name) {
        let path = '/account/name';
        
        return await this.client.call('patch', path, {'content-type': 'application/json'},
            {
                'name': name
            });
    }

    /**
     * Update Account Password
     *
     * Update currently logged in user password. For validation, user is required
     * to pass the password twice.
     *
     * @param string password
     * @param string oldPassword
     * @throws Exception
     * @return {}
     */
    async updatePassword(password, oldPassword) {
        let path = '/account/password';
        
        return await this.client.call('patch', path, {'content-type': 'application/json'},
            {
                'password': password,
                'old-password': oldPassword
            });
    }

    /**
     * Get Account Preferences
     *
     * Get currently logged in user preferences key-value object.
     *
     * @throws Exception
     * @return {}
     */
    async getPrefs() {
        let path = '/account/prefs';
        
        return await this.client.call('get', path, {'content-type': 'application/json'},
            {
            });
    }

    /**
     * Update Account Prefs
     *
     * Update currently logged in user account preferences. You can pass only the
     * specific settings you wish to update.
     *
     * @param string prefs
     * @throws Exception
     * @return {}
     */
    async updatePrefs(prefs) {
        let path = '/account/prefs';
        
        return await this.client.call('patch', path, {'content-type': 'application/json'},
            {
                'prefs': prefs
            });
    }

    /**
     * Get Account Security Log
     *
     * Get currently logged in user list of latest security activity logs. Each
     * log returns user IP address, location and date and time of log.
     *
     * @throws Exception
     * @return {}
     */
    async getSecurity() {
        let path = '/account/security';
        
        return await this.client.call('get', path, {'content-type': 'application/json'},
            {
            });
    }

    /**
     * Get Account Active Sessions
     *
     * Get currently logged in user list of active sessions across different
     * devices.
     *
     * @throws Exception
     * @return {}
     */
    async getSessions() {
        let path = '/account/sessions';
        
        return await this.client.call('get', path, {'content-type': 'application/json'},
            {
            });
    }
}

module.exports = Account;