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')


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

    const crmFiles = await loadCRM(companyId)

    // console.log('xxxxxxxx crmFiles: ', JSON.stringify(crmFiles, null, 6))

    for (const crmConfig of crmFiles) {

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

        let obj = findProperty(rest, 'lookupTicket') 

        if (obj) { 

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

            if (!contact?.exist) {
                contact = await createContact(companyId, rest, authentication, crmPhone, 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) {

                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 })
                        crmFirstName = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent)
                    }
                }

            }
            else {
                crmFirstName = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent)
            }

        }

    }

}

module.exports = ticketCRM


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

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

        if (request) {
            msg = `Tentando criar ticket para o contato ${crmPhone}`

            await createTicket(companyId,
                rest,
                authentication,
                crmPhone,
                crmFirstName = 'Username',
                crmLastName = '',
                crmEmail = '',
                test = { testing: false },
                crmContactId = contact.contactId,
                crmAgent
            )
        }
    }
    return crmFirstName
}

