#!/usr/bin/env python3
"""
Usta Assistant - Web Arayüzü v3
===============================
Marka/Model seçimli, PDF görüntülemeli, DeepL destekli web uygulaması.

Çalıştırma:
    python3 usta_web.py

Erişim:
    http://localhost:5001
    veya
    http://yedekparcaservis.com.tr/usta/
"""

import os
import json
from flask import Flask, render_template_string, request, jsonify, render_template

# Modülleri import et
# Modülleri import et
from smart_search import SmartSearchService
from vision_analyzer import VisionAnalyzer
from smart_translator import SmartTranslator
from analytics_db import AnalyticsDB

app = Flask(__name__)

# Global servisler
search_service = None
vision_analyzer = None
translator = None
analytics_db = None

# API Keys
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "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")
DEEPL_API_KEY = os.getenv("DEEPL_API_KEY", "b121dc7e-8e98-427f-8984-54c4d4f0851e")
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", "AIzaSyCkYVKLxWDPNbQZr0-HM0nlSneEeM9KMjs")
os.environ["GEMINI_API_KEY"] = GEMINI_API_KEY # Global erişim için ortam değişkenine de yaz

# Marka/Model verileri
BRANDS_FILE = os.path.join(os.path.dirname(__file__), "brands_models.json")

# HTML Template
HTML_TEMPLATE = """
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>👷 Usta Assistant</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            min-height: 100vh;
            color: #fff;
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
            padding: 20px;
        }
        
        header {
            text-align: center;
            padding: 20px 0;
            border-bottom: 2px solid #ffcf00;
            margin-bottom: 25px;
        }
        
        header h1 {
            font-size: 2.2em;
            color: #ffcf00;
            margin-bottom: 5px;
        }
        
        header p {
            color: #888;
        }
        
        /* Marka/Model Seçici */
        .selector-box {
            background: rgba(255, 207, 0, 0.1);
            border: 2px solid #ffcf00;
            border-radius: 15px;
            padding: 25px;
            margin-bottom: 25px;
        }
        
        .selector-box h3 {
            color: #ffcf00;
            margin-bottom: 20px;
            font-size: 1.2em;
        }
        
        .selector-row {
            display: flex;
            gap: 20px;
            flex-wrap: wrap;
            align-items: flex-end;
        }
        
        .selector-group {
            flex: 1;
            min-width: 180px;
        }
        
        .selector-group.pdf-selector {
            flex: 2;
            min-width: 300px;
        }
        
        .selector-group label {
            display: block;
            margin-bottom: 8px;
            color: #ccc;
            font-weight: bold;
            font-size: 0.9em;
        }
        
        .selector-group select {
            width: 100%;
            padding: 12px 15px;
            font-size: 1em;
            border: 2px solid #333;
            border-radius: 8px;
            background: #1a1a2e;
            color: #fff;
            cursor: pointer;
        }
        
        .pdf-info {
            margin-top: 15px;
            padding: 12px 15px;
            background: rgba(40, 167, 69, 0.2);
            border-radius: 8px;
            border-left: 4px solid #28a745;
            display: flex;
            align-items: center;
            gap: 15px;
        }
        
        .pdf-type {
            font-size: 1.5em;
        }
        
        .pdf-name {
            flex: 1;
            font-weight: bold;
            color: #28a745;
        }
        
        .pdf-pages {
            background: #333;
            padding: 5px 12px;
            border-radius: 15px;
            font-size: 0.85em;
        }
        
        .search-mode-tabs {
            display: flex;
            gap: 10px;
            margin-bottom: 15px;
        }
        
        .tab-btn {
            flex: 1;
            padding: 10px 15px;
            border: 2px solid #333;
            border-radius: 8px;
            background: #1a1a2e;
            color: #888;
            cursor: pointer;
            transition: all 0.3s;
        }
        
        .tab-btn:hover {
            border-color: #ffcf00;
            color: #fff;
        }
        
        .tab-btn.active {
            border-color: #ffcf00;
            background: rgba(255, 207, 0, 0.2);
            color: #ffcf00;
        }
        
        .search-hint {
            font-size: 0.85em;
            color: #888;
            margin-top: 10px;
            padding-left: 5px;
        }
        
        .selector-group select:focus {
            border-color: #ffcf00;
            outline: none;
        }
        
        .selected-machine {
            background: #28a745;
            padding: 10px 20px;
            border-radius: 25px;
            font-weight: bold;
            display: none;
            align-items: center;
            gap: 10px;
        }
        
        .selected-machine.active {
            display: inline-flex;
        }
        
        /* Arama Kutusu */
        .search-box {
            background: rgba(255, 255, 255, 0.05);
            border-radius: 15px;
            padding: 25px;
            margin-bottom: 25px;
        }
        
        .search-box h3 {
            color: #fff;
            margin-bottom: 15px;
        }
        
        .search-input-group {
            display: flex;
            gap: 15px;
        }
        
        #searchInput {
            flex: 1;
            padding: 15px 20px;
            font-size: 1.1em;
            border: 2px solid #333;
            border-radius: 10px;
            background: #1a1a2e;
            color: #fff;
            outline: none;
        }
        
        #searchInput:focus {
            border-color: #ffcf00;
        }
        
        #searchInput::placeholder {
            color: #666;
        }
        
        .btn {
            padding: 15px 30px;
            font-size: 1.1em;
            font-weight: bold;
            border: none;
            border-radius: 10px;
            cursor: pointer;
            transition: all 0.3s;
        }
        
        .btn-primary {
            background: #ffcf00;
            color: #000;
        }
        
        .btn-primary:hover {
            background: #ffd633;
            transform: translateY(-2px);
        }
        
        .btn-primary:disabled {
            background: #666;
            cursor: not-allowed;
        }
        
        /* İki Sütunlu Layout */
        .main-content {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 25px;
        }
        
        @media (max-width: 1200px) {
            .main-content {
                grid-template-columns: 1fr;
            }
        }
        
        /* Sol Panel - Sonuçlar */
        .results-panel {
            background: rgba(255, 255, 255, 0.05);
            border-radius: 15px;
            padding: 20px;
            max-height: 70vh;
            overflow-y: auto;
        }
        
        .results-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 15px;
            padding-bottom: 15px;
            border-bottom: 1px solid #333;
        }
        
        .results-header h3 {
            color: #ffcf00;
        }
        
        .result-card {
            background: rgba(255, 255, 255, 0.03);
            border-radius: 10px;
            padding: 15px;
            margin-bottom: 10px;
            border-left: 4px solid #28a745;
            cursor: pointer;
            transition: all 0.3s;
        }
        
        .result-card:hover {
            background: rgba(255, 255, 255, 0.08);
            transform: translateX(5px);
        }
        
        .result-card.selected {
            border-left-color: #ffcf00;
            background: rgba(255, 207, 0, 0.1);
        }
        
        .result-title {
            font-weight: bold;
            margin-bottom: 5px;
        }
        
        .result-meta {
            color: #888;
            font-size: 0.85em;
        }
        
        .result-text {
            color: #aaa;
            font-size: 0.9em;
            margin-top: 8px;
            line-height: 1.5;
            max-height: 250px;
            overflow-y: auto;
        }
        
        .result-text-tr {
            color: #28a745;
            border-left: 2px solid #28a745;
            padding-left: 8px;
        }
        
        .result-text-en {
            border-left: 2px solid #666;
            padding-left: 8px;
        }
        
        .result-score {
            float: right;
            background: #28a745;
            padding: 3px 10px;
            border-radius: 15px;
            font-size: 0.85em;
        }
        
        /* Çeviri Karşılaştırma */
        .translation-compare {
            background: rgba(255, 255, 255, 0.03);
            border-radius: 10px;
            padding: 15px;
            margin-top: 15px;
            display: none;
        }
        
        .translation-compare.active {
            display: block;
        }
        
        .translation-compare h5 {
            color: #ffcf00;
            margin-bottom: 10px;
            font-size: 0.9em;
        }
        
        .translation-row {
            display: grid;
            grid-template-columns: 100px 1fr;
            gap: 10px;
            margin-bottom: 10px;
            padding: 8px;
            background: rgba(0,0,0,0.2);
            border-radius: 5px;
        }
        
        .translation-label {
            color: #888;
            font-size: 0.85em;
        }
        
        .translation-label.dict {
            color: #28a745;
        }
        
        .translation-label.deepl {
            color: #17a2b8;
        }
        
        .translation-label.hybrid {
            color: #ffcf00;
        }
        
        /* Rating Sistemi */
        .rating-section {
            margin-top: 15px;
            padding: 15px;
            background: rgba(255, 207, 0, 0.1);
            border-radius: 10px;
            border: 1px solid #ffcf00;
        }
        
        .rating-section h5 {
            color: #ffcf00;
            margin-bottom: 10px;
            font-size: 0.9em;
        }
        
        .star-rating {
            display: flex;
            gap: 5px;
            margin-bottom: 10px;
        }
        
        .star {
            font-size: 1.5em;
            cursor: pointer;
            color: #444;
            transition: color 0.2s;
        }
        
        .star:hover,
        .star.active {
            color: #ffcf00;
        }
        
        .star.hovered {
            color: #ffd633;
        }
        
        .suggestion-input {
            display: none;
            margin-top: 10px;
        }
        
        .suggestion-input.active {
            display: block;
        }
        
        .suggestion-input textarea {
            width: 100%;
            padding: 10px;
            border: 2px solid #333;
            border-radius: 8px;
            background: #1a1a2e;
            color: #fff;
            font-size: 0.9em;
            resize: vertical;
            min-height: 60px;
        }
        
        .suggestion-input textarea:focus {
            border-color: #ffcf00;
            outline: none;
        }
        
        .suggestion-input button {
            margin-top: 10px;
            padding: 8px 20px;
            background: #28a745;
            border: none;
            border-radius: 5px;
            color: #fff;
            cursor: pointer;
        }
        
        .suggestion-input button:hover {
            background: #218838;
        }
        
        .rating-thanks {
            display: none;
            color: #28a745;
            font-size: 0.9em;
        }
        
        .rating-thanks.active {
            display: block;
        }
        
        /* Result Card Rating */
        .result-rating {
            margin-top: 10px;
            padding-top: 10px;
            border-top: 1px solid #333;
        }
        
        .result-rating .mini-stars {
            display: flex;
            gap: 3px;
        }
        
        .result-rating .mini-star {
            font-size: 1em;
            cursor: pointer;
            color: #444;
        }
        
        .result-rating .mini-star:hover,
        .result-rating .mini-star.active {
            color: #ffcf00;
        }
        
        /* Sağ Panel - PDF Görüntüleyici */
        .pdf-panel {
            background: rgba(255, 255, 255, 0.05);
            border-radius: 15px;
            padding: 20px;
        }
        
        .pdf-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 15px;
            padding-bottom: 15px;
            border-bottom: 1px solid #333;
        }
        
        .pdf-header h3 {
            color: #ffcf00;
        }
        
        .page-nav {
            display: flex;
            gap: 10px;
            align-items: center;
        }
        
        .page-nav button {
            padding: 8px 15px;
            background: #333;
            border: none;
            border-radius: 5px;
            color: #fff;
            cursor: pointer;
        }
        
        .page-nav button:hover {
            background: #444;
        }
        
        .pdf-container {
            background: #000;
            border-radius: 10px;
            min-height: 500px;
            max-height: 60vh;
            overflow: auto;
            text-align: center;
        }
        
        .pdf-container img {
            max-width: 100%;
            height: auto;
        }
        
        .pdf-placeholder {
            color: #666;
            padding: 150px 20px;
            text-align: center;
        }
        
        /* Soru-Cevap */
        .qa-section {
            margin-top: 25px;
            background: rgba(255, 255, 255, 0.05);
            border-radius: 15px;
            padding: 20px;
        }
        
        .qa-section h3 {
            color: #ffcf00;
            margin-bottom: 15px;
        }
        
        .question-row {
            display: flex;
            gap: 15px;
            margin-bottom: 15px;
        }
        
        #questionInput {
            flex: 1;
            padding: 12px 15px;
            font-size: 1em;
            border: 2px solid #333;
            border-radius: 8px;
            background: #1a1a2e;
            color: #fff;
        }
        
        .answer-box {
            background: rgba(0, 0, 0, 0.3);
            border-radius: 10px;
            padding: 20px;
            display: none;
        }
        
        .answer-box.active {
            display: block;
        }
        
        .answer-box h4 {
            color: #28a745;
            margin-bottom: 10px;
        }
        
        .confidence-badge {
            display: inline-block;
            padding: 3px 10px;
            border-radius: 15px;
            font-size: 0.85em;
            margin-left: 10px;
        }
        
        .confidence-high { background: rgba(40, 167, 69, 0.3); color: #28a745; }
        .confidence-medium { background: rgba(255, 193, 7, 0.3); color: #ffc107; }
        .confidence-low { background: rgba(220, 53, 69, 0.3); color: #dc3545; }
        
        .loading {
            text-align: center;
            padding: 40px;
            color: #888;
        }
        
        .spinner {
            width: 40px;
            height: 40px;
            border: 3px solid #333;
            border-top-color: #ffcf00;
            border-radius: 50%;
            animation: spin 1s linear infinite;
            margin: 0 auto 15px;
        }
        
        @keyframes spin {
            to { transform: rotate(360deg); }
        }
        
        footer {
            text-align: center;
            padding: 20px;
            color: #666;
            margin-top: 30px;
        }
        
        /* Terim Rating Sistemi */
        .terms-section {
            margin-top: 20px;
            padding: 15px;
            background: rgba(255, 207, 0, 0.1);
            border-radius: 10px;
            border: 1px solid rgba(255, 207, 0, 0.3);
        }
        
        .terms-section h5 {
            color: #ffcf00;
            margin-bottom: 15px;
            font-size: 1em;
        }
        
        .term-item {
            display: flex;
            align-items: center;
            gap: 10px;
            padding: 10px;
            margin-bottom: 8px;
            background: rgba(0, 0, 0, 0.3);
            border-radius: 8px;
            flex-wrap: wrap;
        }
        
        .term-original {
            color: #888;
            font-size: 0.9em;
            min-width: 150px;
        }
        
        .term-arrow {
            color: #ffcf00;
        }
        
        .term-translated {
            color: #28a745;
            font-weight: bold;
            min-width: 150px;
        }
        
        .term-stars {
            display: flex;
            gap: 3px;
            margin-left: auto;
        }
        
        .term-star {
            font-size: 1.2em;
            cursor: pointer;
            color: #444;
            transition: all 0.2s;
        }
        
        .term-star:hover,
        .term-star.active {
            color: #ffcf00;
            transform: scale(1.1);
        }
        
        .term-suggestion {
            width: 100%;
            margin-top: 8px;
            display: none;
        }
        
        .term-suggestion.active {
            display: flex;
            gap: 10px;
            align-items: center;
        }
        
        .term-suggestion input {
            flex: 1;
            padding: 8px 12px;
            border: 2px solid #dc3545;
            border-radius: 5px;
            background: #1a1a2e;
            color: #fff;
            font-size: 0.9em;
        }
        
        .term-suggestion input:focus {
            border-color: #ffcf00;
            outline: none;
        }
        
        .term-suggestion button {
            padding: 8px 15px;
            background: #28a745;
            border: none;
            border-radius: 5px;
            color: #fff;
            cursor: pointer;
            font-size: 0.85em;
        }
        
        .term-suggestion button:hover {
            background: #218838;
        }
        
        .term-saved {
            color: #28a745;
            font-size: 0.85em;
            display: none;
        }
        
        .term-saved.active {
            display: inline;
        }
        
        /* Sözlük Bölümü */
        .dictionary-section {
            background: rgba(255, 255, 255, 0.05);
            border-radius: 15px;
            padding: 20px;
            margin-top: 25px;
            border: 1px solid rgba(40, 167, 69, 0.3);
        }
        
        .dictionary-section h3 {
            color: #28a745;
            margin-bottom: 15px;
        }
        
        .dict-search-row {
            display: flex;
            gap: 10px;
            margin-bottom: 15px;
            flex-wrap: wrap;
        }
        
        .dict-search-row input {
            flex: 1;
            min-width: 200px;
            padding: 12px 15px;
            border: 2px solid #333;
            border-radius: 8px;
            background: #1a1a2e;
            color: #fff;
        }
        
        .dict-search-row input:focus {
            border-color: #28a745;
            outline: none;
        }
        
        .dict-search-row select {
            padding: 12px 15px;
            border: 2px solid #333;
            border-radius: 8px;
            background: #1a1a2e;
            color: #fff;
        }
        
        .dict-results {
            max-height: 400px;
            overflow-y: auto;
            margin-bottom: 20px;
        }
        
        .dict-result-item {
            display: flex;
            align-items: center;
            gap: 15px;
            padding: 12px 15px;
            margin-bottom: 8px;
            background: rgba(40, 167, 69, 0.1);
            border-radius: 8px;
            border-left: 3px solid #28a745;
        }
        
        .dict-result-item.exact {
            border-left-color: #ffcf00;
            background: rgba(255, 207, 0, 0.1);
        }
        
        .dict-term-en {
            flex: 1;
            color: #17a2b8;
            font-weight: bold;
        }
        
        .dict-arrow {
            color: #ffcf00;
            font-size: 1.2em;
        }
        
        .dict-term-tr {
            flex: 1;
            color: #28a745;
            font-weight: bold;
        }
        
        .dict-add-section {
            border-top: 1px solid #333;
            padding-top: 15px;
        }
        
        .dict-add-section h5 {
            color: #ffcf00;
            margin-bottom: 10px;
            font-size: 0.95em;
        }
        
        .dict-add-row {
            display: flex;
            gap: 10px;
            flex-wrap: wrap;
        }
        
        .dict-add-row input {
            flex: 1;
            min-width: 150px;
            padding: 10px 12px;
            border: 2px solid #333;
            border-radius: 5px;
            background: #1a1a2e;
            color: #fff;
        }
        
        .dict-add-row button {
            padding: 10px 20px;
            background: #28a745;
            border: none;
            border-radius: 5px;
            color: #fff;
            cursor: pointer;
        }
        
        .dict-add-row button:hover {
            background: #218838;
        }
        
        .dict-empty {
            text-align: center;
            color: #666;
            padding: 30px;
        }
        
        .dict-stats {
            display: flex;
            gap: 20px;
            margin-bottom: 15px;
            font-size: 0.85em;
            color: #888;
        }
        
        .dict-stats span {
            background: rgba(255, 255, 255, 0.05);
            padding: 5px 12px;
            border-radius: 15px;
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>👷 Usta Assistant</h1>
            <p>İş Makinası Servis Manueli Asistanı</p>
        </header>
        
        <!-- Marka/Model/PDF Seçici -->
        <div class="selector-box">
            <h3>🔧 Makine ve Doküman Seçimi</h3>
            <div class="selector-row">
                <div class="selector-group">
                    <label>1️⃣ Marka</label>
                    <select id="brandSelect" onchange="onBrandChange()">
                        <option value="">-- Marka Seçin --</option>
                    </select>
                </div>
                <div class="selector-group">
                    <label>2️⃣ Model</label>
                    <select id="modelSelect" onchange="onModelChange()">
                        <option value="">-- Önce Marka Seçin --</option>
                    </select>
                </div>
                <div class="selector-group pdf-selector">
                    <label>3️⃣ Doküman</label>
                    <select id="pdfSelect" onchange="onPdfChange()">
                        <option value="">-- Önce Model Seçin --</option>
                    </select>
                </div>
            </div>
            <div class="pdf-info" id="pdfInfo" style="display:none;">
                <span class="pdf-type" id="pdfType">📄</span>
                <span class="pdf-name" id="pdfName">-</span>
                <span class="pdf-pages" id="pdfPages">0 sayfa</span>
            </div>
        </div>
        
        <!-- Arama Kutusu -->
        <div class="search-box">
            <h3>🔍 Arama Yapın</h3>
            <div class="search-mode-tabs">
                <button class="tab-btn active" onclick="setSearchMode('vector')" id="tabVector">📊 Vektör Arama</button>
                <button class="tab-btn" onclick="setSearchMode('pdf')" id="tabPdf">📄 PDF İçinde Ara</button>
            </div>
            <div class="search-input-group">
                <input type="text" id="searchInput" placeholder="Sorununuzu yazın... (örn: hidrolik pompa arızası, motor yağ kapasitesi)">
                <button class="btn btn-primary" id="searchBtn" onclick="search()">🔍 Ara</button>
            </div>
            <div class="search-hint" id="searchHint">
                💡 Vektör arama: Tüm dokümanlarda anlam tabanlı arama yapar
            </div>
        </div>
        
        <!-- Ana İçerik - İki Sütun -->
        <div class="main-content">
            <!-- Sol - Sonuçlar / PDF Listesi -->
            <div class="results-panel" id="resultsPanel">
                <div class="results-header">
                    <h3>📋 <span id="resultsTitle">Sonuçlar</span></h3>
                    <span id="resultCount">-</span>
                </div>
                <div id="resultsList">
                    <div class="pdf-placeholder">
                        Arama sonuçları burada görüntülenecek
                    </div>
                </div>
            </div>
            
            <!-- Sağ - PDF Görüntüleyici -->
            <div class="pdf-panel">
                <div class="pdf-header">
                    <h3>📄 <span id="pdfTitle">PDF Görüntüleyici</span></h3>
                    <div class="page-nav">
                        <button onclick="prevPage()">◀</button>
                        <span>Sayfa <strong id="currentPage">-</strong></span>
                        <button onclick="nextPage()">▶</button>
                    </div>
                </div>
                <div class="pdf-container" id="pdfContainer">
                    <div class="pdf-placeholder">
                        👈 Soldaki sonuçlardan birine tıklayın
                    </div>
                </div>
            </div>
        </div>
        
        <!-- Sözlük Arama -->
        <div class="dictionary-section" id="dictionarySection">
            <h3>📚 Teknik Sözlük</h3>
            <div class="dict-search-row">
                <input type="text" id="dictSearchInput" placeholder="Terim ara (TR/EN)... örn: hidrolik, pump, valve">
                <select id="dictLangSelect">
                    <option value="both">🔄 Her İki Dil</option>
                    <option value="tr">🇹🇷 Türkçe</option>
                    <option value="en">🇬🇧 İngilizce</option>
                </select>
                <button class="btn btn-primary" onclick="searchDictionary()">🔍 Ara</button>
            </div>
            <div id="dictResults" class="dict-results"></div>
            <div class="dict-add-section">
                <h5>➕ Yeni Terim Öner</h5>
                <div class="dict-add-row">
                    <input type="text" id="newTermEn" placeholder="🇬🇧 İngilizce">
                    <input type="text" id="newTermTr" placeholder="🇹🇷 Türkçe">
                    <button onclick="addNewTerm()">Ekle</button>
                </div>
            </div>
        </div>
        
        <!-- Soru-Cevap -->
        <div class="qa-section" id="qaSection">
            <h3>❓ Bu sayfa hakkında soru sorun</h3>
            <div class="question-row">
                <input type="text" id="questionInput" placeholder="Soru yazın... (örn: basınç değeri ne?, bu parçanın numarası?)">
                <button class="btn btn-primary" onclick="askQuestion()">💬 Sor</button>
            </div>
            <div class="answer-box" id="answerBox">
                <h4>🤖 AI Cevabı <span class="confidence-badge" id="confidenceBadge"></span></h4>
                <div id="answerContent"></div>
                
                <!-- Çeviri Karşılaştırması -->
                <div class="translation-compare" id="translationCompare">
                    <h5>🔤 Çeviri Karşılaştırması</h5>
                    <div class="translation-row">
                        <span class="translation-label dict">📕 Sözlük:</span>
                        <span id="dictTranslation">-</span>
                    </div>
                    <div class="translation-row">
                        <span class="translation-label deepl">🌐 DeepL:</span>
                        <span id="deeplTranslation">-</span>
                    </div>
                    <div class="translation-row">
                        <span class="translation-label hybrid">🔀 Hibrit:</span>
                        <span id="hybridTranslation">-</span>
                    </div>
                </div>
                
                <!-- Kullanılan Terimler ve Rating -->
                <div class="terms-section" id="termsSection" style="display:none;">
                    <h5>📚 Çeviride Kullanılan Terimler (Puanlayın!)</h5>
                    <div id="termsList"></div>
                    <p style="color:#888;font-size:0.8em;margin-top:10px;">
                        ⭐ Çeviriye puan verin. Yanlışsa doğrusunu yazın, sözlüğümüz gelişsin!
                    </p>
                </div>
            </div>
        </div>
        
        <footer>
            Usta Assistant v2.0 | Sözlük: 13,205 terim | Vektör DB: 3M+ sayfa
        </footer>
    </div>
    
    <script>
        // Global değişkenler
        let brandsData = {};
        let selectedBrand = '';
        let selectedModel = '';
        let selectedResult = null;
        let currentPageNum = 1;
        let searchResults = [];
        let currentPdfPath = '';
        
        // Sayfa yüklenince markaları getir
        document.addEventListener('DOMContentLoaded', loadBrands);
        
        // Enter ile arama
        document.getElementById('searchInput').addEventListener('keypress', e => {
            if (e.key === 'Enter') search();
        });
        document.getElementById('questionInput').addEventListener('keypress', e => {
            if (e.key === 'Enter') askQuestion();
        });
        
        async function loadBrands() {
            try {
                const response = await fetch('/usta/api/brands');
                const data = await response.json();
                
                // Format: {brand: [model1, model2, ...]}
                brandsData = data;
                
                const brandSelect = document.getElementById('brandSelect');
                brandSelect.innerHTML = '<option value="">-- Marka Seçin --</option>';
                
                Object.keys(brandsData).sort().forEach(brand => {
                    brandSelect.innerHTML += `<option value="${brand}">${brand}</option>`;
                });
                
                console.log(`${Object.keys(brandsData).length} marka yüklendi`);
            } catch (error) {
                console.error('Marka yükleme hatası:', error);
            }
        }
        
        function onBrandChange() {
            const brandSelect = document.getElementById('brandSelect');
            const modelSelect = document.getElementById('modelSelect');
            selectedBrand = brandSelect.value;
            selectedModel = '';
            
            modelSelect.innerHTML = '<option value="">-- Model Seçin --</option>';
            document.getElementById('pdfSelect').innerHTML = '<option value="">-- Önce Model Seçin --</option>';
            
            if (selectedBrand && brandsData[selectedBrand]) {
                // Format: brandsData[brand] = [model1, model2, ...]
                const models = brandsData[selectedBrand];
                models.forEach(model => {
                    modelSelect.innerHTML += `<option value="${model}">${model}</option>`;
                });
                console.log(`${selectedBrand}: ${models.length} model`);
            }
            
            updateMachineDisplay();
        }
        
        function onModelChange() {
            selectedModel = document.getElementById('modelSelect').value;
            updateMachineDisplay();
            
            // Model seçilince PDF listesini yükle
            if (selectedBrand && selectedModel) {
                loadPdfList();
            } else {
                // PDF seçiciyi sıfırla
                const pdfSelect = document.getElementById('pdfSelect');
                pdfSelect.innerHTML = '<option value="">-- Önce Model Seçin --</option>';
                document.getElementById('pdfInfo').style.display = 'none';
            }
        }
        
        // PDF listesini yükle
        async function loadPdfList() {
            const pdfSelect = document.getElementById('pdfSelect');
            pdfSelect.innerHTML = '<option value="">⏳ Yükleniyor...</option>';
            
            try {
                const response = await fetch('/usta/api/pdfs', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({
                        brand: selectedBrand,
                        model: selectedModel
                    })
                });
                
                const data = await response.json();
                
                if (!data.success) {
                    pdfSelect.innerHTML = '<option value="">❌ Hata: ' + data.error + '</option>';
                    return;
                }
                
                pdfSelect.innerHTML = '<option value="">-- Doküman Seçin (' + data.total + ' adet) --</option>';
                
                // PDF türlerine göre grupla
                const byType = { parts: [], repair: [], operator: [], manual: [] };
                data.pdfs.forEach(pdf => {
                    byType[pdf.type] = byType[pdf.type] || [];
                    byType[pdf.type].push(pdf);
                });
                
                // Grupları ekle
                const typeLabels = {
                    parts: '📦 Parça Katalogları',
                    repair: '🔧 Tamir/Servis Kılavuzları',
                    operator: '👷 Operatör Kılavuzları',
                    manual: '📄 Diğer Dokümanlar'
                };
                
                for (const [type, pdfs] of Object.entries(byType)) {
                    if (pdfs.length === 0) continue;
                    
                    const optgroup = document.createElement('optgroup');
                    optgroup.label = typeLabels[type];
                    
                    pdfs.forEach(pdf => {
                        const opt = document.createElement('option');
                        opt.value = pdf.path;
                        opt.textContent = pdf.filename;
                        opt.dataset.type = pdf.type;
                        optgroup.appendChild(opt);
                    });
                    
                    pdfSelect.appendChild(optgroup);
                }
                
            } catch (error) {
                pdfSelect.innerHTML = '<option value="">❌ ' + error.message + '</option>';
            }
        }
        
        // PDF seçildiğinde
        function onPdfChange() {
            const pdfSelect = document.getElementById('pdfSelect');
            const selectedPdf = pdfSelect.value;
            
            if (selectedPdf) {
                selectPdfFromList(selectedPdf);
            } else {
                document.getElementById('pdfInfo').style.display = 'none';
            }
        }
        
        // PDF'i seç ve aç
        async function selectPdfFromList(pdfPath) {
            // PDF bilgilerini al
            try {
                const response = await fetch('/usta/api/pdf-pages', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ pdf_path: pdfPath })
                });
                
                const data = await response.json();
                
                if (data.success) {
                    currentPdfPath = data.pdf_path;
                    currentPage = 1;
                    totalPages = data.page_count;
                    
                    // PDF bilgi panelini güncelle
                    document.getElementById('pdfInfo').style.display = 'flex';
                    document.getElementById('pdfName').textContent = pdfPath.split('/').pop();
                    document.getElementById('pdfPages').textContent = totalPages + ' sayfa';
                    
                    // İlk sayfayı göster
                    loadPdfPage(currentPdfPath, 1);
                    
                    // Arama modunu PDF'e çevir
                    setSearchMode('pdf');
                }
            } catch (error) {
                console.error('PDF yükleme hatası:', error);
            }
        }
        
        // Arama modu
        let searchMode = 'vector';
        
        function setSearchMode(mode) {
            searchMode = mode;
            
            document.getElementById('tabVector').classList.toggle('active', mode === 'vector');
            document.getElementById('tabPdf').classList.toggle('active', mode === 'pdf');
            
            const hint = document.getElementById('searchHint');
            if (mode === 'vector') {
                hint.textContent = '💡 Vektör arama: Tüm dokümanlarda anlam tabanlı arama yapar';
            } else {
                hint.textContent = '💡 PDF içinde arama: Seçili doküman içinde metin arar';
            }
        }
        
        function updateMachineDisplay() {
            // Artık gerek yok - PDF info paneli kullanılıyor
        }
        
        async function search() {
            const query = document.getElementById('searchInput').value.trim();
            
            if (!query) {
                alert('Lütfen arama sorgusu girin!');
                return;
            }
            
            document.getElementById('resultsList').innerHTML = '<div class="loading"><div class="spinner"></div>Aranıyor...</div>';
            document.getElementById('searchBtn').disabled = true;
            document.getElementById('resultsTitle').textContent = 'Sonuçlar';
            
            try {
                if (searchMode === 'pdf' && currentPdfPath) {
                    // PDF içinde arama
                    await searchInPdf(query);
                } else {
                    // Vektör arama
                    await searchVector(query);
                }
            } catch (error) {
                document.getElementById('resultsList').innerHTML = `<div class="pdf-placeholder">❌ Hata: ${error.message}</div>`;
            } finally {
                document.getElementById('searchBtn').disabled = false;
            }
        }
        
        async function searchVector(query) {
            // DOĞRU: Sorguyu olduğu gibi gönder, marka/model SADECE filtre olarak kullanılsın
            // Marka/model sorguya EKLENMEMELİ çünkü vektörler PDF içeriğinden oluşturulmuş
            
            const response = await fetch('/usta/api/search', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ 
                    query: query, 
                    brand: selectedBrand, 
                    model: selectedModel,
                    pdf_filter: typeof currentPdfPath !== 'undefined' ? currentPdfPath : '', // PDF Filtresi
                    limit: 100
                })
            });
            
            const data = await response.json();
            
            if (!data.success) {
                throw new Error(data.error);
            }
            
            searchResults = data.results;
            displayResults(data);
        }
        
        async function searchInPdf(query) {
            // PDF içinde metin arama (henüz implementasyon yok - vektör araması yapıp PDF'e filtrele)
            const response = await fetch('/usta/api/search', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ 
                    query: query,
                    pdf_filter: currentPdfPath,
                    limit: 50
                })
            });
            
            const data = await response.json();
            
            if (!data.success) {
                throw new Error(data.error);
            }
            
            // Backend zaten doğru filtreleme yapıyor, client tarafında tekrar elemeye gerek yok
            // data.results = data.results ... (KALDIRILDI)
            
            searchResults = data.results;
            displayResults(data);
        }
        
        function displayResults(data) {
            const list = document.getElementById('resultsList');
            const count = document.getElementById('resultCount');
            
            count.textContent = `${data.results.length} sonuç (${data.search_time_ms}ms)`;
            
            if (data.results.length === 0) {
                list.innerHTML = '<div class="pdf-placeholder">Sonuç bulunamadı</div>';
                return;
            }
            
            list.innerHTML = data.results.map((r, i) => `
                <div class="result-card" onclick="selectResult(${i})" data-index="${i}">
                    <span class="result-score">${(r.score * 100).toFixed(0)}%</span>
                    <div class="result-title">${r.pdf_filename || 'PDF'}</div>
                    <div class="result-meta">📄 Sayfa ${r.page_number || '-'}</div>
                    ${r.text_tr ? `
                        <div class="result-text result-text-tr">🇹🇷 ${r.text_tr.substring(0, 800)}${r.text_tr.length > 800 ? '...' : ''}</div>
                        <div class="result-text result-text-en" style="color:#666;font-size:0.8em;margin-top:5px;">🇬🇧 ${(r.text_original || r.text || '').substring(0, 600)}${(r.text_original || r.text || '').length > 600 ? '...' : ''}</div>
                    ` : (r.text ? `<div class="result-text">${r.text.substring(0, 600)}${r.text.length > 600 ? '...' : ''}</div>` : '')}
                </div>
            `).join('');
            
            // İlk sonucu otomatik seç
            if (data.results.length > 0) {
                selectResult(0);
            }
        }
        
        function selectResult(index) {
            if (!searchResults[index]) return;
            
            selectedResult = searchResults[index];
            currentPageNum = selectedResult.page_number || 1;
            
            // Seçili kartı işaretle
            document.querySelectorAll('.result-card').forEach(c => c.classList.remove('selected'));
            document.querySelector(`.result-card[data-index="${index}"]`)?.classList.add('selected');
            
            // PDF başlığını güncelle
            document.getElementById('pdfTitle').textContent = selectedResult.pdf_filename || 'PDF';
            
            // Sayfayı yükle
            loadPdfPage(selectedResult.pdf_path, currentPageNum);
            
            // Cevap kutusunu temizle
            document.getElementById('answerBox').classList.remove('active');
        }
        
        async function loadPdfPage(pdfPath, pageNum) {
            const container = document.getElementById('pdfContainer');
            container.innerHTML = '<div class="loading"><div class="spinner"></div>Sayfa yükleniyor...</div>';
            document.getElementById('currentPage').textContent = pageNum;
            
            try {
                const response = await fetch('/usta/api/page-image', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ pdf_path: pdfPath, page_number: pageNum })
                });
                
                const data = await response.json();
                
                if (!data.success) {
                    container.innerHTML = `<div class="pdf-placeholder">❌ ${data.error}</div>`;
                    return;
                }
                
                container.innerHTML = `<img src="${data.image}" alt="Sayfa ${pageNum}">`;
                currentPageNum = pageNum;
                
            } catch (error) {
                container.innerHTML = `<div class="pdf-placeholder">❌ ${error.message}</div>`;
            }
        }
        
        function prevPage() {
            if (!selectedResult || currentPageNum <= 1) return;
            loadPdfPage(selectedResult.pdf_path, currentPageNum - 1);
        }
        
        function nextPage() {
            if (!selectedResult) return;
            loadPdfPage(selectedResult.pdf_path, currentPageNum + 1);
        }
        
        // Mevcut terimler (rating için)
        let currentTerms = [];
        
        async function askQuestion() {
            if (!selectedResult) {
                alert('Önce bir sonuç seçin!');
                return;
            }
            
            const question = document.getElementById('questionInput').value.trim();
            if (!question) return;
            
            const answerBox = document.getElementById('answerBox');
            const answerContent = document.getElementById('answerContent');
            const translationCompare = document.getElementById('translationCompare');
            const termsSection = document.getElementById('termsSection');
            
            answerContent.innerHTML = '<div class="spinner" style="width:25px;height:25px;margin:0;display:inline-block;vertical-align:middle;"></div> Analiz ediliyor...';
            answerBox.classList.add('active');
            translationCompare.classList.remove('active');
            termsSection.style.display = 'none';
            
            try {
                const response = await fetch('/usta/api/ask', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({
                        pdf_path: selectedResult.pdf_path,
                        page_number: currentPageNum,
                        question: question,
                        brand: selectedBrand,
                        model: selectedModel
                    })
                });
                
                const data = await response.json();
                
                if (!data.success) {
                    throw new Error(data.error);
                }
                
                // Ana cevabı göster (hibrit veya en iyi çeviri)
                answerContent.textContent = data.answer;
                
                const badge = document.getElementById('confidenceBadge');
                badge.textContent = data.confidence;
                badge.className = 'confidence-badge confidence-' + data.confidence;
                
                // Çeviri karşılaştırmasını göster
                if (data.translations) {
                    document.getElementById('dictTranslation').textContent = data.translations.dictionary || '-';
                    document.getElementById('deeplTranslation').textContent = data.translations.deepl || '-';
                    document.getElementById('hybridTranslation').textContent = data.translations.hybrid || '-';
                    translationCompare.classList.add('active');
                }
                
                // Kullanılan terimleri göster
                if (data.used_terms && data.used_terms.length > 0) {
                    currentTerms = data.used_terms;
                    displayTerms(data.used_terms);
                    termsSection.style.display = 'block';
                }
                
            } catch (error) {
                answerContent.textContent = '❌ ' + error.message;
            }
        }
        
        function displayTerms(terms) {
            const termsList = document.getElementById('termsList');
            termsList.innerHTML = terms.map((term, i) => `
                <div class="term-item" data-index="${i}">
                    <span class="term-original">🇬🇧 ${term.en}</span>
                    <span class="term-arrow">→</span>
                    <span class="term-translated">🇹🇷 ${term.tr}</span>
                    <div class="term-stars">
                        ${[1,2,3,4,5].map(star => `
                            <span class="term-star" data-term="${i}" data-star="${star}" onclick="rateTerm(${i}, ${star})">☆</span>
                        `).join('')}
                    </div>
                    <span class="term-saved" id="termSaved${i}">✓ Kaydedildi</span>
                    <div class="term-suggestion" id="termSuggestion${i}">
                        <input type="text" placeholder="Doğru çeviri nedir?" id="termInput${i}">
                        <button onclick="submitTermSuggestion(${i})">Gönder</button>
                    </div>
                </div>
            `).join('');
        }
        
        function rateTerm(termIndex, rating) {
            const term = currentTerms[termIndex];
            const stars = document.querySelectorAll(`.term-star[data-term="${termIndex}"]`);
            
            // Yıldızları güncelle
            stars.forEach((star, i) => {
                if (i < rating) {
                    star.textContent = '★';
                    star.classList.add('active');
                } else {
                    star.textContent = '☆';
                    star.classList.remove('active');
                }
            });
            
            // Düşük puan ise öneri input'unu göster
            const suggestionDiv = document.getElementById(`termSuggestion${termIndex}`);
            if (rating <= 2) {
                suggestionDiv.classList.add('active');
            } else {
                suggestionDiv.classList.remove('active');
                // Yüksek puan, direkt kaydet
                saveTermRating(termIndex, rating, '');
            }
        }
        
        async function submitTermSuggestion(termIndex) {
            const term = currentTerms[termIndex];
            const suggestion = document.getElementById(`termInput${termIndex}`).value.trim();
            const stars = document.querySelectorAll(`.term-star[data-term="${termIndex}"].active`);
            const rating = stars.length || 1;
            
            if (!suggestion) {
                alert('Lütfen doğru çeviriyi yazın');
                return;
            }
            
            await saveTermRating(termIndex, rating, suggestion);
        }
        
        // ========== SÖZLÜK FONKSİYONLARI ==========
        
        // Enter ile arama
        document.getElementById('dictSearchInput')?.addEventListener('keypress', e => {
            if (e.key === 'Enter') searchDictionary();
        });
        
        async function searchDictionary() {
            const query = document.getElementById('dictSearchInput').value.trim();
            const lang = document.getElementById('dictLangSelect').value;
            const resultsDiv = document.getElementById('dictResults');
            
            if (!query || query.length < 2) {
                resultsDiv.innerHTML = '<div class="dict-empty">En az 2 karakter girin</div>';
                return;
            }
            
            resultsDiv.innerHTML = '<div class="loading"><div class="spinner"></div>Aranıyor...</div>';
            
            try {
                const response = await fetch('/usta/api/dictionary/search', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ query, lang, limit: 100 })
                });
                
                const data = await response.json();
                
                if (!data.success) {
                    throw new Error(data.error);
                }
                
                if (data.results.length === 0) {
                    resultsDiv.innerHTML = `<div class="dict-empty">❌ "${query}" için sonuç bulunamadı.<br>Yeni terim önerebilirsiniz! 👇</div>`;
                    return;
                }
                
                resultsDiv.innerHTML = `
                    <div class="dict-stats">
                        <span>📊 ${data.total} sonuç bulundu</span>
                    </div>
                    ${data.results.map(r => `
                        <div class="dict-result-item ${r.match_type}">
                            <span class="dict-term-en">🇬🇧 ${r.en}</span>
                            <span class="dict-arrow">⟷</span>
                            <span class="dict-term-tr">🇹🇷 ${r.tr}</span>
                        </div>
                    `).join('')}
                `;
                
            } catch (error) {
                resultsDiv.innerHTML = `<div class="dict-empty">❌ Hata: ${error.message}</div>`;
            }
        }
        
        async function addNewTerm() {
            const enTerm = document.getElementById('newTermEn').value.trim();
            const trTerm = document.getElementById('newTermTr').value.trim();
            
            if (!enTerm || !trTerm) {
                alert('Lütfen her iki terimi de girin');
                return;
            }
            
            try {
                const response = await fetch('/usta/api/dictionary/add', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({
                        english: enTerm,
                        turkish: trTerm,
                        context: `${selectedBrand} ${selectedModel}`
                    })
                });
                
                const data = await response.json();
                
                if (data.success) {
                    alert('✅ ' + data.message);
                    document.getElementById('newTermEn').value = '';
                    document.getElementById('newTermTr').value = '';
                } else {
                    alert('❌ ' + data.error);
                }
            } catch (error) {
                alert('❌ Hata: ' + error.message);
            }
        }
        
        // ========== TERİM RATING FONKSİYONLARI ==========
        
        async function saveTermRating(termIndex, rating, suggestion) {
            const term = currentTerms[termIndex];
            
            try {
                const response = await fetch('/usta/api/rate-term', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({
                        english_term: term.en,
                        turkish_term: term.tr,
                        rating: rating,
                        suggestion: suggestion,
                        brand: selectedBrand,
                        model: selectedModel
                    })
                });
                
                const data = await response.json();
                
                if (data.success) {
                    // Kaydedildi göster
                    document.getElementById(`termSaved${termIndex}`).classList.add('active');
                    document.getElementById(`termSuggestion${termIndex}`).classList.remove('active');
                }
            } catch (error) {
                console.error('Rating kayıt hatası:', error);
            }
        }
    </script>
</body>
</html>
"""


def init_services():
    """Servisleri başlat"""
    global search_service, vision_analyzer, translator, analytics_db
    
    if search_service is None:
        search_service = SmartSearchService(openai_api_key=OPENAI_API_KEY)
    
    if vision_analyzer is None:
        # Dictionary path'i SmartTranslator kullanacak
        vision_analyzer = VisionAnalyzer(openai_api_key=OPENAI_API_KEY)
    
    if translator is None:
        translator = SmartTranslator(api_key=GEMINI_API_KEY)
    
    if analytics_db is None:
        analytics_db = AnalyticsDB()


def load_brands():
    """Marka/Model verilerini yükle"""
    try:
        with open(BRANDS_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    except:
        return {"brands": {}, "document_types": {}}


@app.route('/usta/')
def index():
    """Ana sayfa - Yeni Versiyon (v3)"""
    try:
        with open('/var/www/html/PEPCVSON/templates/index_v3.html', 'r', encoding='utf-8') as f:
            return f.read()
    except Exception as e:
        return f"Şablon hatası: {e}"


@app.route('/usta/api/brands', methods=['POST', 'GET'])
def api_brands():
    """Marka listesi API - JSON katalogdan"""
    try:
        # Katalog yolu düzeltildi (/var/www/html/PEPCVSON/pdf_catalog.json)
        # __file__ scripts klasöründe olduğu için bir üst dizine çıkmalı veya tam yol verilmeli
        catalog_path = '/var/www/html/PEPCVSON/pdf_catalog.json'
        
        if os.path.exists(catalog_path):
            with open(catalog_path, 'r', encoding='utf-8') as f:
                catalog = json.load(f)
            
            # Sadece marka isimlerini liste olarak döndür
            brand_names = sorted(list(catalog.get('brands', {}).keys()))
            return jsonify({'brands': brand_names})
        else:
            return jsonify({'error': 'Katalog bulunamadı'})
    except Exception as e:
        return jsonify({'error': str(e)})


@app.route('/usta/api/models', methods=['POST'])
def api_models():
    """Seçilen marka için model listesi"""
    try:
        data = request.get_json()
        brand = data.get('brand', '')
        
        catalog_path = '/var/www/html/PEPCVSON/pdf_catalog.json'
        with open(catalog_path, 'r', encoding='utf-8') as f:
             catalog = json.load(f)
             
        brand_data = catalog.get('brands', {}).get(brand, {})
        models = sorted(list(brand_data.get('models', {}).keys()))
        
        return jsonify({'models': models})
    except Exception as e:
        return jsonify({'error': str(e)})


@app.route('/usta/api/pdfs', methods=['POST'])
def api_pdfs():
    """Marka/Model için PDF listesi API - pdf_catalog.json'dan"""
    try:
        data = request.get_json()
        brand = data.get('brand', '')
        model = data.get('model', '')
        
        if not brand:
            return jsonify({'success': False, 'error': 'Marka seçilmeli'})
        
        # PDF Katalog yükle
        catalog_path = '/var/www/html/PEPCVSON/pdf_catalog.json'
        
        if not os.path.exists(catalog_path):
             return jsonify({'success': False, 'error': 'Katalog bulunamadı'})
        
        with open(catalog_path, 'r', encoding='utf-8') as f:
            catalog = json.load(f)
            
        # Marka bul (case-insensitive)
        brand_data = None
        for k, v in catalog.get('brands', {}).items():
            if k.upper() == brand.upper():
                brand_data = v
                break
                    
        if not brand_data:
            return jsonify({'success': True, 'total': 0, 'pdfs': []})
            
        pdf_list = []
        models_data = brand_data.get('models', {})
        
        if model and model.upper() != "HEPSİ":
            # Spesifik model ara (case-insensitive)
            model_pdfs = None
            for m_key, m_data in models_data.items():
                if m_key.upper() == model.upper():
                    model_pdfs = m_data.get('pdfs', [])
                    break
            
            if model_pdfs:
                for p in model_pdfs:
                    pdf_list.append({
                        'filename': p.get('filename', ''),
                        'path': p.get('path', ''),
                        'type': p.get('type', 'manual')
                    })
        else:
            # Tüm modellerin PDF'lerini getir
            for m_name, m_data in models_data.items():
                for p in m_data.get('pdfs', []):
                    pdf_list.append({
                        'filename': f"[{m_name}] {p.get('filename', '')}",
                        'path': p.get('path', ''),
                        'type': p.get('type', 'manual')
                    })

        # Sırala (İsme göre)
        pdf_list.sort(key=lambda x: x['filename'])
        
        return jsonify({
            'success': True,
            'brand': brand,
            'model': model,
            'total': len(pdf_list),
            'pdfs': pdf_list
        })
        
    except Exception as e:
        import traceback
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/pdf-pages', methods=['POST'])
def api_pdf_pages():
    """PDF sayfa sayısını ve bilgilerini döndür"""
    try:
        init_services()
        
        data = request.get_json()
        pdf_path = data.get('pdf_path', '')
        
        if not pdf_path:
            return jsonify({'success': False, 'error': 'PDF yolu gerekli'})
        
        # PDF yolunu düzelt
        if pdf_path.startswith('/pdfs/'):
            pdf_path = pdf_path.replace('/pdfs/', '/mnt/pdfs/')
        
        import fitz
        
        if not os.path.exists(pdf_path):
            # Alternatif yol dene
            alt_path = pdf_path.replace('/home/poyraz/pdfs/', '/mnt/pdfs/')
            if os.path.exists(alt_path):
                pdf_path = alt_path
            else:
                return jsonify({'success': False, 'error': f'PDF bulunamadı: {pdf_path}'})
        
        doc = fitz.open(pdf_path)
        page_count = len(doc)
        doc.close()
        
        return jsonify({
            'success': True,
            'pdf_path': pdf_path,
            'page_count': page_count
        })
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/speed-test')
def speed_test():
    """Hızlı test sayfası"""
    with open('/var/www/html/PEPCVSON/templates/speed_test.html', 'r', encoding='utf-8') as f:
        return f.read()

@app.route('/usta/api/search', methods=['POST'])
def api_search():
    """Arama API - DeepL destekli metin çevirisi + Analytics"""
    try:
        init_services()
        
        data = request.get_json()
        query = data.get('query', '')
        brand = data.get('brand', '').upper()
        model = data.get('model', '').upper()
        model = data.get('model', '').upper()
        pdf_filter = data.get('pdf_filter', '')
        limit = data.get('limit', 50)
        session_id = data.get('session_id', '')
        
        if not query:
            return jsonify({'success': False, 'error': 'Sorgu boş olamaz'})
        
        import time
        t_start = time.time()
        
        # Daha fazla sonuç al (filtreleme sonrası azalabilir)
        # PDF Filtresi için sadece dosya adını al
        pdf_filter_filename = os.path.basename(pdf_filter) if pdf_filter else None
        
        # print(f"DEBUG SEARCH REQ: Filter Raw='{pdf_filter}' -> Filename='{pdf_filter_filename}'")
        
        # Filtre varsa limit 100 yeterli
        search_limit = 100 if pdf_filter_filename else (limit * 5)
        
        # Native Filtering Kullan
        print(f"⏱️ Arama Başlıyor: Query='{query}', Filter='{pdf_filter_filename}'")
        result = search_service.search(query, limit=search_limit, pdf_filter=pdf_filter_filename)
        
        t_search = time.time() - t_start
        print(f"✅ Arama Bitti. Süre: {t_search:.2f}sn. Sonuç: {len(result.results)} adet")
        
        # Marka/Model filtresi uygula (PDF yolunda ara)
        # Türkçe karakterleri normalize et
        def normalize_turkish(text):
            """Türkçe karakterleri normalize et (hem büyük hem küçük harf uyumu)"""
            if not text:
                return ""
            text = text.upper()
            # Türkçe karakter dönüşümleri
            tr_map = {
                'İ': 'I', 'Ş': 'S', 'Ğ': 'G', 'Ü': 'U', 'Ö': 'O', 'Ç': 'C',
                'ı': 'I', 'ş': 'S', 'ğ': 'G', 'ü': 'U', 'ö': 'O', 'ç': 'C'
            }
            for tr_char, en_char in tr_map.items():
                text = text.replace(tr_char, en_char)
            return text
        
        brand_normalized = normalize_turkish(brand)
        model_normalized = normalize_turkish(model)
        
        filtered_results = []
        for r in result.results:
            # Path normalizasyonu - Veritabanındaki farklı formatları eşle
            # Hata düzeltme: pdf_path değişkenini burada tanımlıyoruz
            pdf_path = normalize_turkish(r.pdf_path) if r.pdf_path else ""
            pdf_name = normalize_turkish(r.pdf_filename) if r.pdf_filename else ""
            
            db_path = r.pdf_path
            
            # Veritabanında "pdfs/" ile başlıyorsa temizle
            if db_path.startswith("pdfs/"):
                db_path = db_path[5:]
            elif db_path.startswith("/home/poyraz/pdfs/"):
                db_path = db_path[18:]
                
            # Filter path normalizasyonu
            filter_path_clean = pdf_filter
            if filter_path_clean.startswith("/mnt/pdfs/"):
                filter_path_clean = filter_path_clean[10:]
            elif filter_path_clean.startswith("pdfs/"):
                filter_path_clean = filter_path_clean[5:]

            # PDF Filtresi (Dosya adı ve Path Eşleşmesi)
            if pdf_filter:
                # 1. Dosya Adı Kontrolü (En güvenilir)
                filter_filename = os.path.basename(pdf_filter)
                db_filename = r.pdf_filename or os.path.basename(db_path)
                
                # Debug Check (Gürültü yapmaması için kapattım)
                # print(f"DEBUG FILTER: Filter={filter_filename} | DB_File={db_filename} | DB_Path={db_path}")

            # Native Filtering kullandığımız için Python filtrelemeyi kaldırıyoruz
            # Ancak yine de emin olmak için basit bir kontrol bırakabiliriz
            if pdf_filter:
                filter_filename = os.path.basename(pdf_filter)
                db_filename = r.pdf_filename or os.path.basename(r.pdf_path or "")
                
                # Çok gevşek kontrol (büyük/küçük harf vs. SmartSearch halletmiş olmalı ama)
                if filter_filename.lower() not in db_filename.lower():
                     # Yine de sonuç gelmişse yazdıralım, belki varyasyondur
                     print(f"INFO: Native filter result '{db_filename}' vs target '{filter_filename}'")

            # Filtre kontrolü
            if brand_normalized and brand_normalized not in pdf_path and brand_normalized not in pdf_name:
                continue
            if model_normalized and model_normalized not in pdf_path and model_normalized not in pdf_name:
                continue
            
            filtered_results.append(r)
            
            if len(filtered_results) >= limit:
                break
        
        # Sonuçları işle ve metinleri çevir
        results_data = []
        for r in filtered_results:
            r_dict = r.to_dict()
            
            # Metin varsa DeepL ile çevir (10 satır = ~1000 karakter)
            original_text = r_dict.get('text', '')
            
            # HIZ OPTİMİZASYONU:
            # Liste görünümünde her sonucu tek tek çevirmek (100 * 2sn) sistemi kilitliyordu.
            # Bu yüzden çeviriyi atlıyoruz. Sadece orijinal metni gösteriyoruz.
            r_dict['text_tr'] = original_text
            r_dict['text_original'] = original_text
            
            results_data.append(r_dict)
        
        # Analytics kaydı
        if analytics_db and results_data:
            top_result = results_data[0] if results_data else {}
            analytics_db.log_search(
                brand=brand,
                model=model,
                query_text=query,
                query_english=result.search_query if hasattr(result, 'search_query') else '',
                results_count=len(results_data),
                top_result_pdf=top_result.get('pdf_path', ''),
                top_result_page=top_result.get('page_number', 0),
                top_result_score=top_result.get('score', 0),
                search_time_ms=result.search_time_ms,
                session_id=session_id
            )
        
        return jsonify({
            'success': True,
            'query': query,
            'brand': brand,
            'model': model,
            'search_time_ms': result.search_time_ms,
            'results': results_data
        })
        
    except Exception as e:
        import traceback
        traceback.print_exc()
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/translate', methods=['POST'])
def api_translate():
    """İsteğe bağlı metin çevirisi"""
    try:
        init_services()
        data = request.get_json()
        text = data.get('text', '')
        
        if not text:
            return jsonify({'success': False, 'error': 'Metin gerekli'})

        # Gemini ile çevir
        if translator:
            res = translator.translate(text, "EN", "TR")
            return jsonify({'success': True, 'text_tr': res.translated_text})
        else:
            return jsonify({'success': False, 'error': 'Translator servisi başlatılamadı'})

    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/test-translator')
def test_translator_page():
    try:
        with open('/var/www/html/PEPCVSON/templates/test_translator.html', 'r', encoding='utf-8') as f:
            return f.read()
    except Exception as e:
        return f"Şablon hatası: {e}"

@app.route('/usta/api/debug_translate', methods=['POST'])
def api_debug_translate():
    """Çeviri ve düzeltme mantığını test et"""
    try:
        init_services()
        data = request.get_json()
        text = data.get('text', '')
        
        if not translator:
            return jsonify({'success': False, 'error': 'Translator servis dışı'})

        # 1. Düzeltme Mantığı (Önce Gemini ile Typos Fix)
        # "yüüyüş pompası" -> "yürüyüş pompası"
        correction = translator.correct_terminology(text)
        
        # 2. Terim Eşleşmesi (DÜZELTİLMİŞ Metin Üzerinden Arama Yap)
        # Artık "yürüyüş pompası"nı arayacak ve "travel pump"ı bulacak.
        terms = translator.get_relevant_terms(correction)
        
        # 3. Çeviri Mantığı (DÜZELTİLMİŞ Metin + BULUNAN Terimler ile)
        # Gemini'ye "yürüyüş pompası"nı çevir diyoruz ve elimizdeki "travel pump" kozunu veriyoruz.
        trans_res = translator.translate(correction, "EN", "TR", terms_override=terms)
        
        return jsonify({
            'success': True,
            'correction': correction,
            'translation_tr': trans_res.translated_text,
            'terms': terms
        })

    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/ask', methods=['POST'])
def api_ask():
    """Sayfa analiz API - DeepL destekli + Analytics"""
    import time
    start_time = time.time()
    
    try:
        init_services()
        
        data = request.get_json()
        pdf_path = data.get('pdf_path', '')
        page_number = data.get('page_number', 1)
        question = data.get('question', '')
        brand = data.get('brand', '')
        model = data.get('model', '')
        session_id = data.get('session_id', '')
        
        if not pdf_path or not question:
            return jsonify({'success': False, 'error': 'PDF yolu ve soru gerekli'})
        
        # Vision analizi yap
        result = vision_analyzer.analyze_page(pdf_path, page_number, question)
        
        if result.error:
            return jsonify({'success': False, 'error': result.error})
        
        # AI cevabı İngilizce geldi, şimdi çevirelim
        english_answer = result.answer
        
        # SmartTranslator ile çevir (Sözlük destekli)
        trans_result = translator.translate(english_answer, "EN", "TR")
        best_answer = trans_result.translated_text
        used_terms = [{"en": k, "tr": v} for k, v in trans_result.used_terms.items()]
        
        # Eski yapıya uyumluluk (Frontend için)
        translations = {
            'dictionary': 'Smart Translate',
            'deepl': '-',
            'hybrid': best_answer
        }
        
        response_time_ms = int((time.time() - start_time) * 1000)
        
        # Analytics kaydı
        if analytics_db:
            analytics_db.log_question(
                brand=brand,
                model=model,
                pdf_path=pdf_path,
                page_number=page_number,
                question=question,
                question_english=result.translated_question,
                answer_english=english_answer,
                answer_turkish=best_answer,
                confidence=result.confidence,
                safety_warnings=','.join(result.safety_warnings) if result.safety_warnings else '',
                response_time_ms=response_time_ms,
                session_id=session_id
            )
        
        return jsonify({
            'success': True,
            'answer': best_answer,
            'answer_english': english_answer,
            'confidence': result.confidence,
            'safety_warnings': result.safety_warnings,
            'referenced_items': result.referenced_items,
            'translations': translations,
            'used_terms': used_terms[:10]  # Max 10 terim göster
        })
        
    except Exception as e:
        import traceback
        traceback.print_exc()
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/dictionary/search', methods=['POST'])
def api_dictionary_search():
    """Sözlük arama API"""
    try:
        init_services()
        
        data = request.get_json()
        query = data.get('query', '').strip().lower()
        lang = data.get('lang', 'both')  # 'tr', 'en', 'both'
        limit = data.get('limit', 50)
        
        if not translator or not hasattr(translator, '_term_cache'):
             return jsonify({'success': False, 'error': 'Sözlük servisi aktif değil'})
             
        # Doğrudan veritabanından sorgula (Filtresiz)
        import sqlite3
        # Yeni bağlantı aç (Threading hatasını önlemek için)
        db_path = '/mnt/pdfs/dictionary_v2.db'
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        # Eğer query boşsa (Tümünü Göster)
        if not query:
            cursor.execute("SELECT canonical_tr, canonical_en FROM technical_terms LIMIT ?", (limit,))
        else:
            # Arama yap (HEM TR HEM EN)
            like_query = f"%{query}%"
            cursor.execute("""
                SELECT canonical_tr, canonical_en 
                FROM technical_terms 
                WHERE canonical_tr LIKE ? OR canonical_en LIKE ? 
                LIMIT ?
            """, (like_query, like_query, limit))
            
        results = []
        rows = cursor.fetchall()
        
        for row in rows:
            tr = row['canonical_tr']
            en = row['canonical_en']
            
            # Sonuçları formatla
            # Eğer aranan ifade TR içinde geçiyorsa -> TR (EN)
            if query and query in tr.lower():
                results.append({'term': tr, 'translation': en, 'match_type': 'exact' if tr.lower() == query else 'partial'})
            # Eğer aranan ifade EN içinde geçiyorsa -> EN (TR)
            elif query and query in en.lower():
                results.append({'term': en, 'translation': tr, 'match_type': 'exact' if en.lower() == query else 'partial'})
            # Query yoksa (Tümünü göster)
            else:
                results.append({'term': tr, 'translation': en, 'match_type': 'list'})

        return jsonify({
            'success': True,
            'query': query,
            'total': len(results),
            'results': results
        })
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/dictionary/manage', methods=['POST'])
def api_dictionary_manage():
    """Sözlük terim yönetimi (Ekle/Sil)"""
    try:
        init_services()
        data = request.get_json()
        action = data.get('action') # 'add' or 'delete'
        
        if not translator:
            return jsonify({'success': False, 'error': 'Translator servisi aktif değil'})
            
        if action == 'add':
            en = data.get('en')
            tr = data.get('tr')
            if not en or not tr:
                return jsonify({'success': False, 'error': 'Eksik parametre (en, tr)'})
            
            success = translator.add_term(en, tr)
            if success:
                return jsonify({'success': True, 'message': 'Terim başarıyla eklendi/güncellendi.'})
            else:
                 return jsonify({'success': False, 'error': 'Veritabanı hatası'})
                 
        elif action == 'delete':
            term = data.get('term')
            if not term:
                return jsonify({'success': False, 'error': 'Silinecek terim belirtilmedi'})
                
            success = translator.delete_term(term)
            if success:
                 return jsonify({'success': True, 'message': 'Terim silindi.'})
            else:
                 return jsonify({'success': False, 'error': 'Silme işlemi başarısız'})
        
        else:
            return jsonify({'success': False, 'error': 'Geçersiz işlem'})

    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/import-review')
def import_review_page():
    """İçe aktarılan terimlerin kontrol sayfası"""
    return render_template_string("""
    <!DOCTYPE html>
    <html lang="tr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Sözlük İçe Aktarım Kontrolü</title>
        <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap" rel="stylesheet">
        <style>
            body { font-family: 'Inter', sans-serif; background: #121212; color: #eee; padding: 20px; }
            .container { max-width: 1000px; margin: 0 auto; background: #1E1E1E; padding: 30px; border-radius: 12px; }
            table { width: 100%; border-collapse: collapse; margin-top: 20px; }
            th, td { padding: 12px; text-align: left; border-bottom: 1px solid #333; }
            th { color: #FFD700; border-bottom: 2px solid #555; }
            .btn { background: #4CAF50; color: white; padding: 10px 20px; border: none; border-radius: 6px; cursor: pointer; float: right; }
            .btn:hover { background: #45a049; }
        </style>
    </head>
    <body>
        <div class="container">
            <div style="display:flex; justify-content:space-between; align-items:center;">
                <h2>📂 PDF Sözlük İçe Aktarım (Önizleme)</h2>
                <button class="btn" onclick="executeMerge()">✅ BU LİSTEYİ ONAYLA VE BİRLEŞTİR</button>
            </div>
            
            <p>Aşağıdaki <b><span id="total-count">...</span></b> kayıt PDF'ten çıkarıldı. Ana sözlüğe eklemek için onaylayın.</p>
            
            <div id="status" style="margin:10px 0; color:#FFD700; display:none;">İşlem yapılıyor...</div>
            
            <table>
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>İngilizce (PDF)</th>
                        <th>Türkçe (PDF)</th>
                    </tr>
                </thead>
                <tbody id="table-body">
                </tbody>
            </table>
        </div>
        
        <script>
            async function loadData() {
                try {
                    console.log("Veri çekiliyor...");
                    const res = await fetch('/usta/api/import/preview');
                    if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);
                    
                    const data = await res.json();
                    console.log("Veri geldi:", data);
                    
                    document.getElementById('total-count').textContent = data.total;
                    
                    const tbody = document.getElementById('table-body');
                    if (!tbody) { console.error("Tablo gövdesi bulunamadı!"); return; }
                    
                    tbody.innerHTML = '';
                    
                    if (data.results.length === 0) {
                        tbody.innerHTML = '<tr><td colspan="3" style="text-align:center; color:orange;">Gösterilecek veri yok (Veritabanı boş olabilir)</td></tr>';
                        return;
                    }
                    
                    data.results.forEach(row => {
                        const tr = document.createElement('tr');
                        tr.innerHTML = `
                            <td>${row.id}</td>
                            <td>${row.en}</td>
                            <td>${row.tr}</td>
                        `;
                        tbody.appendChild(tr);
                    });
                } catch (e) {
                    console.error("Yükleme Hatası:", e);
                    alert("Veri yüklenirken hata oluştu: " + e.message);
                }
            }
            
            async function executeMerge() {
                if(!confirm("Bu 4900+ terimi ana sözlüğe eklemek/güncellemek istediğinize emin misiniz?")) return;
                
                document.getElementById('status').style.display = 'block';
                document.getElementById('status').textContent = "Birleştirme ve Temizlik yapılıyor... Lütfen bekleyin.";
                
                try {
                    const res = await fetch('/usta/api/import/execute', { method: 'POST' });
                    const data = await res.json();
                    
                    if(data.success) {
                        alert("İşlem Başarılı! Sözlük güncellendi.");
                        document.getElementById('status').innerHTML = `<span style='color:#4CAF50'>${data.message}</span>`;
                    } else {
                        alert("Hata: " + data.error);
                    }
                } catch(e) {
                    alert("Hata: " + e);
                }
            }
            
            loadData();
        </script>
    </body>
    </html>
    """)

@app.route('/usta/api/import/preview')
def api_import_preview():
    """Önizleme verilerini döndür"""
    import sqlite3
    try:
        if not translator: init_services()
        conn = sqlite3.connect('/mnt/pdfs/dictionary_v2.db')
        c = conn.cursor()
        # Tüm kayıtları göster (User request)
        c.execute("SELECT id, en_term, tr_term FROM sozluk_import_preview")
        rows = c.fetchall()
        
        results = [{'id': r[0], 'en': r[1], 'tr': r[2]} for r in rows]
        
        # Toplam sayıyı al
        c.execute("SELECT COUNT(*) FROM sozluk_import_preview")
        total = c.fetchone()[0]
        
        conn.close()
        return jsonify({'total': total, 'results': results})
    except Exception as e:
        return jsonify({'error': str(e)})

@app.route('/usta/view-pdf')
def view_pdf():
    """Orijinal PDF dosyasını tarayıcıda aç"""
    from flask import send_file
    
    path = request.args.get('path', '')
    if not path:
        return "Dosya yolu belirtilmedi", 400
        
    # Güvenlik Kontrolü (Basit)
    # Sadece /mnt/pdfs altında izin ver
    clean_path = path.replace('../', '') 
    if not clean_path.startswith('/mnt/pdfs'):
        # Belki path "İŞ MAKİNASI..." diye geliyordur, başına ekle
        if clean_path.startswith('İŞ MAKİNASI'):
            clean_path = '/mnt/pdfs/' + clean_path
        else:
             return "Geçersiz dosya yolu", 403
             
    if not os.path.exists(clean_path):
        return f"Dosya bulunamadı: {clean_path}", 404
        
    # PDF served as inline (tarayıcıda açılır)
    return send_file(clean_path, mimetype='application/pdf')


@app.route('/usta/serve-pdf')
def serve_pdf():
    """PDF.js için PDF dosyasını sun (CORS uyumlu, byte-range destekli)"""
    from flask import send_file, make_response
    from urllib.parse import unquote
    
    path = request.args.get('path', '')
    if not path:
        return "Dosya yolu belirtilmedi", 400
    
    # URL decode (Türkçe karakterler için)
    path = unquote(path)
        
    # Güvenlik Kontrolü
    clean_path = path.replace('../', '') 
    if not clean_path.startswith('/mnt/pdfs'):
        if clean_path.startswith('İŞ MAKİNASI'):
            clean_path = '/mnt/pdfs/' + clean_path
        else:
            return "Geçersiz dosya yolu", 403
             
    if not os.path.exists(clean_path):
        return f"Dosya bulunamadı: {clean_path}", 404
    
    # PDF dosyasını gönder
    response = make_response(send_file(
        clean_path, 
        mimetype='application/pdf',
        as_attachment=False
    ))
    
    # CORS headers for PDF.js
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Methods'] = 'GET, OPTIONS'
    response.headers['Access-Control-Allow-Headers'] = 'Range'
    response.headers['Access-Control-Expose-Headers'] = 'Accept-Ranges, Content-Range, Content-Length'
    response.headers['Accept-Ranges'] = 'bytes'
    
    return response

@app.route('/usta/api/dictionary/add', methods=['POST'])
def api_dictionary_add():
    """Sözlüğe terim ekleme önerisi"""
    try:
        init_services()
        
        data = request.get_json()
        english_term = data.get('english', '').strip()
        turkish_term = data.get('turkish', '').strip()
        context = data.get('context', '')
        
        if not english_term or not turkish_term:
            return jsonify({'success': False, 'error': 'Her iki terim de gerekli'})
        
        if analytics_db:
            analytics_db.add_dictionary_suggestion(
                english_term=english_term,
                turkish_term=turkish_term,
                suggested_by='user',
                context=context
            )
        
        return jsonify({
            'success': True,
            'message': 'Terim öneriniz kaydedildi. Teşekkürler!'
        })
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/dictionary/stats')
def api_dictionary_stats():
    """Sözlük istatistikleri"""
    try:
        init_services()
        
        stats = {
            'total_terms': 0,
            'tr_to_en': 0,
            'en_to_tr': 0,
            'pending_suggestions': 0
        }
        
        if translator:
            if hasattr(translator, '_tr_to_en_cache'):
                stats['tr_to_en'] = len(translator._tr_to_en_cache)
            if hasattr(translator, '_en_to_tr_cache'):
                stats['en_to_tr'] = len(translator._en_to_tr_cache)
            stats['total_terms'] = stats['tr_to_en'] + stats['en_to_tr']
        
        if analytics_db:
            pending = analytics_db.get_pending_suggestions(limit=1000)
            stats['pending_suggestions'] = len(pending)
        
        return jsonify({'success': True, 'stats': stats})
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/rate-term', methods=['POST'])
def api_rate_term():
    """Terim rating API"""
    try:
        init_services()
        
        data = request.get_json()
        english_term = data.get('english_term', '')
        turkish_term = data.get('turkish_term', '')
        rating = data.get('rating', 3)
        suggestion = data.get('suggestion', '')
        brand = data.get('brand', '')
        model = data.get('model', '')
        
        if not english_term:
            return jsonify({'success': False, 'error': 'Terim gerekli'})
        
        # Analytics kaydı
        if analytics_db:
            analytics_db.log_translation_feedback(
                feedback_type='term',
                original_text=english_term,
                translated_text=turkish_term,
                rating=rating,
                user_suggestion=suggestion,
                brand=brand,
                model=model
            )
            
            # Öneri varsa sözlük önerisine ekle
            if suggestion:
                analytics_db.add_dictionary_suggestion(
                    english_term=english_term,
                    turkish_term=suggestion,
                    suggested_by='user',
                    context=f"{brand} {model}"
                )
        
        return jsonify({
            'success': True,
            'message': 'Teşekkürler! Geri bildiriminiz kaydedildi.'
        })
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@app.route('/usta/api/page-image', methods=['POST'])
def api_page_image():
    """PDF sayfasını PNG olarak döndür"""
    try:
        import fitz
        import base64
        
        data = request.get_json()
        pdf_path = data.get('pdf_path', '')
        page_number = data.get('page_number', 1)
        
        if not pdf_path:
            return jsonify({'success': False, 'error': 'PDF yolu gerekli'})
        
        # PDF yolunu çöz (HIZLI BAĞLANTIYI ZORLA)
        # Kullanıcı uyarısı: storagebox (cifs) yavaş, NFS (/mnt/pdfs) hızlı.
        if "/storagebox/" in pdf_path:
             pdf_path = pdf_path.replace("/mnt/storagebox/PDFLER/", "/mnt/pdfs/")
             pdf_path = pdf_path.replace("/mnt/storagebox/", "/mnt/pdfs/")

        if pdf_path.startswith("/home/poyraz/pdfs/"):
            pdf_path = pdf_path.replace("/home/poyraz/pdfs/", "/mnt/pdfs/")
        elif not os.path.isabs(pdf_path):
            if pdf_path.startswith("pdfs/"):
                pdf_path = pdf_path[5:]
            pdf_path = os.path.join("/mnt/pdfs", pdf_path)
        
        if not os.path.exists(pdf_path):
            return jsonify({'success': False, 'error': f'PDF bulunamadı'})
        
        # PDF'yi aç ve sayfayı render et
        doc = fitz.open(pdf_path)
        page_idx = page_number - 1
        
        if page_idx < 0 or page_idx >= len(doc):
            doc.close()
            return jsonify({'success': False, 'error': f'Geçersiz sayfa: {page_number}'})
        
        page = doc[page_idx]
        
        # 1.5x zoom ile render
        mat = fitz.Matrix(1.5, 1.5)
        pix = page.get_pixmap(matrix=mat)
        png_bytes = pix.tobytes("png")
        
        total_pages = len(doc)
        doc.close()
        
        # Base64 encode
        base64_image = base64.b64encode(png_bytes).decode('utf-8')
        
        return jsonify({
            'success': True,
            'image': f'data:image/png;base64,{base64_image}',
            'page_number': page_number,
            'total_pages': total_pages
        })
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


if __name__ == '__main__':
    print("\n" + "=" * 60)
    print("   👷 USTA ASSISTANT WEB v2.0")
    print("=" * 60)
    print()
    print(f"🌐 Erişim: http://0.0.0.0:5001/usta/")
    print()
    
    # 0.0.0.0 ile dış dünyaya açıyoruz
    app.run(host='0.0.0.0', port=5001, debug=False, threaded=True)
