import os
import sqlite3
import urllib.parse
from pathlib import Path
from http.server import HTTPServer, BaseHTTPRequestHandler
import json

BASE_DIR = Path("/home/dayhanbiz/public_html/3-damja.science")
DB_PATH = BASE_DIR / "search_databases" / "library_search.db"
TEMPLATES_DIR = BASE_DIR / "web" / "templates"

def get_db_connection():
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    return conn

class SearchHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed_url = urllib.parse.urlparse(self.path)
        path = parsed_url.path
        query_params = urllib.parse.parse_qs(parsed_url.query)
        
        if path == '/' or path == '':
            self.handle_index(query_params)
        elif path.startswith('/api/page/'):
            self.handle_api_page(path)
        else:
            self.send_error(404, "Not Found")
            
    def handle_index(self, query_params):
        query = query_params.get('q', [''])[0].strip()
        page = int(query_params.get('page', [1])[0])
        per_page = 10
        offset = (page - 1) * per_page
        
        results = []
        total_results = 0
        
        if query:
            try:
                conn = get_db_connection()
                cursor = conn.cursor()
                
                cursor.execute("SELECT COUNT(*) as cnt FROM pages_fts WHERE pages_fts MATCH ?", (query,))
                total_results = cursor.fetchone()['cnt']
                
                search_sql = """
                    SELECT p.book_hash, p.page_number, 
                           snippet(pages_fts, 2, '<mark class="bg-amber-200 text-amber-900 px-1 rounded">', '</mark>', '...', 48) as snippet,
                           d.title, d.original_path
                    FROM pages_fts p
                    LEFT JOIN documents d ON p.book_hash = d.hash_name
                    WHERE pages_fts MATCH ? 
                    ORDER BY rank 
                    LIMIT ? OFFSET ?
                """
                cursor.execute(search_sql, (query, per_page, offset))
                rows = cursor.fetchall()
                
                for row in rows:
                    b_hash = row['book_hash']
                    p_num = row['page_number']
                    snippet = row['snippet']
                    title = row['title'] if row['title'] else b_hash
                    orig_path = row['original_path'] if row['original_path'] else ""
                    
                    # Формируем веб-ссылку из абсолютного пути на сервере
                    web_url = "#"
                    if orig_path:
                        # Заменяем системный префикс на корневой путь домена
                        relative_part = orig_path.replace("/home/dayhanbiz/public_html/", "/")
                        web_url = f"{relative_part}#page={p_num}"
                        
                    results.append({
                        "book_hash": b_hash,
                        "page_number": p_num,
                        "snippet": snippet,
                        "original_name": title,
                        "web_url": web_url
                    })
                conn.close()
            except Exception as e:
                print(f"Search error: {e}")
                
        template_path = TEMPLATES_DIR / "index.html"
        if template_path.exists():
            with open(template_path, "r", encoding="utf-8") as f:
                html_template = f.read()
                
            rendered = html_template.replace('value="{{ query }}"', f'value="{query}"')
            rendered = rendered.replace('{{ query }}', query)
            rendered = rendered.replace('{{ total }}', str(total_results))
            
            results_html = ""
            if query:
                if results:
                    for item in results:
                        orig_name = item['original_name']
                        snippet = item['snippet']
                        p_num = item['page_number']
                        b_hash = item['book_hash']
                        web_url = item['web_url']
                        
                        results_html += f"""
                        <div class="bg-white border border-slate-200/80 rounded-2xl p-6 shadow-sm hover:shadow-md transition-shadow mb-4">
                            <div class="flex items-center justify-between text-xs font-medium text-slate-400 mb-2">
                                <span class="flex items-center space-x-1.5 truncate max-w-[70%]">
                                    <span class="text-slate-600 font-semibold shrink-0">Оригинал:</span> <span class="text-slate-700 truncate font-medium" title="{orig_name}">{orig_name}</span>
                                </span>
                                <span class="bg-emerald-50 text-emerald-800 px-2.5 py-1 rounded-lg text-xs font-semibold shrink-0">
                                    Страница {p_num}
                                </span>
                            </div>
                            <p class="text-slate-700 text-sm leading-relaxed mb-4 bg-slate-50/70 p-3.5 rounded-xl border border-slate-100">
                                {snippet}
                            </p>
                            <div class="flex items-center justify-end space-x-3">
                                <button onclick="openPageModal('{b_hash}', {p_num})" class="inline-flex items-center space-x-1.5 text-xs font-semibold text-slate-700 hover:text-slate-900 bg-slate-100 hover:bg-slate-200 px-3.5 py-2 rounded-xl transition-colors cursor-pointer">
                                    <span>Открыть распознанный текст страницы</span>
                                </button>
                                <a href="{web_url}" target="_blank" class="inline-flex items-center space-x-1.5 text-xs font-semibold text-emerald-700 hover:text-emerald-800 bg-emerald-50 hover:bg-emerald-100 px-3.5 py-2 rounded-xl transition-colors cursor-pointer">
                                    <span>Открыть документ на странице результата</span>
                                </a>
                            </div>
                        </div>
                        """
                    results_block = f'<div class="space-y-4"><h2 class="text-xl font-semibold text-slate-900 mb-4">Результаты поиска</h2>{results_html}</div>'
                else:
                    results_block = """
                    <div class="bg-white border border-slate-200 rounded-2xl p-12 text-center shadow-sm">
                        <p class="text-slate-500 text-base mb-2">По вашему запросу ничего не найдено.</p>
                        <p class="text-xs text-slate-400">Попробуйте изменить формулировку или использовать другие ключевые слова.</p>
                    </div>
                    """
            else:
                results_block = """
                <div class="py-20 text-center max-w-lg mx-auto">
                    <div class="w-16 h-16 bg-emerald-100 text-emerald-700 rounded-2xl mx-auto flex items-center justify-center text-2xl mb-4 font-bold shadow-sm">🔍</div>
                    <h2 class="text-2xl font-bold text-slate-900 mb-2">Добро пожаловать в архив</h2>
                    <p class="text-slate-500 text-sm mb-6">Введите поисковый запрос выше, чтобы мгновенно найти нужные факты, термины и исторические документы по всей базе знаний.</p>
                </div>
                """
            
            if '<main class="max-w-5xl mx-auto px-4 py-8 flex-1 w-full">' in rendered:
                parts = rendered.split('<main class="max-w-5xl mx-auto px-4 py-8 flex-1 w-full">')
                main_end_parts = parts[1].split('</main>')
                rendered = parts[0] + '<main class="max-w-5xl mx-auto px-4 py-8 flex-1 w-full">\n' + results_block + '\n</main>' + main_end_parts[1]

            self.send_response(200)
            self.send_header("Content-type", "text/html; charset=utf-8")
            self.end_headers()
            self.wfile.write(rendered.encode('utf-8'))
        else:
            self.send_error(404, "Template not found")

    def handle_api_page(self, path):
        parts = path.split('/')
        if len(parts) >= 5:
            book_hash = parts[3]
            try:
                page_num = int(parts[4])
                page_file = BASE_DIR / "extracted_texts" / book_hash / f"page_{page_num:04d}.txt"
                if page_file.exists():
                    with open(page_file, "r", encoding="utf-8", errors="ignore") as f:
                        content = f.read()
                    response_data = {"success": True, "content": content, "book_hash": book_hash, "page_number": page_num}
                else:
                    response_data = {"success": False, "error": "Страница не найдена"}
            except ValueError:
                response_data = {"success": False, "error": "Неверный номер страницы"}
                
            self.send_response(200)
            self.send_header("Content-type", "application/json; charset=utf-8")
            self.end_headers()
            self.wfile.write(json.dumps(response_data, ensure_ascii=False).encode('utf-8'))
        else:
            self.send_error(400, "Bad Request")

def run(server_class=HTTPServer, handler_class=SearchHandler, port=5000):
    server_address = ('127.0.0.1', port)
    httpd = server_class(server_address, handler_class)
    print(f"Автономный поисковый сервер для 3-damja.science запущен на порту {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()
