const loadCRM = require('./loadCRM')
const lookupContactByPhone = require('./lookupCRMContactByPhone')
const createContact = require('./createContact')
const findProperty = require('./findProperty')
const CRM_Contact = require('../models/CRM_Contact')
const CRM_Ticket = require('../models/CRM_Ticket')
const CRM = require('../models/CRM')
const createTicket = require('./createTicket')

const lookupCRMTicket = require('./lookupCRMTicket')
const sendEventTicketCreatedToSocket = require('./sendEventTicketCreatedToSocket')
const journalingRequest = require('./journalingRequest')


async function ticketCRM(companyId, crmPhone, crmAgent="0000", crmFirstName = 'Username') {

    const crmFiles = await loadCRM(companyId)

    // const crmContactIds = []
    const crmTicketLinks = []

    for (const crmConfig of crmFiles) {

        const { crmRest: rest, authentication } = crmConfig.crm

        // console.log("ticketCRM crmRest: ", JSON.stringify(rest, null, 6))

        // Send the ticket url link to hitphone to open on another browser tab
        let obj = findProperty(rest, 'lookupTicket')

        let ticket_id = ''
        let isCreated = false

        if (obj) {

            let { url } = obj.request
            let contact = await _lookupContact(rest, authentication, crmPhone, companyId, crmFirstName)

            const crm = await CRM.findOne({
                companyId, crmBaseURL: new URL(url.trim()).hostname
            })

            const obj_contact = await CRM_Contact.findOne({ companyId, crmBaseURL: new URL(url).hostname, phone: crmPhone })

            const obj_ticket = await CRM_Ticket.findOne(
                { companyId, crm, contact: obj_contact }
            ).select('ticketId')

            if (obj_ticket) {

                console.log('obj_ticket1: ', obj_ticket)

                const { ticketId } = obj_ticket

                if (ticketId) {
                    ticket_id = ticketId
                }

                const obj_ticket_status = await lookupCRMTicket(
                    rest,
                    authentication,
                    crmPhone,
                    companyId,
                    test = { testing: false },
                    obj_ticket.ticketId
                )

                if (obj_ticket_status) {
                    const { auxTicketStatus, error } = obj_ticket_status

                    // refactor this for production. For now only working with hubspot where status new is equal 1
                    if ((auxTicketStatus && auxTicketStatus != '1') || (error && error == 404)) {
                        await CRM_Ticket.deleteMany({ contact: obj_contact })

                        const { ticketUrl, ticketId } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent)

                        ticket_id = ticketId
                        isCreated = true
                        // crmTicketLinks.push({ ticketUrl, ticketId })

                    }
                }

            }
            else {
                console.log('_createTicket xxxxx ')

                const { ticketUrl, ticketId } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent)

                ticket_id = ticketId
                isCreated = true
            }

            crmTicketLinks.push({
                ticketId: `https://app.hubspot.com/contacts/23636141/ticket/${ticket_id}`,
                created: isCreated,
            })


        }
        // 

    }  
    return crmTicketLinks

}

module.exports = ticketCRM


async function _lookupContact(rest, authentication, crmPhone, companyId, crmFirstName) {

    let contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId)

    if (contact?.exist) {
        return { created: false, contactId: contact.contactId }
    }

    if (!contact?.exist) {
        contact = await createContact(companyId, rest, authentication, crmPhone, crmFirstName)
    }

    return { created: true, contactId: contact.contactId }
}

async function _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent) {
    let obj = findProperty(rest, 'createTicketRecord')

    let ticket_url = ''
    let ticket_id = ''

    if (obj) {
        let { request, response } = obj

        if (request) {
            msg = `Tentando criar ticket para o contato ${crmPhone}`
            //     return { exist: true, ticketId: auxTicketId, phone: crmPhone, ticketUrl }

            // console.log('xxxxxxxxxxxxxxxxxxxxxxxxx1')
            //  return { exist: true, ticketId: auxTicketId, phone: crmPhone, ticketUrl }
            const { ticketUrl, ticketId, } = await createTicket(companyId,
                rest,
                authentication,
                crmPhone,
                crmFirstName = 'Username',
                crmLastName = '',
                crmEmail = '',
                test = { testing: false },
                crmContactId = contact.contactId,
                crmAgent
            )

            ticket_id = ticketId
            ticket_url = ticketUrl
        }
    }
    return { crmFirstName, ticketUrl: ticket_url, ticketId: ticket_id }
}