import { urlToBase64 } from "@/features/base64";
import type { IPost } from "@/lib/utils";
import { facebookService } from "./facebook.service";
import MessageService from "./message.service";

export class BackgroundService {
  msgService: MessageService;

  constructor() {
    this.msgService = new MessageService("background");
  }

  publishJob(data: IPost, timeout = 30000): Promise<any> {
    return new Promise((resolve, reject) => {
      chrome.tabs.query({}, () => {
        const openAndSend = (tabId: number) => {
          // Đợi tab load xong
          const listener = (updatedTabId: number, info: any) => {
            if (updatedTabId === tabId && info.status === "complete") {
              chrome.tabs.onUpdated.removeListener(listener);

              // Gửi message xuống content
              this.msgService.send("content", "background-to-content-publish", {
                data,
              });
            }
          };
          chrome.tabs.onUpdated.addListener(listener);

          // Chờ message phản hồi từ content
          this.msgService
            .waitForMessage("content-to-background-publish", timeout)
            .then((data) => {
              this.msgService.send("content", "background-to-content-actions", {
                data,
                type: "publist",
              });
              resolve(data);
            })
            .catch((data) => {
              this.msgService.send("content", "background-to-content-actions", {
                data: null,
                type: "publist",
              });

              reject(data);
            });
        };
        // Tạo tab mới
        chrome.tabs.create(
          {
            url: facebookService.createItem,
          },
          (tab) => {
            if (!tab?.id) {
              reject(new Error("Không mở được tab"));
              return;
            }
            console.log("Đã mở tab mới:", tab.id);
            openAndSend(tab.id);
          }
        );
      });
    });
  }

  unlistJob(data: IPost, timeout = 30000): Promise<any> {
    return new Promise((resolve, reject) => {
      const openAndSend = (tabId: number, shouldClose: boolean) => {
        const listener = (updatedTabId: number, info: any) => {
          if (updatedTabId === tabId && info.status === "complete") {
            chrome.tabs.onUpdated.removeListener(listener);

            // Gửi message xuống content
            this.msgService.send("content", "background-to-content-unlist", {
              data,
            });
          }
        };
        chrome.tabs.onUpdated.addListener(listener);

        // Chờ message phản hồi từ content
        this.msgService
          .waitForMessage("content-to-background-unlist", timeout)
          .then((res) => {
            if (shouldClose) {
              chrome.tabs.remove(tabId, () => {
                console.log("Đã đóng tab:", tabId);
              });
            } else {
              console.log("Hoàn thành nhưng giữ tab:", tabId);
            }

            this.msgService.send("content", "background-to-content-actions", {
              data,
              type: "unlist",
            });

            resolve(res);
          })
          .catch((err) => {
            if (shouldClose) {
              chrome.tabs.remove(tabId, () => {
                console.warn("Đóng tab do timeout/lỗi:", tabId);
              });
            }

            this.msgService.send("content", "background-to-content-actions", {
              data: null,
              type: "unlist",
            });

            reject(err);
          });
      };

      // Tìm tab đã có sẵn
      chrome.tabs.query({ url: `${facebookService.sellingPath}*` }, (tabs) => {
        if (tabs.length > 0 && tabs[0].id) {
          console.log("Dùng lại tab cũ:", tabs[0].id);
          // Xài lại tab, không đóng sau khi xong
          this.msgService.send("content", "background-to-content-unlist", {
            data,
          });

          this.msgService
            .waitForMessage("content-to-background-unlist", timeout)
            .then((res) => {
              console.log("Hoàn thành, giữ tab cũ:", tabs[0].id!);
              resolve(res);
            })
            .catch((err) => {
              console.warn("Lỗi khi xử lý tab cũ:", tabs[0].id!);
              reject(err);
            });
        } else {
          // Không có tab nào, tạo tab mới
          chrome.tabs.create(
            { url: facebookService.marketPath, active: false },
            (tab) => {
              if (!tab?.id) {
                reject(new Error("Không mở được tab"));
                return;
              }
              console.log("Đã mở tab mới:", tab.id);
              // Tab mới => đóng sau khi xong
              openAndSend(tab.id, true);
            }
          );
        }
      });
    });
  }

  rePublistJob(data: IPost, timeout = 30000): Promise<any> {
    return new Promise((resolve, reject) => {
      chrome.tabs.query({}, () => {
        const openAndSend = (tabId: number) => {
          // Đợi tab load xong
          const listener = (updatedTabId: number, info: any) => {
            if (updatedTabId === tabId && info.status === "complete") {
              chrome.tabs.onUpdated.removeListener(listener);

              // Gửi message xuống content
              this.msgService.send(
                "content",
                "background-to-content-re-publist",
                {
                  data,
                }
              );
            }
          };
          chrome.tabs.onUpdated.addListener(listener);

          // Chờ message phản hồi từ content
          this.msgService
            .waitForMessage("content-to-background-re-publist", timeout)
            .then((res) => {
              // ✅ Xong thì đóng tab
              chrome.tabs.remove(tabId, () => {
                console.log("Đã đóng tab:", tabId);
              });
              resolve(res);
            })
            .catch((err) => {
              // ❌ Nếu lỗi hoặc timeout thì cũng đóng tab
              chrome.tabs.remove(tabId, () => {
                console.warn("Đóng tab do timeout/lỗi:", tabId);
              });
              reject(err);
            });
        };

        // Tạo tab mới
        chrome.tabs.create({ url: facebookService.marketPath }, (tab) => {
          if (!tab?.id) {
            reject(new Error("Không mở được tab"));
            return;
          }
          console.log("Đã mở tab mới:", tab.id);
          openAndSend(tab.id);
        });
      });
    });
  }

  async createBlobUrls(payload: string[]) {
    console.log("Background nhận từ content:", payload);

    const data = [];

    for (const img of payload) {
      const response = await urlToBase64(img);
      data.push(response);
    }

    this.msgService.send(
      "content",
      "background-to-content-create-blod-urls",
      data
    );
  }
}
