import {Meteor} from "meteor/meteor"
import {Client} from 'intercom-client'
import {
    EveryspaceIntercomClient,
    IntercomCreateContactData, IntercomCustomDataAttribute,
    IntercomEventData,
    IntercomUpdateContactData
} from "/imports/api/Intercom/both/lib/EveryspaceIntercomClient";

const Intercom = new Client({ tokenAuth: { token: 'dG9rOjA2MGNlZTdhXzM0MDlfNDI0MF84OWE2XzUxOGNlZWZkMDU2NToxOjA=' } })
const SeederEnabled = true;

Meteor.methods({
    //A once-off seeder for the intercom instance, keeping it in case its needed again or if new events are required
     async "intercom.seedEvents"() {
        if(SeederEnabled) {
            //Eat your heart out Dev 0ps
            // await EveryspaceIntercomClient.trackEvent({ eventName: "admin_approved_listing", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "admin_declined_listing", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "booking_request_sent", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_paydetails_added", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_paydetails_removed", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_review_notification", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_booking_request_expired", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_has_reviewed", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_requested_publish", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "payout_method_removed", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "user_added_to_mailing_list", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "listing_updated", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "viewed_saved_listings", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "viewed_cancelled_bookings", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "viewed_past_bookings", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "viewed_booking_requests", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "viewed_upcoming_bookings", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_bookings_viewed", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_booking_request_received", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_bookings_accepted", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_booking_accepted", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_bookings_declined", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_booking_declined", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_booking_cancelled_notification", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "booking_cancelled", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "booking_step_1_completed", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "listing_updated_photo_added", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_custom_fee_sent", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_custom_fee_received", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_list_subscribe", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "payout_method_added", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "payout_method_changed", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "user_removed_from_mailing_list", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "settings_updated", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_deactivated_listing", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "first_listing_added", createdAt: Date.now() })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "filmmaker_booking_request_expired", createdAt: Date.now()  })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "host_booking_request_reminder", createdAt: Date.now()  })
            // await EveryspaceIntercomClient.trackEvent({ eventName: "listing_saved", createdAt: Date.now() })
        }

        return "Great Success"
    },

    async "intercom.trackEvent"(event: IntercomEventData) {
        if(!event.eventName) {
            throw new Meteor.Error("eventName required")
        }

        const userId = event.userId || this.userId;
        if(!userId) {
            throw new Meteor.Error("not-allowed")
        }

        const user = Meteor.users.findOne({ _id: userId })
        if(!user) {
            throw new Meteor.Error("no user found")
        }

        const email = user?.profile.email;
        if(!email) {
            throw new Meteor.Error("user has no email")
        }

        try {
            const d = new Date();
            const seconds = Math.round(d.getTime() / 1000)
            const result = await Intercom.events.create({ ...event, email, createdAt: seconds })
            console.log("intercom.trackEvent", result)
        }
        catch (error) {
            if(error.message === "User Not Found") {
                await EveryspaceIntercomClient.addContact({ userId })
                await EveryspaceIntercomClient.trackEvent(event)
            } else {
                console.log(error)
            }
        }
    },

    async "intercom.addContact"(create: IntercomCreateContactData) {
        const userId = create.userId || this.userId
        if(!userId) {
            throw new Meteor.Error("not-allowed")
        }

        const user = Meteor.users.findOne({ _id: userId })
        if(!user) {
            throw new Meteor.Error("no user found")
        }

        const email = user?.profile.email;
        if(!email) {
            throw new Meteor.Error("user has no email")
        }

        const d = new Date();
        const seconds = Math.round(d.getTime() / 1000);

        const result = await Intercom.contacts.createUser({
            email,
            externalId: user._id,
            lastSeenAt: seconds,
            name: `${user.profile.first_name} ${user.profile.last_name}`,
            phone: user.profile.mobile_number,
            ...create
        })
        console.log("intercom.addContact", result)

        Meteor.users.update({ _id: userId }, {
            $set: { intercom_contact_id: result.id }
        })

        return result
    },

    // async "intercom.removeContact"(intercomUserId: string) {
    //     const result = await Intercom.contacts.delete({ id: intercomUserId })
    //     console.log("intercom.removeContact", result)
    // },

    async "intercom.updateContact"(update: IntercomUpdateContactData) {
        const userId = update.userId || this.userId;
        if(!userId) {
            throw new Meteor.Error("not-allowed")
        }

        const user = Meteor.users.findOne({ _id: userId })
        if(!user) {
            throw new Meteor.Error("no user found")
        }
        // @ts-ignore
        const intercomId = user.intercom_contact_id
        if(!intercomId) {
            throw new Meteor.Error("intercom contact id required")
        }

        const d = new Date();
        const seconds = Math.round(d.getTime() / 1000);

        const result = await Intercom.contacts.update({
            ...update,
            id: intercomId,
            lastSeenAt: this.userId === userId ? seconds:undefined
        })

        console.log("intercom.updateContact", result)
    },

    async "intercom.addCustomDataAttributes"(customDataAttribute: IntercomCustomDataAttribute) {
        //     LISTING_ADDED: "Yes",
        //     NUMBER_OF_LISTINGS: numberOfListings,
        //     LATEST_LISTING_DATE: new Date().toString(),
        //     LATEST_LISTING_STEP_1_FINISHED: "No",
        //     LATEST_LISTING_STEP_2_FINISHED: "No",
        //     LATEST_LISTING_STEP_3_FINISHED: "No",
        //     LATEST_LISTING_PUBLISHED: "No"
        //     FIRST_LISTING_CATEGORY: string
        //     NUMBER_OF_SAVED_LISTINGS: number
        try {
            const result = await Intercom.dataAttributes.create(customDataAttribute);
            console.log("intercom.addCustomDataAttributes", result)
        } catch (error) {
            console.log("intercom.addCustomDataAttributes", error)
        }
    }
});