/**
 * Roozmari Academy - Student Camera Broadcaster
 * Description: Sends the student's local camera to the teacher's Grid secretly.
 */

const StudentCamBroadcaster = {
    pc: null, tid: null, sid: null, pollingInterval: null, localStream: null,
    iceCandidateQueue: [], // 1. قائمة انتظار للـ Candidates
    config: { iceServers: [{ urls: 'stun:stun.l.google.com:19302' }, { urls: 'stun:stun1.l.google.com:19302' }] },

    startBroadcast: async function(teacherId, studentId, stream) {
        this.tid = teacherId; this.sid = studentId; this.localStream = stream;
        
        if (!this.localStream) return;
        if (this.pc) this.pc.close();

        this.pc = new RTCPeerConnection(this.config);

        // إضافة كاميرا وصوت الطالب للمسار
        this.localStream.getTracks().forEach(track => {
            this.pc.addTrack(track, this.localStream);
        });

        // إرسال الـ ICE
        this.pc.onicecandidate = (event) => {
            if (event.candidate) {
                let formData = new FormData(); formData.append('candidate', JSON.stringify(event.candidate));
                fetch(`../zoom_api/waiting_room_api.php?action=save_student_cam_ice&tid=${this.tid}&sid=${this.sid}`, { method: 'POST', body: formData });
            }
        };

        // إنشاء الـ Offer الخاص بالطالب
        const offer = await this.pc.createOffer();
        await this.pc.setLocalDescription(offer);
        
        let formData = new FormData(); formData.append('offer', JSON.stringify(offer));
        await fetch(`../zoom_api/waiting_room_api.php?action=save_student_cam_offer&tid=${this.tid}&sid=${this.sid}`, { method: 'POST', body: formData });

        console.log("📤 [Student Broadcaster] تم إرسال الكاميرا لشبكة المدرس، ننتظر الموافقة...");
        this.startPolling();
    },

    startPolling: function() {
        if (this.pollingInterval) clearInterval(this.pollingInterval);
        this.pollingInterval = setInterval(async () => {
            try {
                const response = await fetch(`../zoom_api/waiting_room_api.php?action=get_teacher_answer_for_student&tid=${this.tid}&sid=${this.sid}`);
                const data = await response.json();

                // 2. معالجة الإجابة
                if (data.answer && this.pc.signalingState !== "closed" && !this.pc.currentRemoteDescription) {
                    const answerParsed = typeof data.answer === 'string' ? JSON.parse(data.answer) : data.answer;
                    await this.pc.setRemoteDescription(new RTCSessionDescription(answerParsed));
                    
                    // بعد تعيين الـ Remote، نضيف فوراً الـ Candidates المنتظرين
                    while (this.iceCandidateQueue.length > 0) {
                        await this.pc.addIceCandidate(this.iceCandidateQueue.shift());
                    }
                    console.log("✅ [Student Broadcaster] تم الربط مع المدرس.");
                }

                // 3. تخزين الـ Candidates في القائمة إذا لم يكتمل الـ RemoteDescription بعد
                if (data.teacher_ice) {
                    const candidates = JSON.parse(data.teacher_ice);
                    candidates.forEach(cand => {
                        if (this.pc.remoteDescription) {
                            this.pc.addIceCandidate(new RTCIceCandidate(cand)).catch(e => {});
                        } else {
                            this.iceCandidateQueue.push(new RTCIceCandidate(cand));
                        }
                    });
                }
            } catch (e) {}
        }, 2000); // تقليل وقت الانتظار لـ 2 ثانية لسرعة أكبر
    }, // هنا فاصلة فقط وليس إغلاق

    stopBroadcast: function() {
        if (this.pc) this.pc.close();
        if (this.pollingInterval) clearInterval(this.pollingInterval);
        this.pc = null;
        console.log("🛑 [Student Broadcaster] تم إيقاف البث لشبكة المدرس.");
    }
}; // ✅ الإغلاق النهائي للكائن يكون هنا بعد الدالة