import AppError from "../../errors/AppError";
import CheckContactOpenTickets from "../../helpers/CheckContactOpenTickets";
import GetDefaultWhatsApp from "../../helpers/GetDefaultWhatsApp";
import Ticket from "../../models/Ticket";
import ShowContactService from "../ContactServices/ShowContactService";


import { getIO } from "../../libs/socket";
import ShowUserServiceReport from "../UserServices/ShowUserServiceReport";

import format from 'date-fns/format';
import ptBR from 'date-fns/locale/pt-BR';
import { splitDateTime } from "../../helpers/SplitDateTime";
import TicketEmiterSumOpenClosedByUser from "../../helpers/OnlineReporEmiterInfoByUser";

import { createOrUpdateTicketCache } from '../../helpers/TicketCache'
let flatten = require('flat')



interface Request {
  contactId: number;
  status: string;
  userId: number;
}

const CreateTicketService = async ({
  contactId,
  status,
  userId
}: Request): Promise<Ticket> => {

  try {

    const defaultWhatsapp = await GetDefaultWhatsApp(userId);

    await CheckContactOpenTickets(contactId);

    const { isGroup } = await ShowContactService(contactId);

    const { id }: Ticket = await defaultWhatsapp.$create("ticket", {
      contactId,
      status,
      isGroup,
      userId
    });

    const ticket = await Ticket.findByPk(id, { include: ["contact"] });

    if (!ticket) {
      throw new AppError("ERR_CREATING_TICKET");
    }

    // console.log('CONTACT ticket.id: ', ticket.id)


    // TEST DEL 
    try {

      let jsonString = JSON.stringify(ticket); //convert to string to remove the sequelize specific meta data 
      let ticket_obj = JSON.parse(jsonString); //to make plain json
      delete ticket_obj['contact']['extraInfo']

      ticket_obj = flatten(ticket_obj)

      await createOrUpdateTicketCache(`ticket:${ticket.id}`, ticket_obj)

    } catch (error) {
      console.log('There was an error on UpdateTicketService.ts on createTicketCache from user: ', error)
    }
    //


    const dateToday = splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR })))

    TicketEmiterSumOpenClosedByUser(userId.toString(), dateToday.fullDate, dateToday.fullDate)

    const io = getIO();
    io.emit("ticketStatus", {
      action: "update",
      ticketStatus: { ticketId: ticket.id, status: ticket.status }
    });


    return ticket;

  } catch (error: any) {
    console.error('===> Error on CreateTicketService.ts file: \n', error)
    throw new AppError(error.message);
  }

};

export default CreateTicketService;