<!DOCTYPE html>
<html lang="ru" data-theme="light">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Обновленный server.py с поддержкой нескольких изображений</title>
    <style>
        body {
            max-width: 880px;
            margin: 0 auto;
            padding: 32px 80px;
            position: relative;
            box-sizing: border-box;
            font-family: 'Times New Roman', serif;
            line-height: 1.6;
            color: #000;
            background: #fff;
        }
        
        h1, h2, h3 {
            font-family: Arial, sans-serif;
            margin-top: 24px;
            margin-bottom: 12px;
        }
        
        h1 {
            font-size: 18pt;
            text-align: center;
            border-bottom: 2px solid #000;
            padding-bottom: 8px;
        }
        
        h2 {
            font-size: 16pt;
            margin-top: 20px;
        }
        
        h3 {
            font-size: 14pt;
            margin-top: 16px;
        }
        
        p {
            margin-bottom: 12px;
            text-align: justify;
        }
        
        pre {
            background: #f5f5f5;
            padding: 12px;
            border: 1px solid #ccc;
            font-family: 'Courier New', monospace;
            font-size: 9pt;
            line-height: 1.4;
            margin: 12px 0;
            white-space: pre-wrap;
            word-wrap: break-word;
        }
        
        code {
            font-family: 'Courier New', monospace;
            background: #f0f0f0;
            padding: 2px 4px;
            font-size: 9pt;
        }
        
        ul, ol {
            margin-left: 24px;
            margin-bottom: 12px;
        }
        
        li {
            margin-bottom: 4px;
        }
        
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 12px 0;
        }
        
        th, td {
            border: 1px solid #000;
            padding: 8px;
            text-align: left;
        }
        
        th {
            background: #f0f0f0;
            font-weight: bold;
        }
        
        .note {
            background: #f9f9f9;
            border-left: 4px solid #333;
            padding: 12px;
            margin: 12px 0;
        }
    </style>
</head>
<body>
    <h1>Обновленный server.py с поддержкой нескольких изображений</h1>
    
    <h2>Описание изменений</h2>
    <p>Данный файл содержит обновленную версию Flask API сервера с поддержкой нескольких изображений для товаров. Основные изменения включают:</p>
    
    <ul>
        <li>Новые endpoints для управления изображениями товаров</li>
        <li>Обновленные существующие endpoints для работы с множественными изображениями</li>
        <li>Поддержка таблицы product_images</li>
        <li>Улучшенная обработка ошибок и валидация</li>
        <li>Новый endpoint для получения детальной информации о товаре</li>
    </ul>
    
    <h2>Новые функции</h2>
    <ul>
        <li><strong>GET /api/products/&lt;id&gt;</strong> - получение детальной информации о товаре</li>
        <li><strong>GET /api/products/&lt;id&gt;/images</strong> - получение всех изображений товара</li>
        <li><strong>POST /api/products/&lt;id&gt;/images</strong> - добавление изображения к товару</li>
        <li><strong>PUT /api/products/&lt;id&gt;/images/&lt;image_id&gt;</strong> - обновление изображения</li>
        <li><strong>DELETE /api/products/&lt;id&gt;/images/&lt;image_id&gt;</strong> - удаление изображения</li>
    </ul>
    
    <h2>Полный код server.py</h2>
    
    <pre>
from flask import Flask, request, jsonify
from flask_cors import CORS
import psycopg2
import psycopg2.extras
import os
from datetime import datetime
import json
import requests
from urllib.parse import urlparse, parse_qs
import re

app = Flask(__name__)
CORS(app)

# Конфигурация базы данных
DB_CONFIG = {
    'host': '127.0.0.1',
    'database': 'aliexpress_automation',
    'user': 'automation_user',
    'password': 'AutoPass123'
}

def get_db_connection():
    """Получение соединения с базой данных"""
    return psycopg2.connect(**DB_CONFIG)

def validate_url(url):
    """Валидация URL"""
    try:
        result = urlparse(url)
        return all([result.scheme, result.netloc])
    except:
        return False

def extract_product_id_from_url(url):
    """Извлечение ID товара из URL AliExpress"""
    try:
        # Поиск product_id в URL
        match = re.search(r'(\d+)\.html', url)
        if match:
            return match.group(1)
        
        # Альтернативный способ поиска ID
        match = re.search(r'item/(\d+)', url)
        if match:
            return match.group(1)
        
        return None
    except:
        return None

def categorize_product(title, description):
    """Автоматическое определение категории товара"""
    text = (title + ' ' + description).lower()
    
    # Категории для кемпера
    categories = {
        'electronics': ['солнечная панель', 'батарея', 'инвертор', 'зарядное', 'фонарик', 'радио', 'gps', 'навигатор', 'аккумулятор', 'power bank', 'led', 'освещение'],
        'cooking': ['плитка', 'котелок', 'сковорода', 'холодильник', 'термос', 'посуда', 'газ', 'горелка', 'кастрюля', 'мультиварка'],
        'comfort': ['спальник', 'подушка', 'матрас', 'одеяло', 'кресло', 'стол', 'шезлонг', 'гамак', 'палатка', 'тент'],
        'tools': ['инструмент', 'отвертка', 'ключ', 'насос', 'компрессор', 'домкрат', 'трос', 'канат', 'лебедка'],
        'safety': ['аптечка', 'огнетушитель', 'сигнализация', 'замок', 'сейф', 'датчик', 'камера', 'охрана'],
        'water': ['фильтр', 'насос', 'бак', 'кран', 'шланг', 'душ', 'туалет', 'септик', 'очистка']
    }
    
    for category, keywords in categories.items():
        if any(keyword in text for keyword in keywords):
            return category
    
    return 'other'

def get_product_images(product_id):
    """Получение всех изображений товара"""
    try:
        conn = get_db_connection()
        cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
        
        cursor.execute("""
            SELECT id, image_url, is_main, sort_order, alt_text
            FROM product_images
            WHERE product_id = %s
            ORDER BY sort_order ASC, id ASC
        """, (product_id,))
        
        images = []
        for row in cursor.fetchall():
            images.append({
                'id': row['id'],
                'image_url': row['image_url'],
                'is_main': row['is_main'],
                'sort_order': row['sort_order'],
                'alt_text': row['alt_text']
            })
        
        cursor.close()
        conn.close()
        
        return images
    except Exception as e:
        print(f"Ошибка получения изображений: {e}")
        return []

@app.route('/api/products', methods=['GET'])
def get_products():
    """Получение списка товаров с фильтрацией и поиском"""
    try:
        page = int(request.args.get('page', 1))
        limit = int(request.args.get('limit', 12))
        category = request.args.get('category')
        price_range = request.args.get('price_range')
        search = request.args.get('search')
        status = request.args.get('status')
        
        # Если статус не указан, для обычного сайта показываем только активные
        if status is None:
            status = 'active'
        
        offset = (page - 1) * limit
        
        # Построение SQL запроса
        query = """
            SELECT p.id, p.title, p.ai_description, p.original_description, 
                   p.price, p.original_price, p.main_image, p.category, 
                   p.epn_link, p.aliexpress_link, p.rating, p.orders_count, 
                   p.status, p.created_at, p.detailed_description, p.specifications,
                   p.shipping_info, p.video_url, p.weight, p.dimensions, p.warranty_info
            FROM products p
            WHERE 1=1
        """
        params = []
        
        # Фильтр по статусу
        if status and status != 'all':
            query += " AND p.status = %s"
            params.append(status)
        
        # Добавление фильтров
        if category:
            query += " AND p.category = %s"
            params.append(category)
            
        if price_range:
            if price_range == '0-1000':
                query += " AND p.price <= %s"
                params.append(1000)
            elif price_range == '1000-5000':
                query += " AND p.price > %s AND p.price <= %s"
                params.extend([1000, 5000])
            elif price_range == '5000-10000':
                query += " AND p.price > %s AND p.price <= %s"
                params.extend([5000, 10000])
            elif price_range == '10000+':
                query += " AND p.price > %s"
                params.append(10000)
        
        # Поиск по названию и описанию
        if search:
            query += " AND (p.title ILIKE %s OR p.ai_description ILIKE %s OR p.original_description ILIKE %s)"
            search_param = f"%{search}%"
            params.extend([search_param, search_param, search_param])
        
        query += " ORDER BY p.created_at DESC LIMIT %s OFFSET %s"
        params.extend([limit, offset])
        
        # Выполнение запроса
        conn = get_db_connection()
        cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
        cursor.execute(query, params)
        
        products = []
        for row in cursor.fetchall():
            # Получаем изображения для каждого товара
            images = get_product_images(row['id'])
            
            product = {
                'id': row['id'],
                'title': row['title'],
                'ai_description': row['ai_description'],
                'original_description': row['original_description'],
                'detailed_description': row['detailed_description'],
                'price': float(row['price']) if row['price'] else 0,
                'original_price': float(row['original_price']) if row['original_price'] else None,
                'main_image': row['main_image'],
                'category': row['category'],
                'epn_link': row['epn_link'],
                'aliexpress_link': row['aliexpress_link'],
                'rating': float(row['rating']) if row['rating'] else 0,
                'orders_count': row['orders_count'] or 0,
                'status': row['status'],
                'created_at': row['created_at'].isoformat() if row['created_at'] else None,
                'specifications': row['specifications'],
                'shipping_info': row['shipping_info'],
                'video_url': row['video_url'],
                'weight': float(row['weight']) if row['weight'] else None,
                'dimensions': row['dimensions'],
                'warranty_info': row['warranty_info'],
                'images': images
            }
            
            products.append(product)
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'products': products,
            'page': page,
            'limit': limit
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/<int:product_id>', methods=['GET'])
def get_product_detail(product_id):
    """Получение детальной информации о товаре"""
    try:
        conn = get_db_connection()
        cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
        
        # Получаем основную информацию о товаре
        cursor.execute("""
            SELECT p.*, 
                   COALESCE(SUM(a.clicks), 0) as total_clicks
            FROM products p
            LEFT JOIN analytics a ON p.id = a.product_id
            WHERE p.id = %s AND p.status = 'active'
            GROUP BY p.id
        """, (product_id,))
        
        product = cursor.fetchone()
        
        if not product:
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Товар не найден'
            }), 404
        
        # Получаем изображения товара
        images = get_product_images(product_id)
        
        # Формируем ответ
        product_data = {
            'id': product['id'],
            'title': product['title'],
            'ai_description': product['ai_description'],
            'original_description': product['original_description'],
            'detailed_description': product['detailed_description'],
            'price': float(product['price']) if product['price'] else 0,
            'original_price': float(product['original_price']) if product['original_price'] else None,
            'main_image': product['main_image'],
            'category': product['category'],
            'epn_link': product['epn_link'],
            'aliexpress_link': product['aliexpress_link'],
            'rating': float(product['rating']) if product['rating'] else 0,
            'orders_count': product['orders_count'] or 0,
            'status': product['status'],
            'created_at': product['created_at'].isoformat() if product['created_at'] else None,
            'specifications': product['specifications'],
            'shipping_info': product['shipping_info'],
            'video_url': product['video_url'],
            'weight': float(product['weight']) if product['weight'] else None,
            'dimensions': product['dimensions'],
            'warranty_info': product['warranty_info'],
            'total_clicks': product['total_clicks'],
            'images': images
        }
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'product': product_data
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/<int:product_id>/images', methods=['GET'])
def get_product_images_endpoint(product_id):
    """Получение всех изображений товара"""
    try:
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверяем существование товара
        cursor.execute("SELECT id FROM products WHERE id = %s", (product_id,))
        if not cursor.fetchone():
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Товар не найден'
            }), 404
        
        # Получаем изображения
        images = get_product_images(product_id)
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'images': images
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/<int:product_id>/images', methods=['POST'])
def add_product_image(product_id):
    """Добавление изображения к товару"""
    try:
        data = request.get_json()
        
        if not data.get('image_url'):
            return jsonify({
                'success': False,
                'error': 'image_url обязательное поле'
            }), 400
        
        # Валидация URL
        if not validate_url(data['image_url']):
            return jsonify({
                'success': False,
                'error': 'Неверный формат URL изображения'
            }), 400
        
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверяем существование товара
        cursor.execute("SELECT id FROM products WHERE id = %s", (product_id,))
        if not cursor.fetchone():
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Товар не найден'
            }), 404
        
        # Если это главное изображение, сбрасываем флаг у других
        if data.get('is_main', False):
            cursor.execute("""
                UPDATE product_images 
                SET is_main = FALSE 
                WHERE product_id = %s
            """, (product_id,))
        
        # Добавляем новое изображение
        cursor.execute("""
            INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
            VALUES (%s, %s, %s, %s, %s)
            RETURNING id
        """, (
            product_id,
            data['image_url'],
            data.get('is_main', False),
            data.get('sort_order', 0),
            data.get('alt_text', '')
        ))
        
        image_id = cursor.fetchone()[0]
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Изображение добавлено',
            'image_id': image_id
        }), 201
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/<int:product_id>/images/<int:image_id>', methods=['PUT'])
def update_product_image(product_id, image_id):
    """Обновление изображения товара"""
    try:
        data = request.get_json()
        
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверяем существование изображения
        cursor.execute("""
            SELECT id FROM product_images 
            WHERE id = %s AND product_id = %s
        """, (image_id, product_id))
        
        if not cursor.fetchone():
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Изображение не найдено'
            }), 404
        
        # Если устанавливаем как главное, сбрасываем флаг у других
        if data.get('is_main', False):
            cursor.execute("""
                UPDATE product_images 
                SET is_main = FALSE 
                WHERE product_id = %s AND id != %s
            """, (product_id, image_id))
        
        # Формируем запрос обновления
        update_fields = []
        params = []
        
        allowed_fields = ['image_url', 'is_main', 'sort_order', 'alt_text']
        
        for field in allowed_fields:
            if field in data:
                update_fields.append(f"{field} = %s")
                params.append(data[field])
        
        if not update_fields:
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Нет данных для обновления'
            }), 400
        
        params.extend([image_id, product_id])
        
        update_query = f"""
            UPDATE product_images 
            SET {', '.join(update_fields)}
            WHERE id = %s AND product_id = %s
        """
        
        cursor.execute(update_query, params)
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Изображение обновлено'
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/<int:product_id>/images/<int:image_id>', methods=['DELETE'])
def delete_product_image(product_id, image_id):
    """Удаление изображения товара"""
    try:
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверяем существование изображения
        cursor.execute("""
            SELECT id FROM product_images 
            WHERE id = %s AND product_id = %s
        """, (image_id, product_id))
        
        if not cursor.fetchone():
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Изображение не найдено'
            }), 404
        
        # Удаляем изображение
        cursor.execute("""
            DELETE FROM product_images 
            WHERE id = %s AND product_id = %s
        """, (image_id, product_id))
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Изображение удалено'
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products', methods=['POST'])
def add_product():
    """Добавление нового товара"""
    try:
        data = request.get_json()
        
        # Валидация обязательных полей
        required_fields = ['title', 'price', 'aliexpress_link']
        for field in required_fields:
            if not data.get(field):
                return jsonify({
                    'success': False,
                    'error': f'Поле {field} обязательно для заполнения'
                }), 400
        
        # Валидация URL
        if not validate_url(data['aliexpress_link']):
            return jsonify({
                'success': False,
                'error': 'Неверный формат URL'
            }), 400
        
        # Валидация цены
        try:
            price = float(data['price'])
            if price < 0:
                return jsonify({
                    'success': False,
                    'error': 'Цена не может быть отрицательной'
                }), 400
        except ValueError:
            return jsonify({
                'success': False,
                'error': 'Неверный формат цены'
            }), 400
        
        # Извлечение ID товара из URL
        product_id = extract_product_id_from_url(data['aliexpress_link'])
        
        # Автоматическое определение категории
        category = data.get('category')
        if not category:
            category = categorize_product(
                data['title'],
                data.get('original_description', '')
            )
        
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверка на дубликаты по URL
        cursor.execute("""
            SELECT id FROM products 
            WHERE aliexpress_link = %s OR (external_product_id = %s AND external_product_id IS NOT NULL)
        """, (data['aliexpress_link'], product_id))
        
        existing = cursor.fetchone()
        if existing:
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Товар с таким URL уже существует'
            }), 409
        
        # Вставка нового товара
        insert_query = """
            INSERT INTO products (
                title, ai_description, original_description, detailed_description,
                price, original_price, main_image, category, epn_link, aliexpress_link, 
                rating, orders_count, external_product_id, status, specifications,
                shipping_info, video_url, weight, dimensions, warranty_info,
                created_at, updated_at
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            RETURNING id
        """
        
        cursor.execute(insert_query, (
            data['title'],
            data.get('ai_description'),
            data.get('original_description'),
            data.get('detailed_description'),
            price,
            float(data['original_price']) if data.get('original_price') else None,
            data.get('main_image'),
            category,
            data.get('epn_link'),
            data['aliexpress_link'],
            float(data['rating']) if data.get('rating') else 0,
            int(data['orders_count']) if data.get('orders_count') else 0,
            product_id,
            'active',
            data.get('specifications'),
            data.get('shipping_info'),
            data.get('video_url'),
            float(data['weight']) if data.get('weight') else None,
            data.get('dimensions'),
            data.get('warranty_info'),
            datetime.now(),
            datetime.now()
        ))
        
        new_product_id = cursor.fetchone()[0]
        
        # Добавляем дополнительные изображения, если они есть
        if data.get('images'):
            for idx, image_data in enumerate(data['images']):
                if validate_url(image_data.get('image_url', '')):
                    cursor.execute("""
                        INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
                        VALUES (%s, %s, %s, %s, %s)
                    """, (
                        new_product_id,
                        image_data['image_url'],
                        image_data.get('is_main', False),
                        image_data.get('sort_order', idx),
                        image_data.get('alt_text', '')
                    ))
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Товар успешно добавлен',
            'product_id': new_product_id
        }), 201
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/<int:product_id>', methods=['PUT'])
def update_product(product_id):
    """Обновление товара"""
    try:
        data = request.get_json()
        
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверка существования товара
        cursor.execute("SELECT id FROM products WHERE id = %s", (product_id,))
        if not cursor.fetchone():
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Товар не найден'
            }), 404
        
        # Формирование запроса обновления
        update_fields = []
        params = []
        
        allowed_fields = [
            'title', 'ai_description', 'original_description', 'detailed_description',
            'price', 'original_price', 'main_image', 'category', 'epn_link', 
            'aliexpress_link', 'rating', 'orders_count', 'status', 'specifications',
            'shipping_info', 'video_url', 'weight', 'dimensions', 'warranty_info'
        ]
        
        for field in allowed_fields:
            if field in data:
                update_fields.append(f"{field} = %s")
                params.append(data[field])
        
        if not update_fields:
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Нет данных для обновления'
            }), 400
        
        # Добавление поля updated_at
        update_fields.append("updated_at = %s")
        params.append(datetime.now())
        params.append(product_id)
        
        update_query = f"""
            UPDATE products 
            SET {', '.join(update_fields)}
            WHERE id = %s
        """
        
        cursor.execute(update_query, params)
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Товар успешно обновлен'
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/<int:product_id>', methods=['DELETE'])
def delete_product(product_id):
    """Удаление товара (мягкое удаление)"""
    try:
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверка существования товара
        cursor.execute("SELECT id FROM products WHERE id = %s", (product_id,))
        if not cursor.fetchone():
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Товар не найден'
            }), 404
        
        # Мягкое удаление (изменение статуса)
        cursor.execute("""
            UPDATE products 
            SET status = 'deleted', updated_at = %s
            WHERE id = %s
        """, (datetime.now(), product_id))
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': 'Товар успешно удален'
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/products/bulk', methods=['POST'])
def add_products_bulk():
    """Массовое добавление товаров"""
    try:
        data = request.get_json()
        products = data.get('products', [])
        
        if not products:
            return jsonify({
                'success': False,
                'error': 'Список товаров не может быть пустым'
            }), 400
        
        conn = get_db_connection()
        cursor = conn.cursor()
        
        added_count = 0
        errors = []
        
        for i, product in enumerate(products):
            try:
                # Валидация обязательных полей
                if not all(product.get(field) for field in ['title', 'price', 'aliexpress_link']):
                    errors.append(f'Товар {i+1}: отсутствуют обязательные поля')
                    continue
                
                # Валидация URL
                if not validate_url(product['aliexpress_link']):
                    errors.append(f'Товар {i+1}: неверный формат URL')
                    continue
                
                # Извлечение ID товара из URL
                product_id = extract_product_id_from_url(product['aliexpress_link'])
                
                # Проверка на дубликаты
                cursor.execute("""
                    SELECT id FROM products 
                    WHERE aliexpress_link = %s OR (external_product_id = %s AND external_product_id IS NOT NULL)
                """, (product['aliexpress_link'], product_id))
                
                if cursor.fetchone():
                    errors.append(f'Товар {i+1}: дубликат URL')
                    continue
                
                # Автоматическое определение категории
                category = product.get('category')
                if not category:
                    category = categorize_product(
                        product['title'],
                        product.get('original_description', '')
                    )
                
                # Вставка товара
                insert_query = """
                    INSERT INTO products (
                        title, ai_description, original_description, detailed_description,
                        price, original_price, main_image, category, epn_link, aliexpress_link, 
                        rating, orders_count, external_product_id, status, specifications,
                        shipping_info, video_url, weight, dimensions, warranty_info,
                        created_at, updated_at
                    ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                    RETURNING id
                """
                
                cursor.execute(insert_query, (
                    product['title'],
                    product.get('ai_description'),
                    product.get('original_description'),
                    product.get('detailed_description'),
                    float(product['price']),
                    float(product['original_price']) if product.get('original_price') else None,
                    product.get('main_image'),
                    category,
                    product.get('epn_link'),
                    product['aliexpress_link'],
                    float(product['rating']) if product.get('rating') else 0,
                    int(product['orders_count']) if product.get('orders_count') else 0,
                    product_id,
                    'active',
                    product.get('specifications'),
                    product.get('shipping_info'),
                    product.get('video_url'),
                    float(product['weight']) if product.get('weight') else None,
                    product.get('dimensions'),
                    product.get('warranty_info'),
                    datetime.now(),
                    datetime.now()
                ))
                
                new_product_id = cursor.fetchone()[0]
                
                # Добавляем дополнительные изображения, если они есть
                if product.get('images'):
                    for idx, image_data in enumerate(product['images']):
                        if validate_url(image_data.get('image_url', '')):
                            cursor.execute("""
                                INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
                                VALUES (%s, %s, %s, %s, %s)
                            """, (
                                new_product_id,
                                image_data['image_url'],
                                image_data.get('is_main', False),
                                image_data.get('sort_order', idx),
                                image_data.get('alt_text', '')
                            ))
                
                added_count += 1
                
            except Exception as e:
                errors.append(f'Товар {i+1}: {str(e)}')
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'message': f'Обработано товаров: {len(products)}, добавлено: {added_count}',
            'added_count': added_count,
            'errors': errors
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/categories', methods=['GET'])
def get_categories():
    """Получение списка категорий"""
    try:
        conn = get_db_connection()
        cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
        
        cursor.execute("""
            SELECT category, COUNT(*) as count
            FROM products 
            WHERE status = 'active'
            GROUP BY category
            ORDER BY count DESC
        """)
        
        categories = [{'name': row['category'], 'count': row['count']} 
                     for row in cursor.fetchall()]
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'categories': categories
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/analytics/click', methods=['POST'])
def track_click():
    """Трекинг кликов по товарам"""
    try:
        data = request.get_json()
        product_id = data.get('product_id')
        source = data.get('source', 'website')
        
        if not product_id:
            return jsonify({'success': False, 'error': 'product_id is required'}), 400
        
        conn = get_db_connection()
        cursor = conn.cursor()
        
        # Проверяем, есть ли уже запись для этого товара сегодня
        cursor.execute("""
            SELECT id FROM analytics 
            WHERE product_id = %s AND date = CURRENT_DATE AND source = %s
        """, (product_id, source))
        
        existing = cursor.fetchone()
        
        if existing:
            # Увеличиваем счетчик кликов
            cursor.execute("""
                UPDATE analytics 
                SET clicks = clicks + 1 
                WHERE id = %s
            """, (existing[0],))
        else:
            # Создаем новую запись
            cursor.execute("""
                INSERT INTO analytics (product_id, clicks, source, date) 
                VALUES (%s, 1, %s, CURRENT_DATE)
            """, (product_id, source))
        
        conn.commit()
        cursor.close()
        conn.close()
        
        return jsonify({'success': True})
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)}), 500

@app.route('/api/stats', methods=['GET'])
def get_stats():
    """Получение статистики"""
    try:
        conn = get_db_connection()
        cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
        
        # Общая статистика
        cursor.execute("""
            SELECT 
                COUNT(*) as total_products,
                COUNT(CASE WHEN status = 'active' THEN 1 END) as active_products,
                COUNT(CASE WHEN created_at::date = CURRENT_DATE THEN 1 END) as today_products
            FROM products
        """)
        
        stats = cursor.fetchone()
        
        # Статистика по категориям
        cursor.execute("""
            SELECT category, COUNT(*) as count
            FROM products 
            WHERE status = 'active'
            GROUP BY category
            ORDER BY count DESC
        """)
        
        categories = [{'category': row['category'], 'count': row['count']} 
                     for row in cursor.fetchall()]
        
        # Статистика кликов за последние 7 дней
        cursor.execute("""
            SELECT DATE(date) as date, SUM(clicks) as clicks
            FROM analytics
            WHERE date >= CURRENT_DATE - INTERVAL '7 days'
            GROUP BY DATE(date)
            ORDER BY date
        """)
        
        clicks_data = [{'date': row['date'].isoformat(), 'clicks': row['clicks']} 
                      for row in cursor.fetchall()]
        
        # Статистика изображений
        cursor.execute("""
            SELECT 
                COUNT(*) as total_images,
                COUNT(DISTINCT product_id) as products_with_images
            FROM product_images
        """)
        
        images_stats = cursor.fetchone()
        
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'stats': {
                'total_products': stats['total_products'],
                'active_products': stats['active_products'],
                'today_products': stats['today_products'],
                'categories': categories,
                'clicks_last_7_days': clicks_data,
                'total_images': images_stats['total_images'],
                'products_with_images': images_stats['products_with_images']
            }
        })
        
    except Exception as e:
        return jsonify({'success': False, 'error': str(e)}), 500

@app.route('/api/health', methods=['GET'])
def health_check():
    """Проверка работоспособности API"""
    return jsonify({
        'success': True,
        'message': 'API работает корректно',
        'timestamp': datetime.now().isoformat()
    })

@app.route('/api/parser/start', methods=['POST'])
def start_parser():
    """Запуск парсера с настоящими товарами"""
    try:
        data = request.get_json()
        search_queries = data.get('queries', [])
        max_pages = data.get('max_pages', 1)
        
        if not search_queries:
            return jsonify({
                'success': False,
                'error': 'Не указаны поисковые запросы'
            }), 400
        
        print(f"🎯 Запуск парсера с НАСТОЯЩИМИ товарами для {len(search_queries)} запросов")
        
        import threading
        
        def run_genuine_parser():
            try:
                from genuine_aliexpress_parser import GenuineAliExpressParser
                
                parser = GenuineAliExpressParser()
                max_products = min(max_pages * 2, 4)  # Ограничиваем
                products = parser.parse_and_save(search_queries, max_products_per_query=max_products)
                print(f"🎉 Парсинг с настоящими товарами завершен! Товаров: {len(products)}")
                    
            except Exception as e:
                print(f"❌ Ошибка в парсере с настоящими товарами: {e}")
        
        thread = threading.Thread(target=run_genuine_parser)
        thread.start()
        
        return jsonify({
            'success': True,
            'message': f'Парсинг запущен для {len(search_queries)} запросов. Используются РЕАЛЬНЫЕ товары с AliExpress с проверенными ссылками и изображениями!'
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

@app.route('/api/parser/queries', methods=['GET'])
def get_parser_queries():
    """Получение предустановленных запросов для парсинга"""
    queries = {
        'camping': [
            "camping solar panel",
            "rv battery 12v",
            "portable camping stove",
            "camping mattress inflatable"
        ],
        'electronics': [
            "car inverter 12v 220v",
            "led strip 12v",
            "car charger usb",
            "portable power bank"
        ],
        'tools': [
            "car tire pump",
            "emergency car kit",
            "car jump starter",
            "automotive tools set"
        ]
    }
    
    return jsonify({
        'success': True,
        'queries': queries
    })

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=6000)
    </pre>
    
    <h2>Основные изменения в API</h2>
    
    <h3>1. Новые endpoints для работы с изображениями:</h3>
    <ul>
        <li><strong>GET /api/products/&lt;id&gt;</strong> - получение детальной информации о товаре с изображениями</li>
        <li><strong>GET /api/products/&lt;id&gt;/images</strong> - получение всех изображений товара</li>
        <li><strong>POST /api/products/&lt;id&gt;/images</strong> - добавление нового изображения</li>
        <li><strong>PUT /api/products/&lt;id&gt;/images/&lt;image_id&gt;</strong> - обновление изображения</li>
        <li><strong>DELETE /api/products/&lt;id&gt;/images/&lt;image_id&gt;</strong> - удаление изображения</li>
    </ul>
    
    <h3>2. Обновленные существующие endpoints:</h3>
    <ul>
        <li><strong>GET /api/products</strong> - теперь возвращает изображения для каждого товара</li>
        <li><strong>POST /api/products</strong> - поддерживает добавление изображений при создании товара</li>
        <li><strong>PUT /api/products/&lt;id&gt;</strong> - расширенные поля для обновления</li>
        <li><strong>GET /api/stats</strong> - добавлена статистика по изображениям</li>
    </ul>
    
    <h3>3. Новые поля в базе данных:</h3>
    <ul>
        <li><code>detailed_description</code> - детальное описание товара</li>
        <li><code>specifications</code> - технические характеристики (JSONB)</li>
        <li><code>shipping_info</code> - информация о доставке</li>
        <li><code>video_url</code> - ссылка на видео товара</li>
        <li><code>weight</code> - вес товара</li>
        <li><code>dimensions</code> - размеры товара</li>
        <li><code>warranty_info</code> - информация о гарантии</li>
    </ul>
    
    <h3>4. Новые функции:</h3>
    <ul>
        <li><code>get_product_images(product_id)</code> - получение всех изображений товара</li>
        <li>Улучшенная обработка ошибок для всех endpoints</li>
        <li>Валидация URL изображений</li>
        <li>Автоматическое управление главными изображениями</li>
    </ul>
    
    <div class="note">
        <h3>Примечание по использованию:</h3>
        <p>Для корректной работы обновленного API убедитесь, что вы выполнили SQL скрипт для создания таблицы <code>product_images</code> и добавления новых полей в таблицу <code>products</code>.</p>
    </div>
    
    <h2>Примеры использования новых endpoints</h2>
    
    <h3>Добавление изображения к товару:</h3>
    <pre>
POST /api/products/123/images
Content-Type: application/json

{
    "image_url": "https://example.com/image.jpg",
    "is_main": true,
    "sort_order": 0,
    "alt_text": "Основное изображение товара"
}
    </pre>
    
    <h3>Получение всех изображений товара:</h3>
    <pre>
GET /api/products/123/images

Ответ:
{
    "success": true,
    "images": [
        {
            "id": 1,
            "image_url": "https://example.com/image1.jpg",
            "is_main": true,
            "sort_order": 0,
            "alt_text": "Основное изображение"
        },
        {
            "id": 2,
            "image_url": "https://example.com/image2.jpg",
            "is_main": false,
            "sort_order": 1,
            "alt_text": "Дополнительное изображение"
        }
    ]
}
    </pre>
    
    <h3>Получение детальной информации о товаре:</h3>
    <pre>
GET /api/products/123

Ответ:
{
    "success": true,
    "product": {
        "id": 123,
        "title": "Название товара",
        "price": 1000.00,
        "images": [
            {
                "id": 1,
                "image_url": "https://example.com/image1.jpg",
                "is_main": true,
                "sort_order": 0,
                "alt_text": "Основное изображение"
            }
        ],
        "detailed_description": "Подробное описание товара",
        "specifications": {
            "color": "red",
            "size": "large"
        },
        "total_clicks": 150
    }
}
    </pre>
    
    <p>Данный обновленный сервер полностью совместим с новыми HTML страницами и админ-панелью, предоставляя все необходимые endpoints для работы с множественными изображениями товаров.</p>
</body>
</html>
    <script id="html_badge_script1">
        window.__genspark_remove_badge_link = "https://www.genspark.ai/api/html_badge/" +
            "remove_badge?token=To%2FBnjzloZ3UfQdcSaYfDstzMi4swTtPVnddS6OMnB253zx0eQQ3ZOaWwV%2B4plMhlV4OYEqcu44Yq2ccL7FAbQ%2FqHEQERSEG2u%2Bj8%2BLtoYV1yOJa1QAMlUAxF%2FVUHlR9y7mG8TUBGb3Bq5HYT9dnDmAoIrQqGu07zXF%2Broo3QUB%2F9cnmE2ijQFKr0O%2Fkd8H1tH%2Ba9wh0q3tn2ZlXIKh%2FqopmVY7SQA8NMrpDB52I0R6tCf9aeNNafMYj2a7akmgmtf7n3n%2BiWagFgYLiPQiJxKovbgbyP%2BryCcGlSRiaLW6i5o6SpIMwuUz5yK5Zk%2FeZU%2BkAUZYPBhSj0N1d0QOK08swwGZmSShfpg92QXejJXSHdx91HSt4T8zkmJmTN1TIXFb%2FcPFlInGzJLvB%2FXxvxNGDjmXEnM5Vuzieb3ulY49Fps%2BCxrUNz6IwNKbAFCuMW7Se5hfEbUQE2PN2TJ1qmapcWGavaY3xTlV8pYAV4AQRchR6OaV299GQVH75EKk2J0ggwuCAwV6llQN3wqPomg%3D%3D";
        window.__genspark_locale = "en-US";
        window.__genspark_token = "To/BnjzloZ3UfQdcSaYfDstzMi4swTtPVnddS6OMnB253zx0eQQ3ZOaWwV+4plMhlV4OYEqcu44Yq2ccL7FAbQ/qHEQERSEG2u+j8+LtoYV1yOJa1QAMlUAxF/VUHlR9y7mG8TUBGb3Bq5HYT9dnDmAoIrQqGu07zXF+roo3QUB/9cnmE2ijQFKr0O/kd8H1tH+a9wh0q3tn2ZlXIKh/qopmVY7SQA8NMrpDB52I0R6tCf9aeNNafMYj2a7akmgmtf7n3n+iWagFgYLiPQiJxKovbgbyP+ryCcGlSRiaLW6i5o6SpIMwuUz5yK5Zk/eZU+kAUZYPBhSj0N1d0QOK08swwGZmSShfpg92QXejJXSHdx91HSt4T8zkmJmTN1TIXFb/cPFlInGzJLvB/XxvxNGDjmXEnM5Vuzieb3ulY49Fps+CxrUNz6IwNKbAFCuMW7Se5hfEbUQE2PN2TJ1qmapcWGavaY3xTlV8pYAV4AQRchR6OaV299GQVH75EKk2J0ggwuCAwV6llQN3wqPomg==";
    </script>
    
    <script id="html_notice_dialog_script" src="https://www.genspark.ai/notice_dialog.js"></script>
    