import {Meteor} from "meteor/meteor"
import {EventObject} from "intercom-client/dist/event/event.types";
import {ContactObject} from "intercom-client/dist/contact/contact.types";
import {DataAttributeObject} from "intercom-client/dist/dataAttribute/dataAttribute.types";

export interface IntercomEventData {
    eventName: EventObject['event_name'];
    createdAt: EventObject['created_at'];
    userId?: EventObject['user_id']; //Meteor user id
    id?: EventObject['id'];
    email?: EventObject['email'];
    metadata?: EventObject['metadata'];
}

export interface IntercomCreateContactData {
    email?: string;
    userId?: string; //Meteor user id
    phone?: ContactObject['phone'];
    name?: ContactObject['name'];
    avatar?: ContactObject['avatar'];
    signedUpAt?: ContactObject['signed_up_at'];
    lastSeenAt?: ContactObject['last_seen_at'];
    ownerId?: ContactObject['owner_id'];
    isUnsubscribedFromEmails?: ContactObject['unsubscribed_from_emails'];
    customAttributes?: ContactObject['custom_attributes'];
}

export interface IntercomUpdateContactData {
    userId?: string; //Meteor user id
    role?: ContactObject['role'];
    externalId?: ContactObject['external_id'];
    phone?: ContactObject['phone'];
    name?: ContactObject['name'];
    avatar?: ContactObject['avatar'];
    signedUpAt?: ContactObject['signed_up_at'];
    lastSeenAt?: ContactObject['last_seen_at'];
    ownerId?: ContactObject['owner_id'];
    isUnsubscribedFromMails?: ContactObject['unsubscribed_from_emails'];
    customAttributes?: ContactObject['custom_attributes'];
}

export interface IntercomCustomDataAttribute {
    name: DataAttributeObject["name"],
    model: DataAttributeObject["model"], //ModelType.CONTACT,
    dataType: DataAttributeObject["data_type"], //DataType.STRING, DataType.INTEGER
    description?: DataAttributeObject["description"]
    options?: DataAttributeObject["options"]
}

export class EveryspaceIntercomClient {
    static seedEvents() {
        return new Promise((resolve, reject) => {
            Meteor.call("intercom.seedEvents", {}, (error: Meteor.Error, result: any) => {
                if(error) {
                    reject(error)
                } else {
                    resolve(result)
                }
            })
        })
    }

    static trackEvent(event: IntercomEventData) {
        return new Promise((resolve, reject) => {
            Meteor.call("intercom.trackEvent", event, (error: Meteor.Error, result: any) => {
                if(error) {
                    reject(error)
                } else {
                    resolve(result)
                }
            })
        })
    }

    static addContact(user: IntercomCreateContactData) {
        return new Promise((resolve, reject) => {
            Meteor.call("intercom.addContact", user, (error: Meteor.Error, result: any) => {
                if(error) {
                    reject(error)
                } else {
                    resolve(result)
                }
            })
        })
    }

    static updateContact(user: IntercomUpdateContactData) {
        return new Promise((resolve, reject) => {
            Meteor.call("intercom.updateContact", user, (error: Meteor.Error, result: any) => {
                if(error) {
                    reject(error)
                } else {
                    resolve(result)
                }
            })
        })
    }
}