import { Request, Response } from "express";
import whatsappOfficialAPI from "../helpers/WhatsappOfficialAPI";

import SetTicketMessagesAsRead from "../helpers/SetTicketMessagesAsRead";
import { getIO } from "../libs/socket";
import Message from "../models/Message";

import ListMessagesService from "../services/MessageServices/ListMessagesService";
import ShowTicketService from "../services/TicketServices/ShowTicketService";
import DeleteWhatsAppMessage from "../services/WbotServices/DeleteWhatsAppMessage";
import SendWhatsAppMedia from "../services/WbotServices/SendWhatsAppMedia";
import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
import axios from "axios";
import Contact from "../models/Contact";
import {
  isValidMsg,
  verifyMessage
} from "../services/WbotServices/wbotMessageListener";
import CreateOrUpdateContactService from "../services/ContactServices/CreateOrUpdateContactService";
import sendWhatsAppMessageOfficialAPI from "../helpers/sendWhatsAppMessageOfficialAPI";
import Whatsapp from "../models/Whatsapp"; 

type IndexQuery = {
  pageNumber: string;
};

type MessageData = {
  body: string;
  fromMe: boolean;
  read: boolean;
  quotedMsg?: Message;
  mic_audio?: boolean
};

export const index = async (req: Request, res: Response): Promise<Response> => {
  const { ticketId } = req.params;
  const { pageNumber } = req.query as IndexQuery;

  const { count, messages, ticket, hasMore } = await ListMessagesService({
    pageNumber,
    ticketId
  });
  
  return res.json({ count, messages, ticket, hasMore });
};

export const store = async (req: Request, res: Response): Promise<Response> => {
  const { ticketId } = req.params;
  const { body, quotedMsg, mic_audio }: MessageData = req.body;
  const medias = req.files as Express.Multer.File[];
  const ticket = await ShowTicketService(ticketId);

  const { queueId } = ticket;
  console.log("-----------> queueId: ", queueId, "  |  quotedMsg: ", quotedMsg);  

  if (medias) {
    await Promise.all(
      medias.map(async (media: Express.Multer.File) => {
        console.log(
          `\n >>>>>>>>>> SENDING MESSAGE MEDIA
        Parcial ticket info and media: 
        ticket.id: ${ticket.id}
        ticket.status: ${ticket.status}
        ticket.whatsapp.id: ${ticket.whatsappId}
        ticket.contact.number: ${ticket.contact.number}
        ticket.contact.name: ${ticket.contact.name}
        ticket.contact.profilePicUrl: ${ticket.contact.profilePicUrl}
        ticket.user.id: ${ticket.user.id}
        ticket.user.name: ${ticket.user.name}
        media:`,
          media,
          "\n"
        );  
        await SendWhatsAppMedia({ media, ticket, mic_audio });
      })
    );
  } else {
    console.log(`\n >>>>>>>>>> SENDING MESSAGE
    Parcial ticket info: 
    ticket.id: ${ticket.id}
    ticket.status: ${ticket.status}
    ticket.whatsapp.id: ${ticket.whatsappId} 
    ticket.contact.number: ${ticket.contact.number}
    message: ${body}
    ticket.contact.name: ${ticket.contact.name}
    ticket.contact.profilePicUrl: ${ticket.contact.profilePicUrl}
    ticket.user.id: ${ticket.user.id}
    ticket.user.name: ${ticket.user.name}\n`);

    await SendWhatsAppMessage({ body, ticket, quotedMsg });
  }

  return res.send();
};

export const remove = async (
  req: Request,
  res: Response
): Promise<Response> => {
  const { messageId } = req.params;

  const message = await DeleteWhatsAppMessage(messageId);

  const io = getIO();
  io.to(message.ticketId.toString()).emit("appMessage", {
    action: "update",
    message
  });

  return res.send();
};