import Contact from './Contact.js';

class Account {
  constructor(id, details, volatileDetails) {
    this.id = id;
    this.details = details;
    this.volatileDetails = volatileDetails;
    this.contactCache = {};
    this.contacts = {};
    this.conversations = {};
    this.lookups = [];
    this.devices = {};
  }

  static from(object) {
    const account = new Account(object.id, object.details, object.volatileDetails);
    if (object.defaultModerators) account.defaultModerators = object.defaultModerators.map((m) => Contact.from(m));
    return account;
  }

  update(data) {
    this.details = data.details;
    this.volatileDetails = data.volatileDetails;
  }

  async getObject() {
    const hasModerators = this.defaultModerators && this.defaultModerators.length;
    return {
      id: this.id,
      details: this.details,
      defaultModerators: hasModerators
        ? await Promise.all(this.defaultModerators.map(async (c) => await c.getObject()))
        : undefined,
      volatileDetails: this.volatileDetails,
    };
  }

  getId() {
    return this.id;
  }

  getType() {
    return this.details['Account.type'];
  }

  getUri() {
    return this.details['Account.username'];
  }

  getRegisteredName() {
    return this.volatileDetails['Account.registeredName'];
  }

  isRendezVous() {
    return this.details['Account.rendezVous'] === Account.BOOL_TRUE;
  }

  isPublicIn() {
    return this.details['DHT.PublicInCalls'] === Account.BOOL_TRUE;
  }

  setDetail(detail, value) {
    this.details[detail] = value;
  }

  updateDetails(details) {
    return Object.assign(this.details, details);
  }

  getDetails() {
    return this.details;
  }

  getSummary() {
    return this.getObject();
  }

  getDisplayName() {
    return this.details['Account.displayName'] || this.getDisplayUri();
  }

  getDisplayUri() {
    return this.getRegisteredName() || this.getUri();
  }

  getDisplayNameNoFallback() {
    return this.details['Account.displayName'] || this.getRegisteredName();
  }

  getConversationIds() {
    return Object.keys(this.conversations);
  }
  getConversations() {
    return this.conversations;
  }

  getConversation(conversationId) {
    return this.conversations[conversationId];
  }

  addConversation(conversation) {
    this.conversations[conversation.getId()] = conversation;
  }

  removeConversation(conversationId) {
    delete this.conversations[conversationId];
  }

  getContactFromCache(uri) {
    let contact = this.contactCache[uri];
    if (!contact) {
      contact = new Contact(uri);
      this.contactCache[uri] = contact;
    }
    return contact;
  }

  getContacts() {
    return this.contacts;
  }

  getDefaultModerators() {
    return this.defaultModerators;
  }

  setDevices(devices) {
    this.devices = { ...devices };
  }
  getDevices() {
    return this.devices;
  }
}

Account.TYPE_JAMI = 'RING';
Account.TYPE_SIP = 'SIP';

Account.BOOL_TRUE = 'true';
Account.BOOL_FALSE = 'false';

export default Account;
