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";
import checkLastClientMsg24hs from "../helpers/CheckLastClientMsg24hs";
import AppError from "../errors/AppError";
import { get } from "../helpers/RedisClient";

type IndexQuery = {
  pageNumber: string;
};

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

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, params }: 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,
    " | params: ",
    params
  );

  const { phoneNumberId, whatsappId } = ticket;

  if (phoneNumberId) {
    const into24hs = await checkLastClientMsg24hs(ticket);

    if (into24hs && into24hs.length == 0) {
      if (params) {
        console.log("SEND TEMPLATE PARAMS: ", params);

        // return res.send()

        let payloadComponents = [];

        try {
          for (let i in params) {
            const { parameters, language, type } = params[i];
            if (type == "BODY") {
              if (parameters && parameters.length > 0) {
                let components: any = [{ type: "body", parameters: [] }];
                for (let x in parameters) {
                  const { type, text, index } = parameters[x];
                  console.log(text);
                  components[0].parameters.splice(index - 1, 0, {
                    type,
                    text
                  });
                }
                payloadComponents.push(components[0]);
              }
            } else if (type == "BUTTONS") {
            }
          }

          const name = params.find((p: any) => p?.template_name);
          const { language }: any =
            params?.find((p: any) => p?.language) || "pt_BR";

          const { template_name } = name;

          if (template_name && language) {
            const template: any = {
              template: {
                name: template_name,
                language: { code: language },
                components: payloadComponents
              }
            };

            console.log("TEMPLATE: ", template);

            sendWhatsAppMessageOfficialAPI(ticket, body, null, template);

            return res.send();
          }
        } catch (error: any) {
          throw new AppError(error.message);
        }
      } else {
        try {
          const { wabaId }: any = await Whatsapp.findByPk(whatsappId);

          const { data } = await whatsappOfficialAPI.get(
            `/${process.env.VERSION}/${wabaId}/message_templates?language=pt_BR`
          );

          return res.status(200).json(data);
        } catch (error) {
          return res
            .status(500)
            .json({ message: "Não foi possível baixar os templates!" });
        }
      }
    }
  }

  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();
};
