#!/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

# 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")

# 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=OPENAI_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"""
    return render_template_string(HTML_TEMPLATE)


@app.route('/usta/api/brands')
def api_brands():
    """Marka listesi API - JSON katalogdan"""
    try:
        catalog_path = os.path.join(os.path.dirname(__file__), 'pdf_catalog.json')
        
        if os.path.exists(catalog_path):
            with open(catalog_path, 'r', encoding='utf-8') as f:
                catalog = json.load(f)
            
            # Katalogdaki markaları ve modellerini döndür
            brands_data = {}
            for brand_name, brand_data in catalog.get('brands', {}).items():
                models = list(brand_data.get('models', {}).keys())
                brands_data[brand_name] = sorted(models)
            
            return jsonify(brands_data)
        else:
            # Fallback - eski dosyadan oku
            data = load_brands()
            return jsonify(data)
    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 - JSON katalogdan"""
    try:
        data = request.get_json()
        brand = data.get('brand', '').upper()
        model = data.get('model', '').upper()
        
        if not brand:
            return jsonify({'success': False, 'error': 'Marka seçilmeli'})
        
        # JSON katalog yükle
        catalog_path = os.path.join(os.path.dirname(__file__), 'pdf_catalog.json')
        
        if not os.path.exists(catalog_path):
            return jsonify({'success': False, 'error': 'PDF katalogu bulunamadı. build_pdf_catalog.py çalıştırın.'})
        
        with open(catalog_path, 'r', encoding='utf-8') as f:
            catalog = json.load(f)
        
        # Marka ara (case-insensitive)
        brand_data = None
        for b_name, b_data in catalog.get('brands', {}).items():
            if brand in b_name.upper() or b_name.upper() in brand:
                brand_data = b_data
                break
        
        if not brand_data:
            return jsonify({'success': True, 'brand': brand, 'model': model, 'total': 0, 'pdfs': []})
        
        # Model ara
        pdf_list = []
        if model:
            # Belirli model
            for m_name, m_data in brand_data.get('models', {}).items():
                if model in m_name.upper() or m_name.upper() in model:
                    pdf_list.extend(m_data.get('pdfs', []))
        else:
            # Tüm modeller
            for m_name, m_data in brand_data.get('models', {}).items():
                pdf_list.extend(m_data.get('pdfs', []))
        
        # Sırala
        pdf_list.sort(key=lambda x: (x.get('type', ''), x.get('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'})
        
        # 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
        result = search_service.search(query, limit=search_limit, pdf_filter=pdf_filter_filename)
        
        # 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
                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', '')
            if original_text and translator:
                try:
                    # SmartTranslator ile çeviri
                    trans_result = translator.translate(original_text, "EN", "TR")
                    r_dict['text_tr'] = trans_result.translated_text
                    r_dict['text_original'] = original_text  # Orijinali sakla
                except Exception as te:
                    print(f"Çeviri hatası: {te}")
                    r_dict['text_tr'] = original_text  # Hata olursa orijinali kullan
                    r_dict['text_original'] = original_text
            else:
                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/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 query or len(query) < 2:
            return jsonify({'success': False, 'error': 'En az 2 karakter girin'})
        
        results = []
        
        # Sözlükten ara
        if translator and hasattr(translator, '_tr_to_en_cache') and hasattr(translator, '_en_to_tr_cache'):
            # Türkçe -> İngilizce
            if lang in ['tr', 'both']:
                for tr_term, en_list in translator._tr_to_en_cache.items():
                    if query in tr_term:
                        for en in en_list[:3]:
                            results.append({
                                'tr': tr_term,
                                'en': en,
                                'direction': 'tr_to_en',
                                'match_type': 'exact' if tr_term == query else 'partial'
                            })
            
            # İngilizce -> Türkçe
            if lang in ['en', 'both']:
                for en_term, tr_list in translator._en_to_tr_cache.items():
                    if query in en_term:
                        for tr in tr_list[:3]:
                            results.append({
                                'tr': tr,
                                'en': en_term,
                                'direction': 'en_to_tr',
                                'match_type': 'exact' if en_term == query else 'partial'
                            })
        
        # Sonuçları sırala (exact match önce)
        results.sort(key=lambda x: (0 if x['match_type'] == 'exact' else 1, len(x['en'])))
        
        # Tekrarları kaldır
        seen = set()
        unique_results = []
        for r in results:
            key = f"{r['en']}|{r['tr']}"
            if key not in seen:
                seen.add(key)
                unique_results.append(r)
        
        return jsonify({
            'success': True,
            'query': query,
            'total': len(unique_results),
            'results': unique_results[:limit]
        })
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)})


@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
        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)
