import { io, Socket } from "socket.io-client";
import { TOKEN_NAME, BASE_URL } from "@/config/const";

export interface Message {
  id: string;
  chatId: string;
  sender: string;
  receiver: string;
  content: string;
  createdAt: string;
}

export interface UnreadMessage {
  chatId: string;
  sender: string;
  receiver: string;
  content: string;
  createdAt: string;
}

class SocketService {
  private socket: Socket | null = null;
  private eventListeners: { [key: string]: ((data: unknown) => void)[] } = {};

  constructor() {
    this.initializeEventListeners();
  }

  private initializeEventListeners() {
    this.eventListeners = {
      connect: [],
      disconnect: [],
      newMessage: [],
      unreadMessages: [],
      userOnline: [],
      userOffline: [],
      error: [],
    };
  }

  // اتصال ساده به سوکت شبیه کد تست
  connect(type: "User" | "Seller" = "User"): Promise<void> {
    return new Promise((resolve, reject) => {
      try {
        // دریافت توکن از localStorage با بررسی دقیق
        const token = localStorage.getItem(TOKEN_NAME);
        console.log(
          "🔑 توکن سوکت:",
          token ? `${token.substring(0, 20)}...` : "پیدا نشد"
        );

        if (!token || token.trim() === "") {
          console.log("❌ اتصال رد شد: توکن موجود نیست یا خالی است");
          reject(new Error("توکن یافت نشد"));
          return;
        }

        // بررسی اعتبار توکن (ساده)
        if (token.length < 10) {
          console.log("❌ اتصال رد شد: توکن نامعتبر است (خیلی کوتاه)");
          reject(new Error("توکن نامعتبر"));
          return;
        }

        // بررسی اینکه آیا توکن JWT است و expired نشده
        try {
          const payload = JSON.parse(atob(token.split(".")[1]));
          const currentTime = Math.floor(Date.now() / 1000);
          if (payload.exp && payload.exp < currentTime) {
            console.log("❌ اتصال رد شد: توکن expired است");
            reject(new Error("توکن منقضی شده"));
            return;
          }
        } catch {
          console.log("⚠️ نمی‌توان اعتبار توکن را بررسی کرد، ادامه...");
        }

        console.log("🔌 شروع اتصال سوکت به:", `${BASE_URL}/ws-chat`);

        // ایجاد اتصال سوکت دقیقاً مثل کد تست
        this.socket = io(BASE_URL, {
          path: "/ws-chat",
          query: {
            token: token.trim(), // حذف فضای خالی
            type: type,
          },
          transports: ["websocket"],
          timeout: 10000, // 10 ثانیه timeout
        });

        // تنظیم event listeners
        this.setupSocketListeners();

        // مدیریت اتصال موفق
        this.socket.on("connect", () => {
          console.log("✅ اتصال سوکت برقرار شد، socket id:", this.socket?.id);
          this.emit("connect", null);
          resolve();
        });

        // مدیریت خطای اتصال
        this.socket.on("connect_error", (err) => {
          console.error("❌ خطا در اتصال سوکت:", err.message);
          this.emit("error", err);
          reject(err);
        });

        // مدیریت قطع اتصال
        this.socket.on("disconnect", () => {
          console.log("❌ اتصال سوکت قطع شد");
          this.emit("disconnect", null);
        });
      } catch (error) {
        console.error("خطا در ایجاد اتصال سوکت:", error);
        reject(error);
      }
    });
  }

  // تنظیم event listeners برای پیام‌ها
  private setupSocketListeners() {
    if (!this.socket) return;

    // پیام جدید
    this.socket.on("newMessage", (msg) => {
      console.log("💬 پیام جدید دریافت شد:", msg);
      this.emit("newMessage", msg);
    });

    // پیام‌های خوانده نشده
    this.socket.on("unreadMessages", (messages) => {
      console.log("📨 پیام‌های خوانده نشده:", messages);
      this.emit("unreadMessages", messages);
    });

    // کاربر آنلاین
    this.socket.on("userOnline", (userId) => {
      console.log("🟢 کاربر آنلاین شد:", userId);
      this.emit("userOnline", userId);
    });

    // کاربر آفلاین
    this.socket.on("userOffline", (userId) => {
      console.log("🔴 کاربر آفلاین شد:", userId);
      this.emit("userOffline", userId);
    });

    // خطا
    this.socket.on("error", (data) => {
      console.error("⚠️ خطای سوکت:", data);
      this.emit("error", data);
    });
  }

  // ورود به چت
  joinChat(chatId: string): void {
    if (this.socket && this.socket.connected) {
      console.log("🔗 ورود به چت:", chatId);
      this.socket.emit("joinChat", chatId);
    } else {
      console.error("سوکت متصل نیست - نمی‌توان به چت وارد شد");
    }
  }

  // خروج از چت
  leaveChat(chatId: string): void {
    if (this.socket && this.socket.connected) {
      console.log("🚪 خروج از چت:", chatId);
      this.socket.emit("leaveChat", chatId);
    }
  }

  // ارسال پیام
  sendMessage(chatId: string, content: string, receiver: string): void {
    if (this.socket && this.socket.connected) {
      console.log("📤 ارسال پیام:", { chatId, content, receiver });
      this.socket.emit("newMessage", {
        chatId,
        content,
        receiver,
      });
    } else {
      console.error("سوکت متصل نیست - نمی‌توان پیام ارسال کرد");
    }
  }

  // قطع اتصال
  disconnect(): void {
    if (this.socket) {
      console.log("🔌 قطع اتصال سوکت");
      this.socket.disconnect();
      this.socket = null;
    }
  }

  // بررسی اتصال
  isConnected(): boolean {
    return this.socket?.connected || false;
  }

  // سیستم event
  on(event: string, callback: (data: unknown) => void): void {
    if (!this.eventListeners[event]) {
      this.eventListeners[event] = [];
    }
    this.eventListeners[event].push(callback);
  }

  off(event: string, callback: (data: unknown) => void): void {
    if (this.eventListeners[event]) {
      this.eventListeners[event] = this.eventListeners[event].filter(
        (cb) => cb !== callback
      );
    }
  }

  private emit(event: string, data: unknown): void {
    if (this.eventListeners[event]) {
      this.eventListeners[event].forEach((callback) => callback(data));
    }
  }
}

// ایجاد instance singleton
export const socketService = new SocketService();
