import { useEffect, useState } from 'react';
import type { Socket } from 'socket.io-client';

const SOCKET_URL = import.meta.env.VITE_CORE_API || 'http://localhost:9001';
const API_KEY = import.meta.env.VITE_CORE_API_KEY as string;

export const useCampaignSocket = (campaignId?: string) => {
    const [socket, setSocket] = useState<Socket | null>(null);
    const [progress, setProgress] = useState<{ sent: number, total: number } | null>(null);
    const [generalUpdate, setGeneralUpdate] = useState<{ campaignId: string, sent: number, total: number } | null>(null);
    const [generalStatusUpdate, setGeneralStatusUpdate] = useState<{ campaignId: string, status: string } | null>(null);

    useEffect(() => {
        let activeSocket: Socket | null = null;

        const init = async () => {
            try {
                const { io } = await import('socket.io-client');
                const newSocket = io(SOCKET_URL, {
                    withCredentials: true,
                    transports: ['websocket'],
                    extraHeaders: {
                        "x-api-key": API_KEY
                    }
                });
                activeSocket = newSocket;
                setSocket(newSocket);

                newSocket.on('connect', () => {
                    if (campaignId) {
                        newSocket.emit('join_campaign', campaignId);
                    }
                });

                newSocket.on('campaign_progress', (data: { sent: number, total: number }) => {
                    setProgress(data);
                });

                newSocket.on('general_campaign_progress', (data: { campaignId: string, sent: number, total: number }) => {
                    setGeneralUpdate(data);
                    if (data.campaignId === campaignId) {
                        setProgress({ sent: data.sent, total: data.total });
                    }
                });
                newSocket.on('general_campaign_status', (data: { campaignId: string, status: string }) => {
                    setGeneralStatusUpdate(data);
                });
            } catch (error) {
                console.error('Failed to initialize socket:', error);
            }
        };

        if (typeof window !== 'undefined') {
            init();
        }

        return () => {
            if (activeSocket) {
                activeSocket.disconnect();
            }
        };
    }, [campaignId]);

    return { socket, progress, generalUpdate, generalStatusUpdate };
};
