<?php
/**
 * DeepL API ile Çeviri + TTS (Text-to-Speech) Örneği
 * 
 * Bu dosya DeepL API ile metni çevirip, TTS servisi ile seslendirir
 */

// DeepL API ayarları
define('DEEPL_API_KEY', '9610e498-fa37-45b7-9620-fbe9b5a27321:fx');
define('DEEPL_API_URL', 'https://api-free.deepl.com/v2/translate');

// TTS ayarları
define('TTS_LANG', 'en'); // Seslendirme dili
define('OUTPUT_DIR', 'audio/'); // Ses dosyalarının kaydedileceği klasör

/**
 * DeepL API ile metin çevirisi
 */
function translateWithDeepL($text, $targetLang = 'EN', $sourceLang = 'TR') {
    $url = DEEPL_API_URL;
    
    $data = [
        'auth_key' => DEEPL_API_KEY,
        'text' => $text,
        'target_lang' => $targetLang,
        'source_lang' => $sourceLang
    ];
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);
    
    if ($curlError) {
        return [
            'success' => false,
            'error' => 'cURL hatası: ' . $curlError
        ];
    }
    
    if ($httpCode === 200) {
        $result = json_decode($response, true);
        if (isset($result['translations'][0]['text'])) {
            return [
                'success' => true,
                'translated_text' => $result['translations'][0]['text'],
                'source_lang' => $result['translations'][0]['detected_source_language'] ?? $sourceLang
            ];
        }
    }
    
    return [
        'success' => false,
        'error' => 'Çeviri başarısız (HTTP ' . $httpCode . '): ' . substr($response, 0, 200)
    ];
}

/**
 * Google TTS (gTTS) ile seslendirme - API kullanarak
 * Not: gTTS Python kütüphanesi, PHP'den Python script çağırarak kullanılabilir
 */
function textToSpeechWithGoogle($text, $lang = 'en', $filename = null) {
    if ($filename === null) {
        $filename = 'tts_' . time() . '_' . rand(1000, 9999) . '.mp3';
    }
    
    // Ses dosyası klasörünü oluştur (mutlak yol kullan)
    $outputDir = __DIR__ . '/' . OUTPUT_DIR;
    if (!is_dir($outputDir)) {
        if (!mkdir($outputDir, 0755, true)) {
            return [
                'success' => false,
                'error' => 'Klasör oluşturulamadı: ' . $outputDir
            ];
        }
    }
    
    // Yazma iznini kontrol et
    if (!is_writable($outputDir)) {
        return [
            'success' => false,
            'error' => 'Klasör yazılabilir değil: ' . $outputDir . ' (İzin: ' . substr(sprintf('%o', fileperms($outputDir)), -4) . ')'
        ];
    }
    
    $filepath = $outputDir . $filename;
    
    // Google TTS API kullanarak ses oluştur
    // Not: Bu basit bir örnek, gerçek kullanımda Google Cloud TTS API kullanılmalı
    $ttsUrl = "https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=" . $lang . "&q=" . urlencode($text);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $ttsUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    
    $audioData = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);
    
    if ($curlError) {
        return [
            'success' => false,
            'error' => 'cURL hatası: ' . $curlError
        ];
    }
    
    if ($httpCode === 200 && !empty($audioData) && strlen($audioData) > 100) {
        $written = file_put_contents($filepath, $audioData);
        if ($written === false) {
            return [
                'success' => false,
                'error' => 'Dosya yazılamadı: ' . $filepath
            ];
        }
        return [
            'success' => true,
            'filepath' => OUTPUT_DIR . $filename,
            'filename' => $filename
        ];
    }
    
    return [
        'success' => false,
        'error' => 'Seslendirme başarısız (HTTP ' . $httpCode . ', Veri boyutu: ' . strlen($audioData) . ')'
    ];
}

/**
 * Alternatif: pyttsx3 kullanarak (Python script çağırma)
 */
function textToSpeechWithPython($text, $lang = 'en', $filename = null) {
    if ($filename === null) {
        $filename = 'tts_' . time() . '.mp3';
    }
    
    if (!is_dir(OUTPUT_DIR)) {
        mkdir(OUTPUT_DIR, 0755, true);
    }
    
    $filepath = OUTPUT_DIR . $filename;
    
    // Python script oluştur
    $pythonScript = "import pyttsx3\n";
    $pythonScript .= "engine = pyttsx3.init()\n";
    $pythonScript .= "engine.save_to_file('" . addslashes($text) . "', '" . addslashes($filepath) . "')\n";
    $pythonScript .= "engine.runAndWait()\n";
    
    $scriptFile = 'temp_tts_' . time() . '.py';
    file_put_contents($scriptFile, $pythonScript);
    
    // Python script'i çalıştır
    exec("python " . escapeshellarg($scriptFile) . " 2>&1", $output, $returnCode);
    unlink($scriptFile);
    
    if ($returnCode === 0 && file_exists($filepath)) {
        return [
            'success' => true,
            'filepath' => $filepath,
            'filename' => $filename
        ];
    }
    
    return [
        'success' => false,
        'error' => 'Python TTS başarısız: ' . implode("\n", $output)
    ];
}

/**
 * Ana fonksiyon: Çeviri + TTS
 */
function translateAndSpeak($text, $sourceLang = 'TR', $targetLang = 'EN', $ttsLang = 'en') {
    // 1. DeepL ile çeviri
    $translation = translateWithDeepL($text, $targetLang, $sourceLang);
    
    if (!$translation['success']) {
        return $translation;
    }
    
    $translatedText = $translation['translated_text'];
    
    // 2. TTS ile seslendirme
    $ttsResult = textToSpeechWithGoogle($translatedText, $ttsLang);
    
    if (!$ttsResult['success']) {
        // Alternatif olarak Python TTS dene
       // $ttsResult = textToSpeechWithPython($translatedText, $ttsLang);
    }
    
    // Ses dosyası URL'sini oluştur (server için mutlak URL)
    $audioUrl = null;
    $audioFile = null;
    
    if (isset($ttsResult['filepath']) && $ttsResult['filepath']) {
        // Göreli yol
        $audioFile = $ttsResult['filepath'];
        
        // Server'da mutlak URL oluştur
        $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
        $host = $_SERVER['HTTP_HOST'] ?? '';
        
        // Script path'i al
        $scriptPath = dirname($_SERVER['SCRIPT_NAME'] ?? '');
        if ($scriptPath === '/' || $scriptPath === '\\' || $scriptPath === '.') {
            $scriptPath = '';
        } else {
            $scriptPath = rtrim($scriptPath, '/');
        }
        
        // Ses dosyası yolunu temizle
        $audioPath = ltrim($audioFile, '/');
        
        // Mutlak URL oluştur
        $audioUrl = $protocol . '://' . $host . $scriptPath . '/' . $audioPath;
    }
    
    return [
        'success' => true,
        'original_text' => $text,
        'translated_text' => $translatedText,
        'audio_file' => $audioFile,
        'audio_url' => $audioUrl,
        'audio_filename' => $ttsResult['filename'] ?? null
    ];
}

// Kullanım örneği
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Hata ayıklama modu (server'da false yapın)
    $debug = false;
    
    if ($debug) {
        error_reporting(E_ALL);
        ini_set('display_errors', 1);
    }
    
    header('Content-Type: application/json');
    
    $text = $_POST['text'] ?? '';
    $sourceLang = $_POST['source_lang'] ?? 'TR';
    $targetLang = $_POST['target_lang'] ?? 'EN';
    
    // Hedef dili TTS dili olarak kullan (DeepL kodlarını TTS kodlarına çevir)
    $ttsLangMap = [
        'EN' => 'en', 'EN-US' => 'en', 'EN-GB' => 'en',
        'TR' => 'tr',
        'DE' => 'de',
        'FR' => 'fr',
        'ES' => 'es',
        'IT' => 'it',
        'PT' => 'pt', 'PT-BR' => 'pt', 'PT-PT' => 'pt',
        'RU' => 'ru',
        'JA' => 'ja',
        'ZH' => 'zh',
        'KO' => 'ko',
        'NL' => 'nl',
        'PL' => 'pl',
        'SV' => 'sv',
        'DA' => 'da',
        'NO' => 'no',
        'FI' => 'fi',
        'EL' => 'el',
        'CS' => 'cs',
        'RO' => 'ro',
        'HU' => 'hu',
        'BG' => 'bg',
        'HR' => 'hr',
        'SK' => 'sk',
        'SL' => 'sl',
        'ET' => 'et',
        'LV' => 'lv',
        'LT' => 'lt',
        'UK' => 'uk',
        'ID' => 'id',
        'AR' => 'ar',
        'NB' => 'no'
    ];
    
    $ttsLang = $ttsLangMap[strtoupper($targetLang)] ?? 'en';
    
    if (empty($text)) {
        echo json_encode([
            'success' => false,
            'error' => 'Metin boş olamaz'
        ]);
        exit;
    }
    
    try {
        $result = translateAndSpeak($text, $sourceLang, $targetLang, $ttsLang);
        
        // Debug bilgisi ekle (sadece debug modunda)
        if ($debug && !$result['success']) {
            $result['debug'] = [
                'text' => $text,
                'source_lang' => $sourceLang,
                'target_lang' => $targetLang,
                'tts_lang' => $ttsLang,
                'output_dir' => __DIR__ . '/' . OUTPUT_DIR,
                'output_dir_exists' => is_dir(__DIR__ . '/' . OUTPUT_DIR),
                'output_dir_writable' => is_writable(__DIR__ . '/' . OUTPUT_DIR),
                'curl_available' => function_exists('curl_init')
            ];
        }
        
        echo json_encode($result);
    } catch (Exception $e) {
        echo json_encode([
            'success' => false,
            'error' => 'Beklenmeyen hata: ' . ($debug ? $e->getMessage() : 'Sunucu hatası')
        ]);
    }
    exit;
}

?>
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>DeepL API + TTS - PHP Örneği</title>
    <!-- PeerJS Kütüphanesi (WebRTC için) -->
    <script src="https://unpkg.com/peerjs@1.5.2/dist/peerjs.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 50px auto;
            padding: 20px;
            background: #f5f5f5;
        }
        .container {
            background: white;
            padding: 30px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        h1 {
            color: #333;
            margin-bottom: 20px;
        }
        .form-group {
            margin-bottom: 20px;
        }
        label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
            color: #555;
        }
        textarea {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            font-size: 14px;
            min-height: 100px;
            box-sizing: border-box;
        }
        select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            font-size: 14px;
        }
        button {
            background: #4CAF50;
            color: white;
            padding: 12px 24px;
            border: none;
            border-radius: 4px;
            font-size: 16px;
            cursor: pointer;
            width: 100%;
        }
        button:hover {
            background: #45a049;
        }
        
        #syncLanguageBtn {
            display: none; /* Başlangıçta gizli */
            margin-bottom: 10px;
        }
        
        #syncLanguageBtn:hover {
            background: #1976D2 !important;
        }
        
        #translateForm.hidden {
            display: none;
        }
        .result {
            margin-top: 20px;
            padding: 15px;
            background: #e8f5e9;
            border-radius: 4px;
            display: none;
        }
        .error {
            background: #ffebee;
            color: #c62828;
        }
        .success {
            background: #e8f5e9;
            color: #2e7d32;
        }
        audio {
            width: 100%;
            margin-top: 10px;
        }
        .loading {
            display: none;
            text-align: center;
            padding: 20px;
        }
        .speech-input {
            position: relative;
            display: block;
        }
        .mic-button {
            background: #f44336;
            color: white;
            border: 2px solid white;
            border-radius: 50%;
            width: 50px;
            height: 50px;
            cursor: pointer;
            display: flex !important;
            align-items: center;
            justify-content: center;
            font-size: 24px;
            transition: all 0.3s;
            z-index: 100;
            box-shadow: 0 2px 8px rgba(0,0,0,0.3);
            flex-shrink: 0;
        }
        .mic-button:hover {
            background: #d32f2f;
            transform: scale(1.1);
        }
        .mic-button.recording {
            background: #ff5722;
            animation: pulse 1.5s infinite;
        }
        @keyframes pulse {
            0%, 100% { opacity: 1; }
            50% { opacity: 0.5; }
        }
        .speech-status {
            margin-top: 5px;
            font-size: 12px;
            color: #666;
            display: none;
        }
        .speech-status.active {
            display: block;
            color: #f44336;
        }
        .webcam-container {
            margin-bottom: 20px;
            padding: 20px;
            background: #e3f2fd;
            border-radius: 8px;
            border: 2px solid #2196F3;
        }
        .webcam-container:not(.active) {
            display: none;
        }
        .webcam-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 15px;
        }
   
        .webcam-header h3 {
            margin: 0;
            color: #333;
        }
        .webcam-toggle {
            background: #2196F3;
            color: white;
            border: none;
            padding: 8px 16px;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
        }
        .webcam-toggle:hover {
            background: #1976D2;
        }
        .webcam-toggle.active {
            background: #f44336;
        }
        .webcam-toggle.active:hover {
            background: #d32f2f;
        }
        .video-grid {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 15px;
            margin-bottom: 15px;
        }
        @media (max-width: 768px) {
            .video-grid {
                grid-template-columns: 1fr;
            }
            .peer-id-display>span  {
                display: none;
            }
            .connect-form {
                flex-direction: column;
            }
            .connect-form input {
                width: 100%;
            }
            .connect-form button {
                width: 100% !important;
            }
            /* Otomatik çeviri butonları mobilde alt alta */
            #autoTranslationPanel > div:first-child {
                flex-direction: column !important;
            }
            #autoTranslationPanel > div:first-child > div {
                width: 100%;
            }
            #autoTranslationPanel button {
                width: 100%;
                margin-bottom: 5px;
            }
        }
        .video-box {
            background: #000;
            border-radius: 8px;
            overflow: hidden;
            position: relative;
        }
        .video-box video {
            width: 100%;
            height: auto;
            display: block;
            min-height: 200px;
            object-fit: cover;
        }
        .video-box.local video {
            transform: scaleX(-1);
        }
        .video-label {
            position: absolute;
            bottom: 10px;
            left: 10px;
            background: rgba(0,0,0,0.7);
            color: white;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 12px;
        }
        .video-placeholder {
            width: 100%;
            min-height: 200px;
            display: flex;
            align-items: center;
            justify-content: center;
            color: #666;
            font-size: 14px;
            background: #1a1a1a;
        }
        .connection-panel {
            background: #fff;
            padding: 15px;
            border-radius: 8px;
            margin-bottom: 15px;
        }
        .connection-panel.hidden {
            display: none;
        }
        .connection-panel h4 {
            margin: 0 0 10px 0;
            color: #333;
        }
        .peer-id-display {
            background: #f5f5f5;
            padding: 10px;
            border-radius: 4px;
            margin-bottom: 10px;
            display: flex;
            align-items: center;
            gap: 10px;
        }
        .peer-id-display code {
            background: #e0e0e0;
            padding: 5px 10px;
            border-radius: 4px;
            font-family: monospace;
            font-size: 14px;
            flex: 1;
            word-break: break-all;
        }
        .peer-id-display button {
            padding: 5px 10px;
            font-size: 12px;
            width: auto;
        }
        .connect-form {
            display: flex;
            gap: 10px;
        }
        .connect-form input {
            flex: 1;
            padding: 10px;
            border: 2px solid #ddd;
            border-radius: 4px;
            font-size: 14px;
        }
        .connect-form button {
            padding: 10px 20px;
            width: auto;
        }
        .webcam-controls {
            display: flex;
            justify-content: center;
            gap: 10px;
            margin-top: 15px;
            flex-wrap: wrap;
        }
        .webcam-btn {
            padding: 8px 16px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
            background: #4CAF50;
            color: white;
        }
        .webcam-btn:hover {
            background: #45a049;
        }
        .webcam-btn.danger {
            background: #f44336;
        }
        .webcam-btn.danger:hover {
            background: #d32f2f;
        }
        .webcam-btn:disabled {
            background: #ccc;
            cursor: not-allowed;
        }
        #webcamCanvas {
            max-width: 100%;
            border-radius: 8px;
            margin-top: 15px;
            display: none;
        }
        .webcam-status {
            text-align: center;
            padding: 10px;
            margin-top: 10px;
            border-radius: 4px;
            font-size: 14px;
        }
        .webcam-status.success {
            background: #d4edda;
            color: #155724;
        }
        .webcam-status.error {
            background: #f8d7da;
            color: #721c24;
        }
        .webcam-status.info {
            background: #d1ecf1;
            color: #0c5460;
        }
        .connection-status {
            display: inline-block;
            width: 10px;
            height: 10px;
            border-radius: 50%;
            margin-right: 5px;
        }
        .connection-status.connected {
            background: #4CAF50;
        }
        .connection-status.disconnected {
            background: #f44336;
        }
        .connection-status.connecting {
            background: #ff9800;
            animation: blink 1s infinite;
        }
        @keyframes blink {
            0%, 100% { opacity: 1; }
            50% { opacity: 0.5; }
        }
        @keyframes fadeIn {
            from { opacity: 0; transform: translateY(-10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        @keyframes fadeOut {
            from { opacity: 1; transform: translateY(0); }
            to { opacity: 0; transform: translateY(-10px); }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🌍 DeepL API + TTS (Text-to-Speech)</h1>
        <p>Metni çevirip sesli olarak dinleyin</p>
        <div style="background: #e3f2fd; padding: 15px; border-radius: 4px; margin-bottom: 15px; border-left: 4px solid #2196F3;">
            <strong>🌐 Video Konferans + Otomatik Çeviri</strong><br>
            <div id="translationInfo" style="display: none; margin-top: 10px; padding: 8px; background: #fff; border-radius: 4px; font-size: 14px;">
                <strong>🔄 Çeviri Yönü:</strong> <span id="translationDirection">-</span>
            </div>
        </div>
        
        <!-- Video Görüşme Bölümü - Üstte -->
        <div class="webcam-container active" id="webcamContainer" style="margin-bottom: 20px;">
            <div class="webcam-header">
                <h3>📹 Video Görüşme</h3>
                <button type="button" class="webcam-toggle active" id="webcamToggle" onclick="toggleWebcam()">
                    ❌ Kapat
                </button>
            </div>
            
            <!-- Bağlantı Paneli -->
            <div class="connection-panel">
                <h4><span class="connection-status disconnected" id="connectionStatus"></span> Bağlantı Durumu</h4>
                
                <div class="peer-id-display">
                    <span>Sizin ID'niz:</span>
                    <code id="myPeerId">Bağlanıyor...</code>
                </div>
                <div class="peer-id-display">
                    <button type="button" class="webcam-btn" onclick="copyPeerId()">📋 ID Kopyala</button>
                    <button type="button" class="webcam-btn" onclick="createInviteLink()" style="background: #FF9800;">🔗 Link Oluştur</button>
                </div>

                <div class="connect-form">
                    <input type="text" id="remotePeerId" placeholder="Uzak bilgisayarın ID'sini girin...">
                    <button type="button" class="webcam-btn" id="connectBtn" onclick="connectToPeer()">🔗 Bağlan</button>
                    <button type="button" class="webcam-btn danger" id="disconnectBtn" onclick="disconnectPeer()" style="display:none;">❌ Bağlantıyı Kes</button>
                </div>
            </div>
            
            <!-- Video Grid - İki Kamera -->
            <div class="video-grid">
                <div class="video-box local">
                    <video id="localVideo" autoplay playsinline muted></video>
                    <div class="video-label">📹 Ben (Yerel)</div>
                    <div class="video-placeholder" id="localPlaceholder">Kamera başlatılmadı</div>
                </div>
                <div class="video-box remote">
                    <video id="remoteVideo" autoplay playsinline></video>
                    <div class="video-label">👤 Uzak Bilgisayar</div>
                    <div class="video-placeholder" id="remotePlaceholder">Bağlantı bekleniyor...</div>
                </div>
            </div>
            
            <!-- Kontroller -->
            <div class="webcam-controls">
                <button type="button" class="webcam-btn" id="webcamStartBtn" onclick="startLocalWebcam()">📹 Kameramı Başlat</button>
                <button type="button" class="webcam-btn" id="webcamStopBtn" onclick="stopLocalWebcam()" disabled>⏹ Kameramı Durdur</button>
                <button type="button" class="webcam-btn" id="webcamCaptureBtn" onclick="captureWebcamPhoto()" disabled>📸 Ekran Görüntüsü</button>
            </div>
            
            <div id="webcamStatus" class="webcam-status"></div>
            <canvas id="webcamCanvas"></canvas>
        </div>
        
        <!-- Otomatik Çeviri Kontrol Paneli -->
        <div id="autoTranslationPanel" style="display:none; margin-bottom:20px; padding:15px; background:#e8f5e9; border-radius:8px; border:2px solid #4CAF50;">
            <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:10px;">
                <h3 style="margin:0; color:#2e7d32;">🌐 Otomatik Eşzamanlı Çeviri</h3>
                <div style="display:flex; gap:10px;">
                    <button type="button" id="repeatLastTranslation" class="webcam-btn" onclick="repeatLastTranslation()" style="background:#2196F3;" disabled>
                        🔁 Son Çeviriyi Tekrar Çal
                    </button>
                    <button type="button" id="autoTranslationToggle" class="webcam-btn" onclick="toggleAutoTranslation()" style="background:#4CAF50;">
                        ▶️ Başlat
                    </button>
                </div>
            </div>
            <div id="autoTranslationStatus" style="padding:10px; background:#fff; border-radius:4px; font-size:14px; color:#666;">
                ⚠️ Hazır. "Başlat" butonuna basın ve konuşun. Her konuşmanız otomatik çevrilip karşı tarafa gönderilecek.
            </div>
            <div id="lastTranslationInfo" style="margin-top:10px; padding:10px; background:#fff; border-radius:4px; font-size:13px; display:none;">
                <strong>Son Çeviri:</strong> <span id="lastTranslationText"></span>
            </div>
            <div id="autoTranslationLog" style="margin-top:10px; padding:10px; background:#fff; border-radius:4px; max-height:150px; overflow-y:auto; font-size:12px; font-family:monospace; display:none;">
            </div>
        </div>
        
        <form id="translateForm">
            <div class="form-group">
                <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px;">
                    <label for="text" style="margin: 0;">Çevrilecek Metin:</label>
                    <button type="button" id="micButton" class="mic-button" title="Konuşmayı algıla">
                        🎤
                    </button>
                </div>
                <div class="speech-input">
                    <textarea id="text" name="text" placeholder="Örn: Merhaba, nasılsınız? (veya mikrofon butonuna tıklayarak konuşun)" required></textarea>
                </div>
                <div id="speechStatus" class="speech-status"></div>
            </div>
            
            <div class="form-group">
                <label for="source_lang">Kaynak Dil:</label>
                <select id="source_lang" name="source_lang">
                    <option value="TR">Türkçe</option>
                    <option value="EN">İngilizce</option>
                    <option value="DE">Almanca</option>
                    <option value="FR">Fransızca</option>
                    <option value="ES">İspanyolca</option>
                    <option value="IT">İtalyanca</option>
                    <option value="PT">Portekizce</option>
                    <option value="RU">Rusça</option>
                    <option value="JA">Japonca</option>
                    <option value="ZH">Çince</option>
                    <option value="KO">Korece</option>
                    <option value="NL">Felemenkçe</option>
                    <option value="PL">Lehçe</option>
                    <option value="SV">İsveççe</option>
                    <option value="DA">Danca</option>
                    <option value="NO">Norveççe</option>
                    <option value="FI">Fince</option>
                    <option value="EL">Yunanca</option>
                    <option value="CS">Çekçe</option>
                    <option value="RO">Rumence</option>
                    <option value="HU">Macarca</option>
                    <option value="BG">Bulgarca</option>
                    <option value="HR">Hırvatça</option>
                    <option value="SK">Slovakça</option>
                    <option value="SL">Slovence</option>
                    <option value="ET">Estonca</option>
                    <option value="LV">Letonca</option>
                    <option value="LT">Litvanca</option>
                    <option value="UK">Ukraynaca</option>
                </select>
            </div>
            
            <div class="form-group">
                <label for="target_lang">Hedef Dil:</label>
                <select id="target_lang" name="target_lang">
                    <option value="EN">İngilizce</option>
                    <option value="TR">Türkçe</option>
                    <option value="DE">Almanca</option>
                    <option value="FR">Fransızca</option>
                    <option value="ES">İspanyolca</option>
                    <option value="IT">İtalyanca</option>
                    <option value="PT">Portekizce</option>
                    <option value="RU">Rusça</option>
                    <option value="JA">Japonca</option>
                    <option value="ZH">Çince</option>
                    <option value="KO">Korece</option>
                    <option value="NL">Felemenkçe</option>
                    <option value="PL">Lehçe</option>
                    <option value="SV">İsveççe</option>
                    <option value="DA">Danca</option>
                    <option value="NO">Norveççe</option>
                    <option value="FI">Fince</option>
                    <option value="EL">Yunanca</option>
                    <option value="CS">Çekçe</option>
                    <option value="RO">Rumence</option>
                    <option value="HU">Macarca</option>
                    <option value="BG">Bulgarca</option>
                    <option value="HR">Hırvatça</option>
                    <option value="SK">Slovakça</option>
                    <option value="SL">Slovence</option>
                    <option value="ET">Estonca</option>
                    <option value="LV">Letonca</option>
                    <option value="LT">Litvanca</option>
                    <option value="UK">Ukraynaca</option>
                </select>
            </div>
            
            <div class="form-group">
                <button type="button" id="syncLanguageBtn" onclick="syncLanguageToRemote()" style="background: #2196F3; width: 100%;">
                    🔄 Dil Ayarlarını Karşı Tarafa Gönder
                </button>
                <small style="color: #666; font-size: 12px; display: block; margin-top: 5px;">
                    Bu butona basınca seçtiğiniz diller karşı tarafa ters olarak ayarlanır
                </small>
            </div>
            
            <button type="submit">Çevir ve Seslendir</button>
        </form>
        
        <div class="loading" id="loading">
            <p>Çeviriliyor ve seslendiriliyor...</p>
        </div>
        
        <div class="result" id="result"></div>
    </div>
    
    <script>
        // Speech Recognition (Konuşmayı Metne Çevirme)
        let recognition = null;
        let isRecording = false;
		var ceviri_cevap='';
		
		// ==================== VIDEO GÖRÜŞME (WebRTC/PeerJS) ====================
		let peer = null;
		let localStream = null; // Video + normal mikrofon
		let translationStream = null; // Sadece çeviri sesi için ayrı stream
		let currentCall = null;
		let myPeerId = null;
		let dataConnection = null; // Senkronizasyon için data channel
		let isAutoConnectFromLink = false; // Link ile otomatik bağlantı yapıldı mı?
		
		// Dil kodu -> Dil ismi mapping
		const languageNames = {
			'TR': 'Türkçe',
			'EN': 'İngilizce',
			'EN-US': 'İngilizce (ABD)',
			'EN-GB': 'İngilizce (UK)',
			'DE': 'Almanca',
			'FR': 'Fransızca',
			'ES': 'İspanyolca',
			'IT': 'İtalyanca',
			'PT': 'Portekizce',
			'PT-BR': 'Portekizce (Brezilya)',
			'PT-PT': 'Portekizce (Portekiz)',
			'RU': 'Rusça',
			'JA': 'Japonca',
			'ZH': 'Çince',
			'KO': 'Korece',
			'NL': 'Felemenkçe',
			'PL': 'Lehçe',
			'SV': 'İsveççe',
			'DA': 'Danca',
			'NO': 'Norveççe',
			'FI': 'Fince',
			'EL': 'Yunanca',
			'CS': 'Çekçe',
			'RO': 'Rumence',
			'HU': 'Macarca',
			'BG': 'Bulgarca',
			'SK': 'Slovakça',
			'SL': 'Slovence',
			'ET': 'Estonca',
			'LV': 'Letonca',
			'LT': 'Litvanca',
			'UK': 'Ukraynaca',
			'ID': 'Endonezce',
			'AR': 'Arapça',
			'NB': 'Norveççe'
		};
		
		// Audio Context
		let audioContext = null;
		let audioDestination = null;
		
		// Otomatik Çeviri Modu
		let autoTranslationMode = false;
		let autoTranslationActive = false;
		let lastTranslationTime = 0;
		let translationCooldown = 2000; // Çeviriler arası minimum 2 saniye
		let lastTranslationData = {
			audioUrl: null,
			originalText: '',
			translatedText: ''
		};
		
		// DOM Elementleri
		const localVideo = document.getElementById('localVideo');
		const remoteVideo = document.getElementById('remoteVideo');
		const localPlaceholder = document.getElementById('localPlaceholder');
		const remotePlaceholder = document.getElementById('remotePlaceholder');
		const webcamCanvas = document.getElementById('webcamCanvas');
		const webcamCtx = webcamCanvas.getContext('2d');
		
		// PeerJS başlat
		function initializePeer() {
			// Benzersiz ID oluştur
			const randomId = 'user_' + Math.random().toString(36).substr(2, 9);
			
			peer = new Peer(randomId, {
				debug: 2
			});
			
			peer.on('open', function(id) {
				myPeerId = id;
				document.getElementById('myPeerId').textContent = id;
				updateConnectionStatus('disconnected');
				updateWebcamStatus('Peer bağlantısı hazır. ID\'nizi paylaşın veya uzak ID girin.', 'info');
			});
			
		// Gelen data connection (senkronizasyon mesajları)
		peer.on('connection', function(conn) {
			console.log('📨 Gelen data connection:', conn.peer);
			dataConnection = conn;
			
			conn.on('open', function() {
				console.log('✅ Data connection açıldı (gelen)');
				
				// Kendi peer ID'sini karşı tarafa gönder
				if (myPeerId) {
					setTimeout(() => {
						sendSyncMessage({
							type: 'myPeerId',
							peerId: myPeerId
						});
						console.log('📤 Kendi peer ID gönderildi:', myPeerId);
					}, 500);
				}
			});
			
			conn.on('data', function(data) {
				console.log('📩 Mesaj alındı:', data);
				handleSyncMessage(data);
			});
			
			conn.on('close', function() {
				console.log('📪 Data connection kapandı');
				dataConnection = null;
			});
		});
		
		peer.on('call', function(call) {
			// Gelen aramayı kanal tipine göre ayır
			const channelType = call.metadata?.channel || 'main';
			
			if (channelType === 'main') {
				// Ana kanal (Video + Normal Mikrofon)
				updateWebcamStatus('Gelen bağlantı (Ana Kanal)... Kameranız açılıyor.', 'info');
				
				startLocalWebcam().then(() => {
					call.answer(localStream);
					handleMainCall(call);
					
					if (!currentCall) {
						currentCall = { main: call };
					} else {
						currentCall.main = call;
					}
				}).catch(err => {
					updateWebcamStatus('Kamera açılamadı: ' + err.message, 'error');
				});
			} else if (channelType === 'translation') {
				// Çeviri kanalı
				updateWebcamStatus('Gelen bağlantı (Çeviri Kanalı)...', 'info');
				
				// Çeviri stream'ini oluştur
				if (!translationStream) {
					if (!audioContext) {
						audioContext = new (window.AudioContext || window.webkitAudioContext)();
					}
					
					// AudioContext'i başlat
					if (audioContext.state === 'suspended') {
						audioContext.resume();
					}
					
					// Sessiz oscillator ile başlat
					const oscillator = audioContext.createOscillator();
					const gainNode = audioContext.createGain();
					audioDestination = audioContext.createMediaStreamDestination();
					
					oscillator.connect(gainNode);
					gainNode.connect(audioDestination);
					
					gainNode.gain.value = 0.0001;
					oscillator.frequency.value = 20;
					oscillator.start();
					
					translationStream = audioDestination.stream;
					console.log('Çeviri stream oluşturuldu (gelen arama):', translationStream.getAudioTracks());
				}
				
				call.answer(translationStream);
				handleTranslationCall(call);
				
				if (!currentCall) {
					currentCall = { translation: call };
				} else {
					currentCall.translation = call;
				}
			}
		});
			
			peer.on('error', function(err) {
				console.error('Peer hatası:', err);
				updateWebcamStatus('Bağlantı hatası: ' + err.type, 'error');
				updateConnectionStatus('disconnected');
			});
			
			peer.on('disconnected', function() {
				updateConnectionStatus('disconnected');
				updateWebcamStatus('Bağlantı kesildi.', 'error');
			});
		}
		
		// Bağlantı durumunu güncelle
		function updateConnectionStatus(status) {
			const statusEl = document.getElementById('connectionStatus');
			statusEl.className = 'connection-status ' + status;
			
			const connectBtn = document.getElementById('connectBtn');
			const disconnectBtn = document.getElementById('disconnectBtn');
			const syncLanguageBtn = document.getElementById('syncLanguageBtn');
			
			if (status === 'connected') {
				connectBtn.style.display = 'none';
				disconnectBtn.style.display = 'inline-block';
				if (syncLanguageBtn) syncLanguageBtn.style.display = 'block';
			} else {
				connectBtn.style.display = 'inline-block';
				disconnectBtn.style.display = 'none';
				if (syncLanguageBtn) syncLanguageBtn.style.display = 'none';
			}
		}
		
		// Yerel webcam başlat
		async function startLocalWebcam() {
			try {
				const constraints = {
					video: {
						width: { ideal: 640 },
						height: { ideal: 480 },
						facingMode: 'user'
					},
					audio: true
				};
				
				// Video + normal mikrofon stream'ini al
				localStream = await navigator.mediaDevices.getUserMedia(constraints);
				localVideo.srcObject = localStream;
				localPlaceholder.style.display = 'none';
				localVideo.style.display = 'block';
				
				webcamCanvas.width = 640;
				webcamCanvas.height = 480;
				
				// AudioContext oluştur (çeviri sesi için)
				if (!audioContext) {
					audioContext = new (window.AudioContext || window.webkitAudioContext)();
				}
				
				// AudioContext'i başlat
				if (audioContext.state === 'suspended') {
					await audioContext.resume();
				}
				
				// Çeviri sesi için ayrı bir sessiz MediaStream oluştur
				const oscillator = audioContext.createOscillator();
				const gainNode = audioContext.createGain();
				audioDestination = audioContext.createMediaStreamDestination();
				
				oscillator.connect(gainNode);
				gainNode.connect(audioDestination);
				
				// Çok sessiz yap (tamamen 0 yapma, stream kapanabilir)
				gainNode.gain.value = 0.0001;
				oscillator.frequency.value = 20;
				
				oscillator.start();
				
				translationStream = audioDestination.stream;
				
				console.log('Video görüşme başlatıldı - Normal ses kanalı: aktif, Çeviri ses kanalı: hazır');
				console.log('Çeviri stream tracks:', translationStream.getAudioTracks());
				
				document.getElementById('webcamStartBtn').disabled = true;
				document.getElementById('webcamStopBtn').disabled = false;
				document.getElementById('webcamCaptureBtn').disabled = false;
				
				updateWebcamStatus('Kameranız başlatıldı! (2 ses kanalı: Normal + Çeviri)', 'success');
				
				return localStream;
				
			} catch (error) {
				console.error('Webcam hatası:', error);
				let errorMsg = 'Webcam başlatılamadı. ';
				
				if (error.name === 'NotAllowedError') {
					errorMsg += 'Lütfen kamera ve mikrofon izni verin.';
				} else if (error.name === 'NotFoundError') {
					errorMsg += 'Webcam bulunamadı.';
				} else if (error.name === 'NotReadableError') {
					errorMsg += 'Webcam başka bir uygulama tarafından kullanılıyor.';
				} else {
					errorMsg += error.message;
				}
				
				updateWebcamStatus(errorMsg, 'error');
				throw error;
			}
		}
		
		// Yerel webcam durdur
		function stopLocalWebcam() {
			if (localStream) {
				localStream.getTracks().forEach(track => track.stop());
				localStream = null;
				localVideo.srcObject = null;
				localVideo.style.display = 'none';
				localPlaceholder.style.display = 'flex';
				
				// Çeviri stream'ini de temizle
				if (translationStream) {
					translationStream.getTracks().forEach(track => track.stop());
					translationStream = null;
				}
				
				// AudioContext'i duraklat
				if (audioContext && audioContext.state === 'running') {
					audioContext.suspend();
				}
				
				document.getElementById('webcamStartBtn').disabled = false;
				document.getElementById('webcamStopBtn').disabled = true;
				document.getElementById('webcamCaptureBtn').disabled = true;
				
				updateWebcamStatus('Kameranız durduruldu (Her iki kanal kapatıldı).', 'info');
			}
		}
		
		// Uzak peer'a bağlan
		async function connectToPeer() {
			const remotePeerId = document.getElementById('remotePeerId').value.trim();
			
			if (!remotePeerId) {
				updateWebcamStatus('Lütfen uzak bilgisayarın ID\'sini girin!', 'error');
				return;
			}
			
			if (remotePeerId === myPeerId) {
				updateWebcamStatus('Kendi ID\'nize bağlanamazsınız!', 'error');
				return;
			}
			
			updateConnectionStatus('connecting');
			updateWebcamStatus('Bağlanıyor...', 'info');
			
			try {
				// Önce kamerayı başlat
				if (!localStream) {
					await startLocalWebcam();
				}
				
				// Video + normal mikrofon kanalı için bağlantı (ana kanal)
				const mainCall = peer.call(remotePeerId, localStream, {
					metadata: { channel: 'main' }
				});
				
				// Çeviri sesi için ayrı bağlantı (çeviri kanalı)
				const translationCall = peer.call(remotePeerId, translationStream, {
					metadata: { channel: 'translation' }
				});
				
				// Ana kanalı işle (video + normal mikrofon)
				handleMainCall(mainCall);
				
				// Çeviri kanalını işle
				handleTranslationCall(translationCall);
				
				// Her iki bağlantıyı sakla
				currentCall = {
					main: mainCall,
					translation: translationCall
				};
				
				// Data connection aç (senkronizasyon için)
				dataConnection = peer.connect(remotePeerId);
				
				dataConnection.on('open', function() {
					console.log('✅ Data connection açıldı (giden)');
					
					// Kendi peer ID'sini karşı tarafa gönder
					if (myPeerId) {
						setTimeout(() => {
							sendSyncMessage({
								type: 'myPeerId',
								peerId: myPeerId
							});
							console.log('📤 Kendi peer ID gönderildi:', myPeerId);
						}, 500);
					}
				});
				
				dataConnection.on('data', function(data) {
					console.log('📩 Mesaj alındı:', data);
					handleSyncMessage(data);
				});
				
				dataConnection.on('close', function() {
					console.log('📪 Data connection kapandı');
					dataConnection = null;
				});
				
				console.log('İki kanal + Data channel bağlantı kuruldu');
				
			} catch (error) {
				updateWebcamStatus('Bağlantı hatası: ' + error.message, 'error');
				updateConnectionStatus('disconnected');
			}
		}
		
		// Ana kanal işleyici (Video + Normal Mikrofon)
		function handleMainCall(call) {
			call.on('stream', function(remoteStream) {
				// Video ve normal konuşma ses stream'i
				remoteVideo.srcObject = remoteStream;
				remoteVideo.style.display = 'block';
				remotePlaceholder.style.display = 'none';
				updateConnectionStatus('connected');
				updateWebcamStatus('Ana kanal bağlandı! (Video + Normal Ses)', 'success');
				console.log('Ana kanal aktif: Video + Normal Mikrofon');
				
				// Otomatik çeviri panelini göster
				document.getElementById('autoTranslationPanel').style.display = 'block';
				
				// Eğer link ile otomatik bağlantı yapıldıysa, connection panel'i ve formu gizle
				if (isAutoConnectFromLink) {
					const connectionPanel = document.querySelector('.connection-panel');
					if (connectionPanel) {
						connectionPanel.classList.add('hidden');
						console.log('🔒 Connection panel gizlendi (link ile otomatik bağlantı)');
					}
					
					// Çeviri formunu gizle
					const translateForm = document.getElementById('translateForm');
					if (translateForm) {
						translateForm.classList.add('hidden');
						console.log('🔒 Çeviri formu gizlendi (link ile otomatik bağlantı)');
					}
					
					// Çeviri yönü bilgisini göster
					updateTranslationInfo();
				}
			});
			
			call.on('close', function() {
				remoteVideo.srcObject = null;
				remoteVideo.style.display = 'none';
				remotePlaceholder.style.display = 'flex';
				updateConnectionStatus('disconnected');
				updateWebcamStatus('Ana kanal kapandı.', 'info');
				
				// Bağlantı kapandığında connection panel'i tekrar göster
				const connectionPanel = document.querySelector('.connection-panel');
				if (connectionPanel) {
					connectionPanel.classList.remove('hidden');
					console.log('🔓 Connection panel gösterildi (bağlantı kapandı)');
				}
				
				// Çeviri formunu tekrar göster
				const translateForm = document.getElementById('translateForm');
				if (translateForm) {
					translateForm.classList.remove('hidden');
					console.log('🔓 Çeviri formu gösterildi (bağlantı kapandı)');
				}
				
				// Çeviri yönü bilgisini gizle
				const translationInfo = document.getElementById('translationInfo');
				if (translationInfo) {
					translationInfo.style.display = 'none';
				}
			});
			
			call.on('error', function(err) {
				console.error('Ana kanal hatası:', err);
				updateWebcamStatus('Ana kanal hatası: ' + err.message, 'error');
			});
		}
		
		// Çeviri kanalı işleyici (Sadece çeviri sesi)
		let remoteTranslationAudio = null;
		let translationChannelReady = false; // Çeviri kanalının hazır olup olmadığını takip et
		
		function handleTranslationCall(call) {
			console.log('handleTranslationCall çağrıldı');
			translationChannelReady = false;
			
			call.on('stream', function(remoteTranslationStream) {
				// Çeviri ses stream'ini ayrı bir audio element ile çal
				console.log('Çeviri kanalı stream alındı:', remoteTranslationStream);
				console.log('Çeviri kanalı audio tracks:', remoteTranslationStream.getAudioTracks());
				
				if (!remoteTranslationAudio) {
					remoteTranslationAudio = new Audio();
					remoteTranslationAudio.autoplay = true;
					remoteTranslationAudio.volume = 1.0;
					
					// Debug için ses oynatma olaylarını dinle
					remoteTranslationAudio.addEventListener('play', () => {
						console.log('Çeviri audio element çalmaya başladı');
					});
					
					remoteTranslationAudio.addEventListener('error', (e) => {
						console.error('Çeviri audio element hatası:', e);
					});
				}
				
				remoteTranslationAudio.srcObject = remoteTranslationStream;
				
				// Çeviri kanalı artık hazır
				translationChannelReady = true;
				console.log('✅ Çeviri kanalı tam hazır: Sadece çeviri sesleri');
				updateWebcamStatus('Çeviri kanalı bağlandı! (2 kanal aktif)', 'success');
			});
			
			call.on('close', function() {
				if (remoteTranslationAudio) {
					remoteTranslationAudio.srcObject = null;
				}
				translationChannelReady = false;
				console.log('Çeviri kanalı kapandı');
			});
			
			call.on('error', function(err) {
				console.error('Çeviri kanalı hatası:', err);
				translationChannelReady = false;
			});
		}
		
		// Bağlantıyı kes
		function disconnectPeer() {
			if (currentCall) {
				if (currentCall.main) currentCall.main.close();
				if (currentCall.translation) currentCall.translation.close();
				currentCall = null;
			}
			
			// Data connection'ı kapat
			if (dataConnection) {
				dataConnection.close();
				dataConnection = null;
				console.log('📪 Data connection kapatıldı');
			}
			
			remoteVideo.srcObject = null;
			remoteVideo.style.display = 'none';
			remotePlaceholder.style.display = 'flex';
			
			if (remoteTranslationAudio) {
				remoteTranslationAudio.srcObject = null;
			}
			
			updateConnectionStatus('disconnected');
			updateWebcamStatus('Bağlantı kesildi.', 'info');
		}
		
		// Peer ID kopyala
		function copyPeerId() {
			if (myPeerId) {
				navigator.clipboard.writeText(myPeerId).then(() => {
					updateWebcamStatus('ID panoya kopyalandı!', 'success');
				}).catch(err => {
					// Fallback
					const input = document.createElement('input');
					input.value = myPeerId;
					document.body.appendChild(input);
					input.select();
					document.execCommand('copy');
					document.body.removeChild(input);
					updateWebcamStatus('ID panoya kopyalandı!', 'success');
				});
			}
		}
		
		// Davet linki oluştur ve kopyala
		function createInviteLink() {
			if (!myPeerId) {
				alert('⚠️ Henüz Peer ID oluşturulmadı! Lütfen bekleyin...');
				return;
			}
			
			// Mevcut URL'yi al (query string olmadan)
			const currentUrl = window.location.origin + window.location.pathname;
			
			// Peer ID ile link oluştur
			const inviteLink = currentUrl + '?peer_id=' + myPeerId;
			
			// Linki kopyala
			navigator.clipboard.writeText(inviteLink).then(() => {
				updateWebcamStatus('✅ Davet linki kopyalandı! Karşı tarafa gönderin.', 'success');
				
				// Kullanıcıya göster
				alert('🔗 Davet Linki Oluşturuldu ve Kopyalandı!\n\n' + inviteLink + '\n\n📋 Bu linki karşı tarafa gönderin.\nLink ile açtığında otomatik olarak sizinle bağlantı kurabilir.');
				
				console.log('📋 Davet linki kopyalandı:', inviteLink);
			}).catch(err => {
				console.error('Kopyalama hatası:', err);
				// Kopyalama başarısız olursa fallback
				const input = document.createElement('input');
				input.value = inviteLink;
				document.body.appendChild(input);
				input.select();
				document.execCommand('copy');
				document.body.removeChild(input);
				
				alert('🔗 Davet Linki Oluşturuldu ve Kopyalandı!\n\n' + inviteLink + '\n\n📋 Bu linki karşı tarafa gönderin.');
				updateWebcamStatus('✅ Davet linki kopyalandı!', 'success');
			});
		}
		
		// Ekran görüntüsü al
		function captureWebcamPhoto() {
			// Her iki videoyu da canvas'a çiz
			const canvas = webcamCanvas;
			const ctx = webcamCtx;
			
			// Canvas boyutunu ayarla
			canvas.width = 1280;
			canvas.height = 480;
			
			// Yerel video
			if (localVideo.srcObject) {
				ctx.save();
				ctx.scale(-1, 1); // Ayna efekti
				ctx.drawImage(localVideo, -640, 0, 640, 480);
				ctx.restore();
			} else {
				ctx.fillStyle = '#1a1a1a';
				ctx.fillRect(0, 0, 640, 480);
				ctx.fillStyle = '#666';
				ctx.font = '16px Arial';
				ctx.textAlign = 'center';
				ctx.fillText('Yerel kamera kapalı', 320, 240);
			}
			
			// Uzak video
			if (remoteVideo.srcObject) {
				ctx.drawImage(remoteVideo, 640, 0, 640, 480);
			} else {
				ctx.fillStyle = '#1a1a1a';
				ctx.fillRect(640, 0, 640, 480);
				ctx.fillStyle = '#666';
				ctx.font = '16px Arial';
				ctx.textAlign = 'center';
				ctx.fillText('Uzak kamera bağlı değil', 960, 240);
			}
			
			canvas.style.display = 'block';
			
			// İndir
			canvas.toBlob(function(blob) {
				const url = URL.createObjectURL(blob);
				const a = document.createElement('a');
				a.href = url;
				a.download = 'video-gorusme-' + Date.now() + '.png';
				a.click();
				URL.revokeObjectURL(url);
			}, 'image/png');
			
			updateWebcamStatus('Ekran görüntüsü kaydedildi!', 'success');
		}
		
		// Webcam container'ı göster/gizle
		function toggleWebcam() {
			const container = document.getElementById('webcamContainer');
			const toggleBtn = document.getElementById('webcamToggle');
			
			if (container.classList.contains('active')) {
				container.classList.remove('active');
				toggleBtn.textContent = '📹 Aç';
				toggleBtn.classList.remove('active');
				stopLocalWebcam();
				disconnectPeer();
			} else {
				container.classList.add('active');
				toggleBtn.textContent = '❌ Kapat';
				toggleBtn.classList.add('active');
			}
		}
		
		// Webcam durum mesajını güncelle
		function updateWebcamStatus(message, type) {
			const statusDiv = document.getElementById('webcamStatus');
			statusDiv.textContent = message;
			statusDiv.className = 'webcam-status ' + type;
			if (!message) {
				statusDiv.style.display = 'none';
			} else {
				statusDiv.style.display = 'block';
			}
		}
		
		// Sayfa yüklendiğinde PeerJS başlat
		window.addEventListener('load', function() {
			initializePeer();
			
			// URL'den peer_id parametresini kontrol et
			const urlParams = new URLSearchParams(window.location.search);
			const peerIdFromUrl = urlParams.get('peer_id');
			
			if (peerIdFromUrl) {
				console.log('📨 URL\'den peer ID alındı:', peerIdFromUrl);
				
				// Otomatik bağlantı flag'ini işaretle
				isAutoConnectFromLink = true;
				
				// Peer ID'yi input'a yaz
				const remotePeerIdInput = document.getElementById('remotePeerId');
				if (remotePeerIdInput) {
					remotePeerIdInput.value = peerIdFromUrl;
					
					// Kullanıcıya bildir
					updateWebcamStatus('✅ Davet linki ile açıldı! Otomatik bağlanılıyor...', 'info');
					
					// Peer oluşana kadar bekle, sonra otomatik bağlan
					const checkPeerReady = setInterval(() => {
						if (peer && myPeerId) {
							clearInterval(checkPeerReady);
							
							console.log('🔄 Otomatik bağlantı başlatılıyor...');
							updateWebcamStatus('🔄 Otomatik bağlanıyor...', 'info');
							
							// 1 saniye sonra bağlan (peer'in tamamen hazır olması için)
							setTimeout(() => {
								connectToPeer();
							}, 1000);
						}
					}, 500); // Her 500ms kontrol et
					
					// 10 saniye timeout
					setTimeout(() => {
						clearInterval(checkPeerReady);
					}, 10000);
				}
			}
		});
		
		// Sayfa kapatılırken bağlantıları kapat
		window.addEventListener('beforeunload', () => {
			stopLocalWebcam();
			disconnectPeer();
			if (peer) peer.destroy();
		});
        
		// Audio Context (WebRTC için ses yönlendirme)
		let isPlayingTranslation = false;
		
		function cevap_soyle() {
			if (!ceviri_cevap || ceviri_cevap === '') {
				console.warn('Ses dosyası URL\'si bulunamadı');
				return;
			}
			
			// URL'nin geçerli olduğundan emin ol
			if (!ceviri_cevap.startsWith('http://') && !ceviri_cevap.startsWith('https://') && !ceviri_cevap.startsWith('audio/')) {
				console.error('Geçersiz ses dosyası URL\'si:', ceviri_cevap);
				return;
			}
			
			// Önce lokalde çal
			playAudioLocally(ceviri_cevap);
			
			// Eğer video görüşmesi aktifse, sesi video görüşmesinin çeviri kanalına da gönder
			if (currentCall && translationStream) {
				sendAudioToTranslationChannel(ceviri_cevap);
			}
		}
		
		// Sesi hoparlörden çal (normal mod)
		function playAudioLocally(url) {
			console.log('🔊 Lokalde çalınacak:', url);
			console.log('⏳ Dosyanın tamamen oluşması için 1.5 saniye bekleniyor...');
			
			// Dosyanın PHP tarafında tam oluşması için bekle
			setTimeout(() => {
				console.log('✅ Bekleme tamamlandı, şimdi çalınıyor...');
				playAudioNow(url);
			}, 1500); // 1.5 saniye bekle
		}
		
		// Sesi şimdi çal (internal fonksiyon) - retry mekanizmalı
		function playAudioNow(url, retryCount = 0) {
			const maxRetries = 3;
			
			try {
				const audio = new Audio();
				// crossOrigin kaldırıldı (CORS hatası önlenir)
				audio.preload = 'auto';
				
				// Event listener'ları ekle
				audio.addEventListener('canplay', function() {
					console.log('✅ Ses dosyası yüklendi, çalınıyor...');
					
					const playPromise = audio.play();
					
					if (playPromise !== undefined) {
						playPromise.then(function() {
							console.log('✅ Ses başarıyla çalıyor');
							if (autoTranslationActive) {
								addAutoTranslationLog('🔊 Ses lokalde çalındı');
							}
						}).catch(function(error) {
							console.error('❌ Ses çalma hatası:', error);
							console.error('Error details:', {
								name: error.name,
								message: error.message,
								url: url
							});
							
							// Autoplay engellendi
							if (error.name === 'NotAllowedError') {
								console.warn('🚫 Tarayıcı otomatik ses çalmayı engelliyor!');
								console.warn('💡 Çözüm: Sayfayla etkileşime geçin (tıklama vb.)');
								
								if (autoTranslationActive) {
									addAutoTranslationLog('🚫 Tarayıcı otomatik sesi engelliyor! Lütfen sayfaya tıklayın.');
								} else {
									alert('🚫 Tarayıcı ayarları nedeniyle ses otomatik çalamıyor.\n\n💡 Çözüm: Sayfaya bir kere tıklayın veya ses butonuna basın.');
								}
								
								// Kullanıcıya manuel çalma butonu göster
								showManualPlayButton(audio, url);
							} else {
								// Diğer hatalar
								if (autoTranslationActive) {
									addAutoTranslationLog('❌ Ses çalma hatası: ' + error.message);
								}
							}
						});
					}
				});
				
				audio.addEventListener('error', function(e) {
					console.error('❌ Ses dosyası yüklenemedi (Deneme ' + (retryCount + 1) + '/' + (maxRetries + 1) + '):', e);
					console.error('Audio error details:', {
						error: audio.error,
						errorCode: audio.error ? audio.error.code : 'unknown',
						url: url,
						networkState: audio.networkState,
						readyState: audio.readyState,
						retryCount: retryCount
					});
					
					// Hata kodunu çöz
					let errorMsg = 'Ses dosyası yüklenemedi: ';
					if (audio.error) {
						switch(audio.error.code) {
							case 1: errorMsg += 'Yükleme iptal edildi'; break;
							case 2: errorMsg += 'Ağ hatası - Dosya indirilemedi'; break;
							case 3: errorMsg += 'Dosya decode edilemedi - Bozuk MP3'; break;
							case 4: errorMsg += 'Dosya bulunamadı veya henüz hazır değil'; break;
							default: errorMsg += 'Bilinmeyen hata';
						}
					}
					console.warn('⚠️', errorMsg);
					
					// Retry mekanizması (sadece error code 4 için)
					if (audio.error && audio.error.code === 4 && retryCount < maxRetries) {
						const retryDelay = 2000 * (retryCount + 1); // 2s, 4s, 6s
						console.log('🔄 ' + retryDelay + 'ms sonra tekrar denenecek...');
						
						if (autoTranslationActive) {
							addAutoTranslationLog('🔄 Dosya henüz hazır değil, ' + (retryDelay/1000) + ' saniye sonra tekrar deneniyor...');
						}
						
						setTimeout(() => {
							playAudioNow(url, retryCount + 1);
						}, retryDelay);
					} else {
						// Maksimum deneme sayısına ulaşıldı veya diğer hatalar
						console.error('❌ Ses çalınamadı (tüm denemeler tükendi)');
						console.warn('💡 Çözüm: Dosyayı tarayıcıda direkt açın:', url);
						
						if (autoTranslationActive) {
							addAutoTranslationLog('❌ ' + errorMsg);
							addAutoTranslationLog('💡 Dosyayı kontrol edin: <a href="' + url + '" target="_blank">Tıklayın</a>');
						}
					}
				});
				
				audio.addEventListener('loadstart', function() {
					console.log('📥 Ses dosyası yüklenmeye başladı:', url);
				});
				
				audio.addEventListener('progress', function() {
					console.log('⏬ İndiriliyor...');
				});
				
				// URL'yi ayarla ve yükle
				audio.src = url;
				console.log('🎵 Audio source set:', url);
				
			} catch (error) {
				console.error('❌ Audio oluşturma hatası:', error);
				console.error('Error stack:', error.stack);
			}
		}
		
		// Sesi WebRTC ÇEVIRI KANALI üzerinden gönder (normal mikrofonu etkilemez)
		async function sendAudioToTranslationChannel(url) {
			if (isPlayingTranslation) {
				updateWebcamStatus('⚠️ Bir çeviri sesi zaten çalıyor, lütfen bekleyin.', 'error');
				throw new Error('Bir çeviri sesi zaten çalıyor');
			}
			
			return new Promise(async (resolve, reject) => {
				try {
					isPlayingTranslation = true;
					updateWebcamStatus('🔊 Çeviri sesi ayrı kanaldan gönderiliyor...', 'info');
					
					// AudioContext oluştur (zaten var)
					if (!audioContext) {
						audioContext = new (window.AudioContext || window.webkitAudioContext)();
					}
					
					// AudioContext resume et (bazı tarayıcılarda suspended olabilir)
					if (audioContext.state === 'suspended') {
						await audioContext.resume();
					}
					
					// Fetch ile audio dosyasını al
					const response = await fetch(url);
					if (!response.ok) {
						throw new Error('Ses dosyası indirilemedi: HTTP ' + response.status);
					}
					
					const arrayBuffer = await response.arrayBuffer();
					const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
					
					// Yeni bir MediaStreamDestination oluştur (her çeviri için)
					const newDestination = audioContext.createMediaStreamDestination();
					
					// BufferSource oluştur
					const source = audioContext.createBufferSource();
					source.buffer = audioBuffer;
					
					// GainNode ekle (ses seviyesi kontrolü için)
					const gainNode = audioContext.createGain();
					gainNode.gain.value = 1.0;
					
					// Bağlantıları yap: source -> gain -> destination
					source.connect(gainNode);
					gainNode.connect(newDestination);
					
					// Yeni stream'i al
					const newTranslationStream = newDestination.stream;
					
					// Çeviri kanalındaki PeerConnection'ı bul ve track'i değiştir
					if (currentCall && currentCall.translation && currentCall.translation.peerConnection) {
						const peerConnection = currentCall.translation.peerConnection;
						const senders = peerConnection.getSenders();
						
						// Yeni audio track'i al
						const newAudioTrack = newTranslationStream.getAudioTracks()[0];
						
						if (newAudioTrack) {
							// Audio sender'ı bul
							const audioSender = senders.find(s => !s.track || s.track.kind === 'audio');
							
							if (audioSender) {
								// Track'i değiştir
								await audioSender.replaceTrack(newAudioTrack);
								console.log('Çeviri track\'i değiştirildi:', newAudioTrack);
							} else {
								// Yeni track ekle
								peerConnection.addTrack(newAudioTrack, newTranslationStream);
								console.log('Yeni çeviri track\'i eklendi:', newAudioTrack);
							}
							
							// Sesi çal
							source.start(0);
							
							console.log('Çeviri sesi ayrı kanaldan gönderiliyor (normal mikrofon etkilenmedi)');
							
							// Ses bittiğinde
							source.onended = function() {
								updateWebcamStatus('✅ Çeviri sesi gönderildi (ayrı kanal).', 'success');
								isPlayingTranslation = false;
								console.log('Çeviri sesi tamamlandı');
								resolve(); // Promise'i başarıyla tamamla
							};
							
							// Hata durumu için timeout
							setTimeout(() => {
								if (isPlayingTranslation) {
									console.warn('Ses gönderimi zaman aşımına uğradı');
									isPlayingTranslation = false;
									resolve();
								}
							}, audioBuffer.duration * 1000 + 2000);
							
						} else {
							throw new Error('Audio track oluşturulamadı');
						}
					} else {
						throw new Error('Çeviri kanalı bulunamadı');
					}
					
				} catch (error) {
					console.error('Çeviri kanalı ses gönderme hatası:', error);
					updateWebcamStatus('❌ Çeviri sesi gönderilemedi: ' + error.message, 'error');
					isPlayingTranslation = false;
					reject(error);
				}
			});
		}
		
		
        // Tarayıcı desteğini kontrol et
        if ('webkitSpeechRecognition' in window || 'SpeechRecognition' in window) {
            const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
            recognition = new SpeechRecognition();
            
            // Türkçe için dil ayarı
            recognition.lang = 'tr-TR';
            recognition.continuous = false;
            recognition.interimResults = false;
            
            const micButton = document.getElementById('micButton');
            const textArea = document.getElementById('text');
            const speechStatus = document.getElementById('speechStatus');
            
            micButton.addEventListener('click', function() {
                if (!isRecording) {
                    startRecording();
                } else {
                    stopRecording();
                }
            });
            
            recognition.onstart = function() {
                isRecording = true;
                micButton.classList.add('recording');
                speechStatus.textContent = '🎤 Dinleniyor... Konuşun';
                speechStatus.classList.add('active');
                textArea.placeholder = 'Konuşun...';
            };
            
            recognition.onresult = function(event) {
                // Sürekli dinleme modunda son sonucu al (resultIndex kullan)
                const resultIndex = event.resultIndex;
                const transcript = event.results[resultIndex][0].transcript;
                
                console.log('🎤 Speech Recognition sonuç:', {
                    resultIndex: resultIndex,
                    totalResults: event.results.length,
                    transcript: transcript,
                    isFinal: event.results[resultIndex].isFinal
                });
                
                textArea.value = transcript;
                
                // Otomatik çeviri modundaysa
                if (autoTranslationActive) {
                    const now = Date.now();
                    // Cooldown kontrolü (çok sık çeviri yapılmasın)
                    if (now - lastTranslationTime < translationCooldown) {
                        console.log('⏳ Çeviri cooldown aktif, bekleniyor... (Son çeviri: ' + Math.floor((now - lastTranslationTime)/1000) + 's önce)');
                        return;
                    }
                    
                    lastTranslationTime = now;
                    addAutoTranslationLog('🎤 Algılandı: ' + transcript);
                    console.log('✅ Çeviri başlatılıyor:', transcript);
                    
                    // Otomatik olarak çevir ve seslendir
                    setTimeout(function() {
                        document.getElementById('translateForm').dispatchEvent(new Event('submit'));
                    }, 300);
                } else {
                    // Manuel mod
                    speechStatus.textContent = '✅ Algılandı: ' + transcript;
                    setTimeout(function() {
                        document.getElementById('translateForm').dispatchEvent(new Event('submit'));
                    }, 500);
                }
            };
            
            recognition.onerror = function(event) {
                console.error('Speech recognition error:', event.error);
                speechStatus.textContent = '❌ Hata: ' + event.error;
                stopRecording();
            };
            
            recognition.onend = function() {
                // Otomatik çeviri modundaysa tekrar başlat
                if (autoTranslationActive) {
                    console.log('🔄 Otomatik çeviri modu: Recognition yeniden başlatılıyor...');
                    setTimeout(() => {
                        if (autoTranslationActive) {
                            try {
                                recognition.start();
                            } catch (e) {
                                console.error('Recognition restart error:', e);
                            }
                        }
                    }, 500);
                } else {
                    stopRecording();
                }
            };
            
            let savedAudioTracks = [];
            let wasVideoCallActive = false;
            
            function startRecording() {
                try {
                    // Video görüşmesi varsa, audio track'leri tamamen durdur
                    if (localStream) {
                        wasVideoCallActive = true;
                        const audioTracks = localStream.getAudioTracks();
                        
                        // Track'leri kaydet ve durdur
                        savedAudioTracks = audioTracks.map(track => {
                            const settings = track.getSettings();
                            track.stop(); // Tamamen durdur
                            return settings;
                        });
                        
                        // Stream'den audio track'leri kaldır
                        audioTracks.forEach(track => {
                            localStream.removeTrack(track);
                        });
                        
                        speechStatus.textContent = '🎤 Video mikrofonu durduruldu, dinleniyor...';
                        speechStatus.classList.add('active');
                        updateWebcamStatus('⚠️ Çeviri için mikrofon kullanılıyor, ses kısa süre kesilecek.', 'info');
                    }
                    
                    // Küçük bir gecikme ekle
                    setTimeout(() => {
                        recognition.start();
                    }, 300);
                    
                } catch (error) {
                    console.error('Recognition start error:', error);
                    speechStatus.textContent = '❌ Mikrofon erişimi reddedildi. Lütfen izin verin.';
                    speechStatus.classList.add('active');
                    
                    // Hata durumunda video mikrofonunu geri başlat
                    restoreVideoAudio();
                }
            }
            
            async function stopRecording() {
                isRecording = false;
                micButton.classList.remove('recording');
                speechStatus.textContent = '';
                speechStatus.classList.remove('active');
                textArea.placeholder = 'Örn: Merhaba, nasılsınız? (veya mikrofon butonuna tıklayarak konuşun)';
                
                if (recognition) {
                    recognition.stop();
                }
                
                // Video görüşmesi aktifse, mikrofonu geri başlat
                if (wasVideoCallActive) {
                    await restoreVideoAudio();
                    wasVideoCallActive = false;
                }
            }
            
            async function restoreVideoAudio() {
                if (!localStream) return;
                
                try {
                    // Yeni audio track al
                    const newAudioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
                    const newAudioTrack = newAudioStream.getAudioTracks()[0];
                    
                    // Local stream'e ekle
                    localStream.addTrack(newAudioTrack);
                    
                    // Ana kanaldaki PeerConnection'a ekle
                    if (currentCall && currentCall.main && currentCall.main.peerConnection) {
                        const senders = currentCall.main.peerConnection.getSenders();
                        const audioSender = senders.find(s => s.track === null || (s.track && s.track.kind === 'audio' && s.track.readyState === 'ended'));
                        
                        if (audioSender) {
                            await audioSender.replaceTrack(newAudioTrack);
                        } else {
                            // Yeni sender ekle
                            currentCall.main.peerConnection.addTrack(newAudioTrack, localStream);
                        }
                    }
                    
                    updateWebcamStatus('✅ Video mikrofonu tekrar başlatıldı.', 'success');
                    console.log('Video mikrofonu tekrar başlatıldı');
                    
                } catch (error) {
                    console.error('Video mikrofonu geri yüklenirken hata:', error);
                    updateWebcamStatus('❌ Video mikrofonu başlatılamadı. Lütfen "Kameramı Başlat" butonuna tıklayın.', 'error');
                }
            }
            
            // Kaynak dil değiştiğinde recognition dilini güncelle
            document.getElementById('source_lang').addEventListener('change', function() {
                const langMap = {
                    'TR': 'tr-TR',
                    'EN': 'en-US',
                    'DE': 'de-DE',
                    'FR': 'fr-FR',
                    'ES': 'es-ES',
                    'IT': 'it-IT',
                    'PT': 'pt-PT',
                    'RU': 'ru-RU',
                    'JA': 'ja-JP',
                    'ZH': 'zh-CN',
                    'KO': 'ko-KR',
                    'NL': 'nl-NL',
                    'PL': 'pl-PL',
                    'SV': 'sv-SE',
                    'DA': 'da-DK',
                    'NO': 'no-NO',
                    'FI': 'fi-FI',
                    'EL': 'el-GR',
                    'CS': 'cs-CZ',
                    'RO': 'ro-RO',
                    'HU': 'hu-HU',
                    'BG': 'bg-BG',
                    'HR': 'hr-HR',
                    'SK': 'sk-SK',
                    'SL': 'sl-SI',
                    'ET': 'et-EE',
                    'LV': 'lv-LV',
                    'LT': 'lt-LT',
                    'UK': 'uk-UA'
                };
                recognition.lang = langMap[this.value] || 'tr-TR';
            });
        } else {
            // Tarayıcı Speech Recognition desteklemiyorsa butonu devre dışı bırak
            const micButton = document.getElementById('micButton');
            micButton.disabled = true;
            micButton.style.opacity = '0.5';
            micButton.style.cursor = 'not-allowed';
            micButton.title = 'Bu tarayıcı Speech Recognition API\'sini desteklemiyor. Chrome veya Edge kullanın.';
            console.warn('Bu tarayıcı Speech Recognition API\'sini desteklemiyor. Chrome veya Edge kullanın.');
        }
        
        document.getElementById('translateForm').addEventListener('submit', async function(e) {
            e.preventDefault();
            
            const formData = new FormData(this);
            const loading = document.getElementById('loading');
            const result = document.getElementById('result');
            
            loading.style.display = 'block';
            result.style.display = 'none';
			
            
            try {
                const response = await fetch('deepl_tts.php', {
                    method: 'POST',
                    body: formData
                });
                
                const data = await response.json();
                
                loading.style.display = 'none';
                result.style.display = 'block';
                
                if (data.success) {
					
					ceviri_cevap='';
                    result.className = 'result success';
                    
                    // Otomatik çeviri modunda log ekle
                    if (autoTranslationActive) {
                        addAutoTranslationLog('✅ Çevrildi: "' + data.translated_text + '"');
                    }
                    
                    let html = '<h3>✅ Başarılı!</h3>';
                    html += '<p><strong>Orijinal Metin:</strong> ' + data.original_text + '</p>';
                    html += '<p><strong>Çevrilmiş Metin:</strong> ' + data.translated_text + '</p>';
                    
                    // Ses dosyası URL'sini belirle
                    let audioSrc = null;
                    if (data.audio_url) {
                        // Mutlak URL varsa onu kullan
                        audioSrc = data.audio_url;
                    } else if (data.audio_file) {
                        // Göreli yol varsa onu kullan
                        audioSrc = data.audio_file;
                    } else if (data.audio_filename) {
                        // Sadece dosya adı varsa klasörle birleştir
                        audioSrc = 'audio/' + data.audio_filename;
                    }
                    
					// Ses dosyası URL'sini global değişkene kaydet
					if (audioSrc) {
						ceviri_cevap = audioSrc;
						
						// Son çeviri verisini sakla
						lastTranslationData = {
							audioUrl: audioSrc,
							originalText: data.original_text,
							translatedText: data.translated_text
						};
						
						// "Tekrar Çal" butonunu aktif et
						const repeatBtn = document.getElementById('repeatLastTranslation');
						if (repeatBtn) {
							repeatBtn.disabled = false;
						}
						
						// Son çeviri bilgisini göster
						const lastTranslationInfo = document.getElementById('lastTranslationInfo');
						const lastTranslationText = document.getElementById('lastTranslationText');
						if (lastTranslationInfo && lastTranslationText) {
							lastTranslationInfo.style.display = 'block';
							lastTranslationText.textContent = data.translated_text;
						}
					}
                    
                    // Ses dosyası varsa işle
                    if (audioSrc) {
						console.log('📁 Ses dosyası URL:', audioSrc);
						console.log('🔗 Video görüşmesi durumu:', currentCall ? 'Aktif' : 'Kapalı');
						console.log('🔗 Çeviri kanalı durumu:', (currentCall && currentCall.translation) ? 'Bağlı' : 'Bağlı değil');
						
						html += '<p><strong>Ses Dosyası:</strong></p>';
						
						// Video görüşmesi aktifse uyarı göster
						if (currentCall && currentCall.translation) {
							html += '<div id="autoSendStatus" style="background:#fff3cd;padding:10px;border-radius:4px;margin-bottom:10px;border-left:4px solid #ffc107;animation:fadeIn 0.3s;">';
							html += '⏳ <strong>Çeviri sesi karşı tarafa gönderiliyor...</strong>';
							html += '</div>';
						}
						
                        html += '<audio id="audioPlayer" controls preload="auto">';
                        html += '<source src="' + audioSrc + '" type="audio/mpeg">';
                        html += '<source src="' + audioSrc + '" type="audio/mp3">';
                        html += 'Tarayıcınız ses oynatmayı desteklemiyor.';
                        html += '</audio>';
						
						html += '<div style="margin-top:10px;">';
						if (currentCall && currentCall.translation) {
							html += '<button onclick="cevap_soyle()" style="padding:8px 16px;background:#2196F3;color:white;border:none;border-radius:4px;cursor:pointer;margin-right:5px;">🔊 Tekrar Gönder</button>';
						}
						html += '<button onclick="playAudioLocally(ceviri_cevap)" style="padding:8px 16px;background:#4CAF50;color:white;border:none;border-radius:4px;cursor:pointer;">🔊 Yerel Çal</button>';
						html += '</div>';
                    
					result.innerHTML = html;
					
					// Video görüşmesi aktifse hem lokalde çal hem uzak bilgisayara gönder
					if (currentCall && currentCall.translation) {
						console.log('🚀 Video görüşmesi aktif! Çeviri sesi hem lokalde çalınacak hem karşı tarafa gönderilecek...');
						
						// Önce lokalde çal
						playAudioLocally(audioSrc);
						
						// Sonra uzak bilgisayara gönder
						// Çeviri kanalının tam hazır olması için 2 saniye bekle
						setTimeout(function() {
							console.log('🔄 Çeviri kanalı kontrolü yapılıyor...');
							console.log('translationChannelReady:', translationChannelReady);
							console.log('currentCall.translation:', !!currentCall.translation);
							console.log('peerConnection:', currentCall.translation ? !!currentCall.translation.peerConnection : false);
							
							// Çeviri kanalı kontrolü
							if (currentCall && currentCall.translation && currentCall.translation.peerConnection) {
								console.log('✅ Çeviri kanalı hazır, uzak bilgisayara gönderim başlıyor...');
								
								sendAudioToTranslationChannel(audioSrc).then(() => {
									// Başarılı mesajı
									console.log('✅ Çeviri sesi başarıyla uzak bilgisayara gönderildi');
									
									// Otomatik çeviri modunda log ekle
									if (autoTranslationActive) {
										addAutoTranslationLog('🔊 Ses lokalde çalındı ve karşı tarafa gönderildi!');
									}
									
									const statusDiv = document.getElementById('autoSendStatus');
									if (statusDiv) {
										statusDiv.style.background = '#d4edda';
										statusDiv.style.borderColor = '#28a745';
										statusDiv.innerHTML = '✅ <strong>Çeviri sesi lokalde çalındı ve karşı tarafa gönderildi!</strong>';
										
										// 3 saniye sonra mesajı kaldır
										setTimeout(() => {
											statusDiv.style.animation = 'fadeOut 0.3s';
											setTimeout(() => statusDiv.remove(), 300);
										}, 3000);
									}
								}).catch(err => {
									// Hata mesajı
									console.error('❌ Çeviri sesi gönderme hatası:', err);
									const statusDiv = document.getElementById('autoSendStatus');
									if (statusDiv) {
										statusDiv.style.background = '#f8d7da';
										statusDiv.style.borderColor = '#dc3545';
										statusDiv.innerHTML = '❌ <strong>Gönderim hatası:</strong> ' + err.message + '<br><small>Lokal çalındı ama uzak bilgisayara gönderilemedi.</small>';
									}
								});
							} else {
								// Kanal hazır değil
								console.warn('⚠️ Çeviri kanalı henüz hazır değil');
								const statusDiv = document.getElementById('autoSendStatus');
								if (statusDiv) {
									statusDiv.style.background = '#fff3cd';
									statusDiv.style.borderColor = '#ffc107';
									statusDiv.innerHTML = '⚠️ <strong>Çeviri kanalı henüz hazır değil.</strong><br><small>Ses lokalde çalındı ama uzak bilgisayara gönderilemedi.</small>';
								}
							}
						}, 2000); // 2 saniye bekle
					} else {
						// Video görüşmesi yoksa audio player event'leri ekle
						console.log('🔊 Video görüşmesi yok, yerel hoparlör kontrolü hazırlanıyor...');
						
						setTimeout(function() {
							const audio = document.getElementById('audioPlayer');
							if (audio) {
								// Ses dosyası yüklendiğinde otomatik çal
								audio.addEventListener('loadeddata', function() {
									console.log('✅ Ses dosyası yüklendi, yerel hoparlörden çalınıyor...');
									audio.play().catch(function(error) {
										console.log('⚠️ Otomatik çalma engellendi:', error);
										// Kullanıcıya bilgi ver
										const playButton = document.createElement('button');
										playButton.textContent = '▶ Ses Çal';
										playButton.style.marginTop = '10px';
										playButton.style.padding = '10px 20px';
										playButton.style.background = '#4CAF50';
										playButton.style.color = 'white';
										playButton.style.border = 'none';
										playButton.style.borderRadius = '4px';
										playButton.style.cursor = 'pointer';
										playButton.onclick = function() {
											audio.play();
											this.remove();
										};
										result.appendChild(playButton);
									});
								});
								
								// Hata durumunda
								audio.addEventListener('error', function(e) {
									console.error('❌ Ses dosyası yüklenemedi:', e);
									
									const errorMsg = document.createElement('div');
									errorMsg.style.color = '#c62828';
									errorMsg.style.marginTop = '10px';
									errorMsg.style.padding = '10px';
									errorMsg.style.background = '#ffebee';
									errorMsg.style.borderRadius = '4px';
									errorMsg.innerHTML = '<strong>❌ Ses dosyası yüklenemedi</strong><br>';
									errorMsg.innerHTML += 'URL: <a href="' + audioSrc + '" target="_blank">' + audioSrc + '</a>';
									result.appendChild(errorMsg);
								});
								
								// Audio element'i yükle
								audio.load();
							}
						}, 100);
					}
                    }
					
					// Ses dosyası yüklendikten sonra otomatik çal
					// cevap_soyle(); // fonksiyonu artık buton ile çağrılacak
                } else {
                    result.className = 'result error';
                    result.innerHTML = '<h3>❌ Hata!</h3><p>' + (data.error || 'Bir hata oluştu') + '</p>';
                }
            } catch (error) {
                loading.style.display = 'none';
                result.style.display = 'block';
                result.className = 'result error';
                result.innerHTML = '<h3>❌ Hata!</h3><p>' + error.message + '</p>';
            }
        });
		// ==================== OTOMATİK ÇEVİRİ FONKSİYONLARI ====================
		
		// Senkronizasyon mesajlarını işle
		function handleSyncMessage(data) {
			if (!data || !data.type) return;
			
			switch(data.type) {
				case 'autoTranslationStart':
					console.log('📨 Karşı taraf otomatik çeviriyi başlattı');
					addAutoTranslationLog('📨 Karşı taraf otomatik çeviriyi başlattı. Sizde de başlatılıyor...');
					
					// Eğer henüz başlatılmamışsa, otomatik başlat
					if (!autoTranslationActive) {
						setTimeout(() => {
							const toggleBtn = document.getElementById('autoTranslationToggle');
							if (toggleBtn && !autoTranslationActive) {
								toggleBtn.click(); // Butona tıklama simüle et
							}
						}, 500);
					}
					break;
					
				case 'autoTranslationStop':
					console.log('📨 Karşı taraf otomatik çeviriyi durdurdu');
					addAutoTranslationLog('📨 Karşı taraf otomatik çeviriyi durdurdu. Sizde de durduruluyor...');
					
					// Eğer aktifse, otomatik durdur
					if (autoTranslationActive) {
						setTimeout(() => {
							const toggleBtn = document.getElementById('autoTranslationToggle');
							if (toggleBtn && autoTranslationActive) {
								toggleBtn.click(); // Butona tıklama simüle et
							}
						}, 500);
					}
					break;
					
				case 'languageChange':
					console.log('📨 Karşı taraf dil ayarlarını gönderdi:', data);
					
					// Karşı tarafın kaynak dili → Bizim hedef dilimiz
					// Karşı tarafın hedef dili → Bizim kaynak dilimiz
					const sourceSelect = document.getElementById('source_lang');
					const targetSelect = document.getElementById('target_lang');
					
					if (sourceSelect && targetSelect) {
						sourceSelect.value = data.targetLang; // Onun hedefi bizim kaynağımız
						targetSelect.value = data.sourceLang; // Onun kaynağı bizim hedefimiz
						
						console.log('🔄 Diller ayarlandı: Kaynak=' + data.targetLang + ', Hedef=' + data.sourceLang);
						
						// Çeviri yönü bilgisini güncelle (eğer link ile bağlandıysa)
						if (isAutoConnectFromLink) {
							updateTranslationInfo();
						}
						
						// Kullanıcıya bildirim göster
						updateWebcamStatus('🔄 Karşı taraf dil ayarlarını gönderdi. Diller güncellendi!', 'success');
						setTimeout(() => {
							updateWebcamStatus('Bağlantı aktif', 'success');
						}, 3000);
					}
					break;
					
				case 'myPeerId':
					console.log('📨 Karşı tarafın Peer ID\'si alındı:', data.peerId);
					
					// Karşı tarafın peer ID'sini input'a yaz
					const remotePeerIdInput = document.getElementById('remotePeerId');
					if (remotePeerIdInput && data.peerId) {
						// Eğer input boşsa veya farklı bir ID varsa güncelle
						if (!remotePeerIdInput.value || remotePeerIdInput.value !== data.peerId) {
							remotePeerIdInput.value = data.peerId;
							console.log('✅ Karşı tarafın ID\'si kaydedildi:', data.peerId);
							
							// Kullanıcıya bildir
							updateWebcamStatus('✅ Karşı tarafın ID\'si alındı ve kaydedildi!', 'success');
							
							// Input'u vurgula
							remotePeerIdInput.style.background = '#c8e6c9'; // Yeşil vurgu
							setTimeout(() => {
								remotePeerIdInput.style.background = '';
							}, 2000);
						}
					}
					break;
			}
		}
		
		// Karşı tarafa senkronizasyon mesajı gönder
		function sendSyncMessage(message) {
			if (dataConnection && dataConnection.open) {
				dataConnection.send(message);
				console.log('📤 Senkronizasyon mesajı gönderildi:', message);
				return true;
			} else {
				console.warn('⚠️ Data connection açık değil');
				return false;
			}
		}
		
		// Çeviri yönü bilgisini göster
		function updateTranslationInfo() {
			const sourceSelect = document.getElementById('source_lang');
			const targetSelect = document.getElementById('target_lang');
			const translationInfo = document.getElementById('translationInfo');
			const translationDirection = document.getElementById('translationDirection');
			
			if (sourceSelect && targetSelect && translationInfo && translationDirection) {
				const sourceLang = sourceSelect.value;
				const targetLang = targetSelect.value;
				
				const sourceName = languageNames[sourceLang.toUpperCase()] || sourceLang;
				const targetName = languageNames[targetLang.toUpperCase()] || targetLang;
				
				translationDirection.innerHTML = `<strong style="color: #2196F3;">${sourceName}</strong> → <strong style="color: #4CAF50;">${targetName}</strong>`;
				translationInfo.style.display = 'block';
				
				console.log('📊 Çeviri yönü güncellendi:', sourceName, '→', targetName);
			}
		}
		
		// Dil ayarlarını karşı tarafa gönder (Manuel buton)
		function syncLanguageToRemote() {
			// Önce bağlantı kontrolü
			if (!currentCall || !dataConnection || !dataConnection.open) {
				alert('⚠️ Önce video görüşmesi bağlantısını kurun!');
				updateWebcamStatus('⚠️ Dil ayarları gönderilemedi: Bağlantı yok', 'error');
				return;
			}
			
			const sourceSelect = document.getElementById('source_lang');
			const targetSelect = document.getElementById('target_lang');
			
			if (!sourceSelect || !targetSelect) return;
			
			const message = {
				type: 'languageChange',
				sourceLang: sourceSelect.value,
				targetLang: targetSelect.value
			};
			
			if (sendSyncMessage(message)) {
				console.log('📤 Dil ayarları gönderildi: Kaynak=' + message.sourceLang + ', Hedef=' + message.targetLang);
				updateWebcamStatus('✅ Dil ayarları karşı tarafa gönderildi!', 'success');
				
				// Kısa süre sonra normal duruma dön
				setTimeout(() => {
					updateWebcamStatus('Bağlantı aktif', 'success');
				}, 3000);
			} else {
				updateWebcamStatus('❌ Dil ayarları gönderilemedi!', 'error');
			}
		}
		
		// Dil ayarlarını karşı tarafa gönder (Yardımcı fonksiyon)
		function sendLanguageSettings() {
			const sourceSelect = document.getElementById('source_lang');
			const targetSelect = document.getElementById('target_lang');
			
			if (!sourceSelect || !targetSelect) return;
			
			const message = {
				type: 'languageChange',
				sourceLang: sourceSelect.value,
				targetLang: targetSelect.value
			};
			
			if (sendSyncMessage(message)) {
				console.log('📤 Dil ayarları gönderildi: Kaynak=' + message.sourceLang + ', Hedef=' + message.targetLang);
			}
		}
		
		// Manuel ses çalma butonu göster
		function showManualPlayButton(audioElement, url) {
			const statusDiv = document.getElementById('autoTranslationStatus');
			if (!statusDiv) return;
			
			// Eğer zaten buton varsa ekleme
			if (document.getElementById('manualPlayBtn')) return;
			
			const playBtn = document.createElement('button');
			playBtn.id = 'manualPlayBtn';
			playBtn.className = 'webcam-btn';
			playBtn.style.marginTop = '10px';
			playBtn.style.width = '100%';
			playBtn.textContent = '🔊 Sesi Çal (Tarayıcı İzni Gerekli)';
			
			playBtn.onclick = function() {
				audioElement.play().then(() => {
					console.log('✅ Kullanıcı etkileşimi ile ses çalındı');
					playBtn.remove();
					if (autoTranslationActive) {
						addAutoTranslationLog('✅ Ses manuel olarak çalındı. Artık otomatik çalacak.');
					}
				}).catch(err => {
					console.error('❌ Manuel çalma da başarısız:', err);
					alert('Ses çalınamadı: ' + err.message);
				});
			};
			
			statusDiv.appendChild(playBtn);
		}
		
		function repeatLastTranslation() {
			if (!lastTranslationData.audioUrl) {
				alert('⚠️ Henüz çevrilmiş bir ses yok!');
				return;
			}
			
			addAutoTranslationLog('🔁 Son çeviri tekrar çalınıyor: "' + lastTranslationData.translatedText + '"');
			
			// Önce lokalde çal
			playAudioLocally(lastTranslationData.audioUrl);
			
			// Eğer video görüşmesi varsa uzak bilgisayara da gönder
			if (currentCall && currentCall.translation) {
				sendAudioToTranslationChannel(lastTranslationData.audioUrl).then(() => {
					addAutoTranslationLog('✅ Son çeviri lokalde çalındı ve karşı tarafa gönderildi!');
					console.log('✅ Son çeviri lokalde çalındı ve karşı tarafa gönderildi');
				}).catch(err => {
					addAutoTranslationLog('❌ Karşı tarafa gönderim hatası: ' + err.message);
					console.error('❌ Karşı tarafa gönderim hatası:', err);
				});
			} else {
				addAutoTranslationLog('✅ Son çeviri lokalde çalındı (Video görüşmesi yok).');
			}
		}
		
		function toggleAutoTranslation() {
			const toggleBtn = document.getElementById('autoTranslationToggle');
			const statusDiv = document.getElementById('autoTranslationStatus');
			const logDiv = document.getElementById('autoTranslationLog');
			
			if (!autoTranslationActive) {
				// Başlat
				if (!currentCall || !currentCall.translation) {
					alert('⚠️ Önce video görüşmesi bağlantısını kurun!');
					return;
				}
				
				// Tarayıcıdan ses çalma izni al (autoplay policy)
				const dummyAudio = new Audio();
				dummyAudio.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';
				dummyAudio.volume = 0.01;
				
				const playPromise = dummyAudio.play();
				if (playPromise !== undefined) {
					playPromise.then(() => {
						console.log('✅ Tarayıcı ses izni alındı');
						startAutoTranslationMode(toggleBtn, statusDiv, logDiv);
					}).catch(err => {
						console.warn('⚠️ Tarayıcı ses izni alınamadı:', err);
						// Yine de başlat ama kullanıcıya uyar
						alert('⚠️ Tarayıcı ses çalma iznini engelliyor.\n\nİlk çeviride "Sesi Çal" butonuna basmanız gerekecek.\nSonraki çeviriler otomatik çalacak.');
						startAutoTranslationMode(toggleBtn, statusDiv, logDiv);
					});
				} else {
					startAutoTranslationMode(toggleBtn, statusDiv, logDiv);
				}
				
			} else {
				// Durdur
				stopAutoTranslation();
			}
		}
		
		function startAutoTranslationMode(toggleBtn, statusDiv, logDiv) {
			autoTranslationActive = true;
			toggleBtn.textContent = '⏹ Durdur';
			toggleBtn.style.background = '#f44336';
			statusDiv.innerHTML = '🎤 <strong>AKTİF!</strong> Normal konuşma + Otomatik çeviri aktif...';
			statusDiv.style.background = '#c8e6c9';
			statusDiv.style.color = '#2e7d32';
			logDiv.style.display = 'block';
			logDiv.innerHTML = '';
			
			// Normal mikrofon AÇIK KALIYOR (kullanıcı normal konuşabilir)
			// Çeviri sesleri EK olarak gönderilecek
			addAutoTranslationLog('✅ Normal video ses açık. Çeviriler EK olarak gönderilecek.');
			addAutoTranslationLog('💡 Konuşmaya başlayın. Her konuşmanız otomatik çevrilecek.');
			
			// Sürekli dinlemeyi başlat
			if (recognition) {
				recognition.continuous = true;
				recognition.interimResults = false;
				
				try {
					recognition.start();
					addAutoTranslationLog('🎤 Sürekli dinleme başlatıldı. Konuşmaya başlayın...');
				} catch (e) {
					console.error('Recognition start error:', e);
					addAutoTranslationLog('❌ Mikrofon başlatılamadı: ' + e.message);
				}
			}
			
			// Karşı tarafa bildir (senkronize başlasın)
			if (sendSyncMessage({ type: 'autoTranslationStart' })) {
				addAutoTranslationLog('📤 Karşı tarafa "otomatik çeviri başladı" bildirimi gönderildi.');
			}
			
			console.log('🌐 Otomatik çeviri modu başlatıldı');
		}
		
		function stopAutoTranslation() {
			autoTranslationActive = false;
			const toggleBtn = document.getElementById('autoTranslationToggle');
			const statusDiv = document.getElementById('autoTranslationStatus');
			
			toggleBtn.textContent = '▶️ Başlat';
			toggleBtn.style.background = '#4CAF50';
			statusDiv.innerHTML = '⚠️ Otomatik çeviri durduruldu. Normal konuşma devam ediyor.';
			statusDiv.style.background = '#fff';
			statusDiv.style.color = '#666';
			
			// Recognition'ı durdur
			if (recognition) {
				recognition.continuous = false;
				recognition.stop();
			}
			
			// Karşı tarafa bildir
			if (sendSyncMessage({ type: 'autoTranslationStop' })) {
				addAutoTranslationLog('📤 Karşı tarafa "otomatik çeviri durduruldu" bildirimi gönderildi.');
			}
			
			// Normal video ses zaten açık (hiç kapatmadık)
			addAutoTranslationLog('⏹ Otomatik çeviri durduruldu. Normal konuşma devam ediyor.');
			console.log('⏹ Otomatik çeviri modu durduruldu');
		}
		
		function addAutoTranslationLog(message) {
			const logDiv = document.getElementById('autoTranslationLog');
			if (!logDiv) return;
			
			const timestamp = new Date().toLocaleTimeString('tr-TR');
			const logEntry = document.createElement('div');
			logEntry.style.marginBottom = '5px';
			logEntry.style.paddingBottom = '5px';
			logEntry.style.borderBottom = '1px solid #eee';
			logEntry.innerHTML = `<span style="color:#999;">[${timestamp}]</span> ${message}`;
			
			logDiv.appendChild(logEntry);
			logDiv.scrollTop = logDiv.scrollHeight; // Scroll to bottom
			
			// Maksimum 50 log tut
			while (logDiv.children.length > 50) {
				logDiv.removeChild(logDiv.firstChild);
			}
		}
		
		// Bağlantı kesildiğinde otomatik çeviriyi durdur
		const originalDisconnectPeer = disconnectPeer;
		disconnectPeer = function() {
			if (autoTranslationActive) {
				stopAutoTranslation();
			}
			document.getElementById('autoTranslationPanel').style.display = 'none';
			originalDisconnectPeer();
		};
		
    </script>
</body>
</html>

