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
