'use strict';

import debug from 'debug';
import transform from 'sdp-transform';

import { md5 } from 'blueimp-md5';
import { EventEmitter } from 'events';
import { Call } from './call';

const DEBUG = debug('sylkrtc:Account');


class Account extends EventEmitter {
    constructor(id, password, connection) {
        if (id.indexOf('@') === -1) {
            throw new Error('Invalid account id specified');
        }
        super();
        const username = id.substring(0, id.indexOf('@'));
        const domain = id.substring(id.indexOf('@') + 1);
        this._id = id;
        this._password = md5(username + ':' + domain + ':' + password);
        this._connection = connection;
        this._registrationState = null;
        this._calls = new Map();
    }

    get id() {
        return this._id;
    }

    get password() {
        return this._password;
    }

    get registrationState() {
        return this._registrationState;
    }

    register() {
        let req = {
            sylkrtc: 'account-register',
            account: this._id
        };
        this._sendRequest(req, (error) => {
            if (error) {
                DEBUG('Register error: %s', error);
                const oldState = this._registrationState;
                const newState = 'failed';
                let data = {reason: error.toString()};
                this._registrationState = newState;
                this.emit('registrationStateChanged', oldState, newState, data);
            }
        });
    }

    unregister() {
        let req = {
            sylkrtc: 'account-unregister',
            account: this._id,
        };
        this._sendRequest(req, (error) => {
            if (error) {
                DEBUG('Unregister error: %s', error);
            }
            const oldState = this._registrationState;
            const newState = null;
            this._registrationState = newState;
            this.emit('registrationStateChanged', oldState, newState, {});
        });
    }

    call(uri, options={}) {
        let call = new Call(this);
        call._initOutgoing(uri, options);
        this._calls.set(call.id, call);
        this.emit('outgoingCall', call);
        return call;
    }

    // Private API

    _handleEvent(message) {
        DEBUG('Received account event: %s', message.event);
        switch (message.event) {
            case 'registration_state':
                const oldState = this._registrationState;
                const newState = message.data.state;
                let data = {};
                this._registrationState = newState;
                if (newState === 'failed') {
                    data.reason = message.data.reason;
                }
                this.emit('registrationStateChanged', oldState, newState, data);
                break;
            case 'incoming_session':
                let call = new Call(this);
                call._initIncoming(message.session, message.data.originator, message.data.sdp);
                this._calls.set(call.id, call);
                // see what media types are offered
                let mediaTypes = { audio: false, video: false };
                const parsedSdp = transform.parse(message.data.sdp);
                for (let media of parsedSdp.media) {
                    if (media.type === 'audio' && media.port !== 0 && media.direction === 'sendrecv') {
                        mediaTypes.audio = true;
                    } else if (media.type === 'video' && media.port !== 0 && media.direction === 'sendrecv') {
                        mediaTypes.video = true;
                    }
                }
                DEBUG('Incoming call from %s with media types: %o', message.data.originator, mediaTypes);
                this.emit('incomingCall', call, mediaTypes);
                break;
            case 'missed_session':
                this.emit('missedCall', message.data);
                break;
            default:
                break;
        }
    }

    _sendRequest(req, cb) {
        this._connection._sendRequest(req, cb);
    }

}


export { Account };

@@ -2034,32 +2034,35 @@
         let call
+Obj
  = new Call(this
@@ -2072,24 +2072,27 @@
         call
+Obj
 ._initOutgoi
@@ -2129,32 +2129,35 @@
 ._calls.set(call
+Obj
 .id, call);%0A    
@@ -2141,32 +2141,35 @@
 callObj.id, call
+Obj
 );%0A        this.
@@ -2182,27 +2182,33 @@
 outgoing
-C
+c
 all
+Obj
 ', call
+Obj
 );%0A     
@@ -2221,16 +2221,19 @@
 urn call
+Obj
 ;%0A    %7D%0A

Rename variable