
    Arh                        d dl mZmZmZ d dlmZ d dlZd dlZd dlZd dl	m	Z	 d dl
Z
d dlZd dlmZmZ d dlZd dlZ ej        ej                   d dlZd dlZd dlZd dlmZ  ee          Z ee           dd	d
ddZd Zd Zd ZdZh dZd Zd>dZ e!                    ddg          d             Z"e!                    d          d             Z#d Z$d Z%e!                    ddg          d             Z&e!                    ddg          d             Z'e!                    d dg          d!             Z(e!                    d"dg          d#             Z)e!                    d"dg          d$             Z*e!                    d%d&g          d'             Z+e!                    d%d(g          d)             Z,e!                    d d(g          d*             Z-e!                    d+dg          d,             Z.e!                    d-dg          d.             Z/e!                    d/dg          d0             Z0e!                    d1dg          d2             Z1e!                    d3dg          d4             Z2e!                    d5dg          d6             Z3e!                    d7dg          d8             Z4ed9k    re5                    d:d;d<=           dS dS )?    )Flaskrequestjsonify)CORSN)datetime)urlparseparse_qs)level)secure_filenamez	127.0.0.1aliexpress_automationpostgresPostgresPass123)hostdatabaseuserpasswordc                      	 t          dt                      t          j        di t          } t          d           | S # t          $ r}t          d|             d}~ww xY w)uB   Получение соединения с базой данныхuN   🔌 Попытка подключения к БД с параметрами: uF   ✅ Соединение с БД установлено успешноu1   ❌ Ошибка подключения к БД: N )print	DB_CONFIGpsycopg2connect	Exception)connes     </var/www/html/mycamper/aliexpress-site/backend/api/server.pyget_db_connectionr       s    j_hjjkkk,,),,VWWW   E!EEFFFs   =A   
A"
AA"c                 h    	 t          |           }t          |j        |j        g          S #  Y dS xY w)u   Валидация URLF)r   allschemenetloc)urlresults     r   validate_urlr$   +   s9    #FM6=1222uus   ), 1c                     	 t          j        d|           }|r|                    d          S t          j        d|           }|r|                    d          S dS #  Y dS xY w)u8   Извлечение ID товара из URL AliExpressz(\d+)\.html   z
item/(\d+)N)researchgroup)r"   matchs     r   extract_product_id_from_urlr+   3   sp    	.#.. 	";;q>>! 	--- 	";;q>>!ttts   +A +A A!z?/var/www/html/mycamper/aliexpress-site/frontend/images/products>   gifjpgpngjpegwebpc                 t    d| v o4|                      dd          d                                         t          v S )N.r&   )rsplitlowerALLOWED_EXTENSIONS)filenames    r   allowed_filer7   I   s6    (?WxsA66q9??AAEWWW    c                 |   	 d| v r<|                      dd          \  }}d|v rd}n d|v sd|v rd}nd|v rd}nd|v rd}nd}n| }d}t          t          j                              }|rd	| d
| d| }nd| d| }t          j                            t          |          }t	          j        t          d           t          j
        |          }t          |d          5 }	|	                    |           ddd           n# 1 swxY w Y   d| }
|
dfS # t          $ r}dt          |          fcY d}~S d}~ww xY w)u>   Сохранение base64 изображения в файлdata:image/,r&   r.   r/   r-   r,   r0   product__r2   image_T)exist_okwbNz/frontend/images/products/)splitstruuiduuid4ospathjoinUPLOAD_FOLDERmakedirsbase64	b64decodeopenwriter   )base64_data
product_idheaderdataext	unique_idr6   filepath
image_dataffile_urlr   s               r   save_base64_imagerX   L   s   *K''&,,S!44LFD6!!Uf__&6!!DC 
%%	 	2@*@@y@@3@@HH1	11C11H 7<<x88 	MD1111 %d++
(D!! 	 QGGJ	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  ;::~   SVV|sB   CD  D6D DD 	D
D 
D; D60D;6D;z/api/upload-imagePOST)methodsc                     	 t          j                    } | rd| vrt          ddd          dfS | d         }|                     d          }t	          ||          \  }}|rt          dd| d          dfS t          d	|d
d          S # t
          $ r+}t          dt          |          d          dfcY d}~S d}~ww xY w)u7   Endpoint для загрузки изображенийimageFu6   Изображение не предоставленоsuccesserror  rO   u:   Ошибка сохранения изображения:   Tu8   Изображение успешно загружено)r^   	image_urlmessageN)r   get_jsonr   getrX   r   rB   )rQ   base64_imagerO   rW   r_   r   s         r   upload_imagerg   z   sT   !! 	wd** Q     
 G}XXl++
 ,L*EE% 	 ]V[]]     
 !Q
 
   	    VV
 
    	 	 	 	 	 	s)   ,B AB 8B 
C  B;5C ;C z"/static/images/products/<filename>c                 B    	 ddl m}  |t          |           S #  Y dS xY w)u:   Отдача загруженных изображенийr   )send_from_directory)zFile not found  )flaskri   rH   )r6   ri   s     r   uploaded_filerl      s>    %------""=(;;;%$$$s    c                     | dz   |z                                    g dg dg dg dg dg dd}|                                D ]$\  }}t          fd	|D                       r|c S %d
S )uS   Автоматическое определение категории товара )u   солнечная панельu   батареяu   инверторu   зарядноеu   фонарикu
   радиоgpsu   навигаторu   аккумуляторz
power bankledu   освещение)
u   плиткаu   котелокu   сковородаu   холодильникu   термосu   посудаu   газu   горелкаu   кастрюляu   мультиварка)
u   спальникu   подушкаu   матрасu   одеялоu   креслоu   столu   шезлонгu
   гамакu   палаткаu   тент)	u   инструментu   отверткаu   ключ
   насосu   компрессорu   домкратu   тросu
   канатu   лебедка)u   аптечкаu   огнетушительu   сигнализацияu
   замокu   сейфu   датчикu   камераu   охрана)	u   фильтрrq   u   бакu   кранu
   шлангu   душu   туалетu   септикu   очистка)electronicscookingcomforttoolssafetywaterc              3       K   | ]}|v V  	d S Nr   ).0keywordtexts     r   	<genexpr>z%categorize_product.<locals>.<genexpr>   s'      777w$777777r8   other)r4   itemsany)titledescription
categoriescategorykeywordsr|   s        @r   categorize_productr      s    CK+%,,..D w  w  w P  P  P t  t  t n  n  n g  g  g P  P  P J )..00  (7777h77777 	OOO	 7r8   c           
      ,   	 t                      }|                    t          j        j                  }|                    d| f           g }|                                D ]^}|                    |d         |d         |d         |d         |d         |d         r|d                                         nd	d
           _|	                                 |	                                 |S # t          $ r}t          d|            g cY d	}~S d	}~ww xY w)?   Получение всех изображений товараcursor_factoryz
            SELECT id, image_url, is_main, sort_order, alt_text, created_at
            FROM product_images
            WHERE product_id = %s
            ORDER BY sort_order ASC, id ASC
        idrb   is_main
sort_orderalt_text
created_atN)r   rb   r   r   r   r   zError getting product images: )r   cursorr   extras
DictCursorexecutefetchallappend	isoformatcloser   r   )rO   r   r   imagesrowr   s         r   get_product_imagesr      s@    ""HO,FGG 
 ]	 	 	 ??$$ 	 	CMM$i -y>!,/
O?B<?PZc,/99;;;VZ      	

   2q22333						s   C(C+ +
D5DDDz/api/productsc                  f   d} d}	 t          j                    }t          d|            g d}|D ]1}|                    |          st	          dd| dd          dfc S 2t          |d	                   st	          dd
d          dfS 	 t          |d                   }|dk     rt	          ddd          dfS n$# t          $ r t	          ddd          dfcY S w xY wt          |d	                   }|                    d          }|s*t          |d         |                    dd                    }t                      } |                                 }d| _        t          d           |                    d|d	         |f           |                                }|r,t          d|d                     t	          ddd          dfS |                    d          }	|	rnt          |	t                     rt#          j        |	          }	nDt          |	t&                    r-	 t#          j        |	           n# t"          j        $ r d}	Y nw xY wd}	dqd}
drd}dsd}t          d|	            t          d           d} ||                    d          d           ||                    d                      ||                    d                     |
|                    d          d          |                    d!          r |
|                    d!                    nd ||                    d"                     ||           ||                    d#                     ||                    d	          d           |
|                    d$          d           ||                    d%          d           ||          d&t-          j                    t-          j                    g}t          d'           t1          |          D ]/\  }}t          d(|d)z   d*d+| d,t3          |           d-           0t          d.           |                    ||           |                                d         }t          d/|            g }g }d}|	rDt          |	t                     rt#          j        |	          }nt          |	t&                    r|	}nd} ||                    d0                    | ||                    d1                     ||                    d2                    |                    d3          r |
|                    d3                    nd ||                    d4                     ||                    d5                    d6}t          d7           |                                D ]~\  }}t          d(| d8| d,t3          |           d-           t          |t                     r>t          d9| d:           t#          j        |          }|||<   t          d;|            |                                D ]:\  }}|3|dk    r-|                    | d<           |                    |           ;|rw|                    |           d=d>                    |           d?}t          d@|            t          dA|            |                    ||           t          dB           |                    dCg           }t          dDt;          |           dE           |rt          dFt;          |           dG           	 |                    dH           t          dI           n)# t<          $ r}t          dJ|            Y d}~nd}~ww xY wt1          |          D ]\  }}	 d}t          dK|d)z               t          |t&                    r|                                }nTt          |t                     r)|                    dLd                                          }nt          dM|d)z               |                     dN          r_t          dO|d)z    dP           tC          ||          \  }}|rt          dQ|d)z    d8|            |}t          dR|d)z    dS|            nQ|                     dT          r$t          dU|d)z    dV|ddW          dX           |}nt          dY|d)z    dZ           a|rmt          d[|d)z    d\           |                    d]|||dk    |d^|d)z    f           |                                d         }t          dR|d)z    d_|            # t<          $ r;}t          d`|d)z    d8|            ddl"} | #                                 Y d}~d}~ww xY w|                    da|f           |                                d         }!t          db|!            nt          dc           t          dd           | $                                 |                    de|f           |                                d         }"t          df|" dg|            |%                                 | %                                 t          dh| di           t	          djdk|dl          dmfS # t<          $ r}#t          dn|#            ddl"} | #                                 | r,	 | &                                 t          do           n#  Y nxY w|r|%                                 | r| %                                 t	          dt'          |#          d          dpfcY d}#~#S d}#~#ww xY w)tu.   Добавление нового товараNuM   📥 Получены данные для добавления товара: r   pricealiexpress_linkFu	   Поле u3    обязательно для заполненияr]   r`   r   u!   Неверный формат URLr   r   u<   Цена не может быть отрицательнойu&   Неверный формат ценыr   r   original_description u*   🔄 Начинаем транзакциюz
            SELECT id FROM products 
            WHERE aliexpress_link = %s OR (external_product_id = %s AND external_product_id IS NOT NULL)
        u>   ❌ Товар с таким URL уже существует: u8   Товар с таким URL уже существуетi  specifications        c                 t    | | dk    s| dk    r|S 	 t          |           S # t          t          f$ r |cY S w xY wNr   None)float
ValueError	TypeErrorvaluedefaults     r   
safe_floatzadd_product.<locals>.safe_float6  sV    }uU||#	*   s   ! 77c                     | | dk    s| dk    r|S 	 t          t          |                     S # t          t          f$ r |cY S w xY wr   )intr   r   r   r   s     r   safe_intzadd_product.<locals>.safe_int>  s^    }u5<<(((	*   s   . AAc                     | |S t          | t          t          f          rt          j        |           S | dk    rt          |           n|S )Nr   )
isinstancedictlistjsondumpsrB   r   s     r   safe_strzadd_product.<locals>.safe_strF  sJ    }%$.. )z%(((!&"3u:::'9r8   u<   📊 Подготовленные спецификации: u@   🔄 Используем упрощенную вставку...a  
            INSERT INTO products (
                title, ai_description, original_description, price, original_price,
                main_image, category, epn_link, aliexpress_link, rating, orders_count,
                external_product_id, status, created_at, updated_at
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            RETURNING id
        ai_descriptionoriginal_price
main_imageepn_linkratingorders_countactiveu@   🔍 Проверка упрощенных параметров:z  r&   2dz. u
    (тип: )uK   🚀 Выполняем упрощенную вставку товара...u'   ✅ Товар вставлен с ID: detailed_descriptionshipping_info	video_urlweight
dimensionswarranty_info)r   r   r   r   r   r   r   u>   🔍 Проверка дополнительных полей:: u       ❌ СЛОВАРЬ в u   ! Преобразуем...u$       ✅ Преобразовано:  = %sz6
                UPDATE products 
                SET , z+
                WHERE id = %s
            u?   🔄 Обновляем дополнительные поля: u.   🔢 Параметры обновления: u<   ✅ Дополнительные поля обновленыr   uM   🖼️ Получены изображения для добавления: u    шт.u,   🖼️ Начинаем обработку     изображенийa  
                    CREATE TABLE IF NOT EXISTS product_images (
                        id SERIAL PRIMARY KEY,
                        product_id INTEGER NOT NULL,
                        image_url TEXT NOT NULL,
                        is_main BOOLEAN DEFAULT FALSE,
                        sort_order INTEGER DEFAULT 0,
                        alt_text VARCHAR(255),
                        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                        
                        CONSTRAINT fk_product_images_product_id 
                            FOREIGN KEY (product_id) 
                            REFERENCES products(id) 
                            ON DELETE CASCADE
                    );
                u.   ✅ Таблица product_images готоваu2   ❌ Ошибка создания таблицы: u/   🔍 Обработка изображения rb   u<   ⚠️ Неизвестный тип изображения r:   u   📥 Изображение u@    в формате base64, сохраняем как файл...u=   ❌ Ошибка сохранения изображения u   ✅ Изображение u%    сохранено как файл: )zhttp://zhttps://u   🔗 Изображение u    по URL: d   z...u   ⚠️ Изображение uE    имеет неизвестный формат, пропускаемu/   🚀 Добавляем изображение u    в БДz
                            INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
                            VALUES (%s, %s, %s, %s, %s)
                            RETURNING id
                        zImage u    добавлено с ID uB   ❌ Ошибка при обработке изображения z9SELECT COUNT(*) FROM product_images WHERE product_id = %su;   📊 Итого добавлено изображений: u=   ℹ️ Изображения не предоставленыu-   💾 Коммитим транзакцию...z+SELECT COUNT(*) FROM products WHERE id = %su9   🔍 Финальная проверка: найдено u    товаров с ID u   ✅ Товар ID uQ    успешно добавлен и закоммичен в базу данныхTu*   Товар успешно добавлен)r^   rc   rO      u;   ❌ Ошибка при добавлении товара: u*   🔄 Транзакция откаченаra   )r   )r   ry   )'r   rd   r   re   r   r$   r   r   r+   r   r   r   
autocommitr   fetchoner   r   r   r   rB   loadsJSONDecodeErrorr   now	enumeratetyper   r   rG   lenr   strip
startswithrX   	traceback	print_exccommitr   rollback)$r   r   rQ   required_fieldsfieldr   rO   r   existingr   r   r   r   simple_insert_querysimple_paramsir   new_product_idupdate_fieldsupdate_paramssafe_specificationsadditional_fieldsupdate_queryr   create_errorr\   rb   rU   rW   r_   image_id	img_errorr   added_images_countfinal_checkr   s$                                       r   add_productr      s    DFS!!d^bddeee @??$ 	 	E88E?? $cccc          D!2344 	 <     	$w-((Eqyy$[        
  	 	 	 A       	 16G1HII
 88J'' 	)W/44 H !""  :;;; 	  $%z2	4 	4 	4
 ??$$ 	`S[\]S^``aaa S      "233 		&.$// &!%N!;!;NC00 &*J~....+ * * *%)NNN* "&	 	 	 		 	 	 		: 	: 	: 	: 	]^]]^^^ 	PQQQ HTXXg&&++HTXX.//00HTXX45566Jtxx((!,,6:hh?O6P6PZJJtxx 011222VZHTXXl++,,HXHTXXj))**HTXX/00"55Jtxx))1--HTXXn--q11HZ  LNNLNN
$ 	PQQQ!-00 	B 	BHAu@qs@@@@@$u++@@@AAAA[\\\*M:::  **1-HHHIII  # 	+.$// +&*j&@&@##NC00 +&4##&*# %-HTXX6L-M-M$N$N1%Xdhh&?&?@@!$((;"7"7888<8J8JTjj(!3!3444PT"(488L#9#9::%Xdhh&?&?@@
 
 	NOOO-3355 	F 	FLE5?u????e???@@@%&& FU5UUUVVV
5))+0!%(DUDDEEE-3355 	, 	,LE5 Ub[[$$___555$$U+++ 
	R  000YY}--  L
 cTaccdddR=RRSSSNN<777PQQQ
 (B''q^abh^i^iqqqrrr Z	SeVeeefff[       FGGGG [ [ [Y<YYZZZZZZZZ[ &f-- 9 958 $IQAaCQQRRR!%-- !%*[[]]

#E400 !%*YY{B%?%?%E%E%G%G

b]^_`]`bbccc  ",,];; !  CQqS  C  C  C  D  D  D +<J*W*W%  %!"pbcdebe"p"pin"p"pqqq$$,	qAaCqqfoqqrrrr#../FGG !bQqSbbZX\Y\X\M]bbbccc$.		   Jqs  J  J  J  K  K  K   g]PQRSPS]]]^^^ (
 +%F*QqSNN	
 
 
 $*??#4#4Q#7eAaCee[ceefff    q_`ab_bqqfoqqrrr$$$$'')))HHHH	 NNVYgXijjj!'!2!21!5dPbddeeeeQRRR
 	=>>> 	D~FWXXXoo''*}+}}m{}}~~~

  E>  E  E  E  	F  	F  	FC(
 
   	 	    OAOOPPP  	BCCCC  	LLNNN 	JJLLLVV
 
    	 	 	 	 	 	's  Ak7 ")k7 .B= <k7 =Ck7 CC0k7 Ak7 &H; :k7 ;Ik7 IT$k7 4$^ k7 
^?#^:5k7 :^??k7 Bf#,k7 -Af#k7 A*f#0k7 2A/f#!k7 #
g(-0g#k7 #g((Dk7 7
n0,n+.#mn+mAn+%n0+n0GETc                  J
   	 t          d           t          t          j                            dd                    } t          t          j                            dd                    }t          j                            d          }t          j                            d          }t          j                            d          }t          j                            d	          }|d}t          d|  d| d| d|            | dz
  |z  }d}|g}|r|dz  }|                    |           |r|dk    r|dz  }|                    d           nf|dk    r|dz  }|                    ddg           nC|dk    r|dz  }|                    ddg           n |dk    r|dz  }|                    d           |r#|dz  }d| d}	|                    |	|	|	g           |dz  }|                    ||g           t          d|            t          d |            t                      }
|
                    t          j
        j        !          }|                    ||           |                                }t          d"t          |                      g }t          |          D ]\  }}	 t          d#|dz    d$|d%          d&|d'          d(           |                    d)|d'         f           |                                }d* |D             }t          d+|d'          d,t          |           d-           |d'         |d%         |d.         |d/         |d0         rt!          |d0                   nd1|d2         rt!          |d2                   nd
|d3         |d         |d4         |d5         |d6         rt!          |d6                   nd1|d7         pd1|d	         |d8         r|d8                                         nd
|d9}|                    |           u# t$          $ r;}t          d:|dz    d$|            d1d
l}|                                 Y d
}~d
}~ww xY w|                                 |
                                 t          d;t          |           d<           t-          d=|| |d>          S # t$          $ rU}t          d?|            d1d
l}|                                 t-          d@t/          |          dA          dBfcY d
}~S d
}~ww xY w)CuZ   Получение списка товаров с фильтрацией и поискомu5   🔍 Начало выполнения get_products()pager&   limit   r   price_ranger(   statusNr   u   📋 Параметры: page=z, limit=z, category=z	, status=a  
            SELECT id, title, ai_description, original_description, price, 
                   original_price, main_image, category, epn_link, 
                   aliexpress_link, rating, orders_count, status, created_at
            FROM products 
            WHERE status = %s
        z AND category = %sz0-1000z AND price <= %si  z	1000-5000z AND price > %s AND price <= %si  z
5000-10000i'  z10000+z AND price > %szQ AND (title ILIKE %s OR ai_description ILIKE %s OR original_description ILIKE %s)%z, ORDER BY created_at DESC LIMIT %s OFFSET %su   📋 SQL запрос: u   🔢 Параметры: r   u&   📈 Получено товаров: u%   🔄 Обработка товара r   r   z (ID: r   r   z
                    SELECT id, image_url, is_main, sort_order, alt_text
                    FROM product_images
                    WHERE product_id = %s
                    ORDER BY sort_order ASC, id ASC
                c                 Z    g | ](}|d          |d         |d         |d         |d         d)S )r   rb   r   r   r   )r   rb   r   r   r   r   )rz   imgs     r   
<listcomp>z get_products.<locals>.<listcomp>  sV     	 	 	  "$i%(%5#&y>&),&7$'
O 	 	 	r8   u   🖼️ Товар u    имеет r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u8   ❌ Ошибка при обработке товара u.   📤 Возвращаем результат: u    товаровT)r^   productsr   r   u$   ❌ ОШИБКА в get_products(): Fr]   ra   )r   r   r   argsre   r   extendr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rB   )r   r   r   r   r(   r   offsetqueryparamssearch_paramr   r   rowsr   r   r   images_datar   productr   r   s                        r   get_productsr  ;  s   HEFFF7<##FA..//GL$$Wb1122<##J//l&&}55!!(++!!(++>FjtjjUjjxjjbhjjkkk(e#  	$))EMM(### 	%h&&++d####++::tTl++++,,::tUm,,,,((**e$$$ 	FhhE(v===LMM<|DEEE??ufo&&&///0002&22333 ""HO,FGGuf%%%  Bs4yyBBCCCoo 2	 2	FAs1eaceeS\eeY\]aYbeeefff   
 $i\# # # %oo//	 	  +	 	 	 gCIgg3v;;ggghhh d) \&)*:&;,/0F,G47LGU3w<000aFIJZF[&eeC0@,A&B&B&Bae"%l"3 #J #J'*+<'=69(mJeCM222$'$7$<1!(mCF|CT"^#l"3"="="?"?"?Z^$ $ ((((   [QRSTQT[[XY[[\\\    ##%%%	 	

]s8}}]]]^^^ 	
 
   	    8Q88999VV
 
    	 	 	 	 	 		sK   J.S 1E,PS 
Q$)0QS Q$$AS 
T"A
TT"T"z/api/products/<int:product_id>c           	      h   	 t                      }|                    t          j        j                  }|                    d| f           |                                }|s<|                                 |                                 t          ddd          dfS |                    d| f           |                                }|r|d         r|d         nd	}|                                 |                                 i d
|d
         d|d         d|d         d|d         d|d         d|d         rt          |d                   nd	d|d         rt          |d                   ndd|d         d|d         d|d         d|d         d|d         rt          |d                   nd	d|d         pd	d|d         d|d         r|d         
                                ndd|d         d|d         |d         |d         rt          |d                   nd|d         |d         |                    d           rt          j        |d                    ng |d!}t          d"|d#          S # t          $ r+}t          dt          |          d          d$fcY d}~S d}~ww xY w)%uJ   Получение детальной информации о товареr   a  
            SELECT p.*, 
                   COALESCE(
                       (SELECT json_agg(
                           json_build_object(
                               'id', pi.id,
                               'image_url', pi.image_url,
                               'is_main', pi.is_main,
                               'sort_order', pi.sort_order,
                               'alt_text', pi.alt_text
                           ) ORDER BY pi.sort_order ASC, pi.id ASC
                       )
                       FROM product_images pi 
                       WHERE pi.product_id = p.id),
                       '[]'::json
                   ) as images
            FROM products p
            WHERE p.id = %s
        F   Товар не найденr]   rj   zu
            SELECT SUM(clicks) as total_clicks
            FROM analytics
            WHERE product_id = %s
        total_clicksr   r   r   r   r   r   r   r   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   product_images_list)r   r   r   r   r   r  T)r^   r   ra   )r   r   r   r   r   r   r   r   r   r   r   re   r   r   r   rB   )rO   r   r   r   statsr  product_datar   s           r   get_product_detailr    s   S ""HO,FGG 	 $ ]%	 	 	( //## 	LLNNNJJLLL 7      	  ]		 	 	 !!05V%:OVu^,,UV


'$-
WW%
 g&67
 #G,B$C	

 #G,B$C
 0@GU77+,,,a
 'JZB[eeG,<$=>>>ae
 ',/
 
+
 
+
 w'89
 '(2CJeGH-...
 GN38q
 gh'
 w|?T^',/99;;;Z^
  g&67!
" W_5#
$ !-29(2CMeGH-...!,/$_5DKKKPeDfDfndj)>!?@@@ln(/
 
 
4 #
 
   	
    VV
 
    	 	 	 	 	 	s%   BI< GI< <
J1 J,&J1,J1z%/api/products/<int:product_id>/imagesc                     	 t          |           }t          d|d          S # t          $ r+}t          dt          |          d          dfcY d}~S d}~ww xY w)r   T)r^   r   Fr]   ra   N)r   r   r   rB   )rO   r   r   s      r   get_product_images_apir
  !  s    #J//
 
   	
    VV
 
    	 	 	 	 	 	s    # 
A AAAc                 
   	 t          j                    }|                    d          }|                    dd          }|                    dd          }|                    dd          }|st          ddd	          d
fS t	          |          st          ddd	          d
fS t                      }|                                }|                    d| f           |                                s<|	                                 |	                                 t          ddd	          dfS |r|                    d| f           |                    d| ||||f           |                                d         }|
                                 |	                                 |	                                 t          dd|d          dfS # t          $ r+}	t          dt          |	          d	          dfcY d}	~	S d}	~	ww xY w)u;   Добавление изображения к товаруrb   r   Fr   r   r   r   u   image_url обязателенr]   r`   u8   Неверный формат URL изображения%SELECT id FROM products WHERE id = %sr  rj   
                UPDATE product_images 
                SET is_main = FALSE 
                WHERE product_id = %s
            z
            INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
            VALUES (%s, %s, %s, %s, %s)
            RETURNING id
        Tu8   Изображение успешно добавлено)r^   rc   r   r   ra   N)r   rd   re   r   r$   r   r   r   r   r   r   r   rB   )
rO   rQ   rb   r   r   r   r   r   r   r   s
             r   add_product_imager  2  s   @!!HH[))	((9e,,XXlA..
88J++ 	 9     
 I&& 	 S     
 !"" 	>NNN   	LLNNNJJLLL 7       	 NN  	      	  )Wj(C		E 	E 	E ??$$Q'

Q 
 
   	 	    VV
 
    	 	 	 	 	 	s2   A?G "G %BG .BG 
H G=7H=Hz4/api/products/<int:product_id>/images/<int:image_id>PUTc                    	 t          j                    }t                      }|                                }|                    d|| f           |                                s<|                                 |                                 t          ddd          dfS |                    d          r|                    d| f           g }g }dD ]9}||v r3|	                    | d	           |	                    ||                    :|rD|
                    || g           |                    d
d                    |           d|           |                                 |                                 |                                 t          ddd          S # t          $ r+}t          dt          |          d          dfcY d}~S d}~ww xY w)u8   Обновление изображения товараb
            SELECT id FROM product_images 
            WHERE id = %s AND product_id = %s
        F*   Изображение не найденоr]   rj   r   r  )rb   r   r   r   r   z<
                UPDATE product_images 
                SET r   z?
                WHERE id = %s AND product_id = %s
            Tu8   Изображение успешно обновленоr^   rc   ra   N)r   rd   r   r   r   r   r   r   re   r   r   rG   r   r   rB   )	rO   r   rQ   r   r   r   r   r   r   s	            r   update_product_imager  w  sO   :!! "" 	  
#	% 	% 	%
    	LLNNNJJLLL E      88I 	 NN  	      G 	+ 	+E}}$$___555d5k*** 	MM8Z0111NN YY}--   	   	

Q
 
   	
    VV
 
    	 	 	 	 	 	s%   BF C?F 
G) G	GGDELETEc                 T   	 t                      }|                                }|                    d|| f           |                                s<|                                 |                                 t          ddd          dfS |                    d|| f           |                                 |                                 |                                 t          ddd	          S # t          $ r+}t          dt          |          d          d
fcY d}~S d}~ww xY w)u4   Удаление изображения товараr  Fr  r]   rj   z_
            DELETE FROM product_images 
            WHERE id = %s AND product_id = %s
        Tu4   Изображение успешно удаленоr  ra   N)	r   r   r   r   r   r   r   r   rB   )rO   r   r   r   r   s        r   delete_product_imager    s~   % "" 	  
#	% 	% 	%
    	LLNNNJJLLL E      	  
#	% 	% 	%
 	

M
 
   	
    VV
 
    	 	 	 	 	 	s%   B	C2 A%C2 2
D'< D"D'"D'c                 t   	 t                      }|                                }|                    d| f           |                                s<|                                 |                                 t          ddd          dfS |                    dt          j                    | f           |                                 |                                 |                                 t          ddd	          S # t          $ r+}t          dt          |          d          d
fcY d}~S d}~ww xY w)u=   Удаление товара (мягкое удаление)r  Fr  r]   rj   zt
            UPDATE products 
            SET status = 'deleted', updated_at = %s
            WHERE id = %s
        Tu&   Товар успешно удаленr  ra   N)r   r   r   r   r   r   r   r   r   r   rB   )rO   r   r   r   s       r   delete_productr    st   " "" 	>NNN   	LLNNNJJLLL 7      	  lnnj)		+ 	+ 	+ 	

?
 
   	
    VV
 
    	 	 	 	 	 	s%   BD A6D 
D7 D2,D72D7z/api/products/bulkc                  
   	 t          j                    } |                     dg           }|st          ddd          dfS t	                      }|                                }d}g }t          |          D ]g\  }	 t          fddD                       s|                    d	|d
z    d           ?t          d                   s|                    d	|d
z    d           qt          d                   }|                    dd         |f           |                                r|                    d	|d
z    d           Չ                    d          }|s*t          d                             dd                    }                    d          }	|	rnt          |	t                    rt!          j        |	          }	nDt          |	t$                    r-	 t!          j        |	           n# t           j        $ r d}	Y nw xY wd}	d}
|                    |
d                             d                              d                              d          t+          d                                       d          rt+          d                   nd                    d          |                    d          d         t+                              dd                    t-                              dd                    |dt/          j                    t/          j                    |	                    d                               d!                              d"          r"t+                              d"                    nd                    d#                              d$          f           |                                d         }                    d%g           }|rt          |          D ]\  }}t          |                    d&d                    r]|                    d'||d&         |                    d(d          |                    d)|          |                    d*d          f           |d
z  }&# t2          $ r6}|                    d	|d
z    d+t%          |                      Y d}~ad}~ww xY w|                                 |                                 |                                 t          d,d-t9          |           d.| ||d/          S # t2          $ r+}t          dt%          |          d          d0fcY d}~S d}~ww xY w)1u4   Массовое добавление товаровr   FuA   Список товаров не может быть пустымr]   r`   r   c              3   B   K   | ]}                     |          V  d S ry   )re   )rz   r   r   s     r   r}   z$add_products_bulk.<locals>.<genexpr>#  s/      aa%7;;u--aaaaaar8   r   u   Товар r&   u:   : отсутствуют обязательные поляr   u#   : неверный формат URLz
                    SELECT id FROM products 
                    WHERE aliexpress_link = %s OR (external_product_id = %s AND external_product_id IS NOT NULL)
                u   : дубликат URLr   r   r   r   r   NaV  
                    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, created_at, updated_at,
                        specifications, shipping_info, video_url, weight, dimensions, warranty_info
                    ) 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
                r   r   r   r   r   r   r   r   r   r   r   r   r   r   additional_imagesrb   z
                                INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
                                VALUES (%s, %s, %s, %s, %s)
                            r   r   r   r   Tu%   Обработано товаров: u   , добавлено: )r^   rc   added_counterrorsra   )r   rd   re   r   r   r   r   r   r   r$   r+   r   r   r   r   r   r   r   rB   r   r   r   r   r   r   r   r   r   r   )rQ   r   r   r   r  r  r   rO   r   r   insert_queryr   r  idxrU   r   r   s                   @r   add_products_bulkr!    s   H!!88J++ 	 \     
 !""#H-- g	= g	=JAwf=aaaa;`aaaaa MM"o!"o"o"oppp $G,=$>?? MM"X!"X"X"XYYY 9AR9STT
    /0*=? ? ?
 ??$$ MM"K!"K"K"KLLL #;;z22 1($:B??   H ")-=!>!>! 	.!.$77 .)-N)C)C#NC88 .2 J~6666#3 2 2 2-1NNN2 *.  |G$KK 011KK 677KK 677''*++8?DT8U8U_E'"23444[_KK--KK
++-.'++h2233NA6677LNNLNN"KK00KK,,4;KK4I4ISE'++h//000tKK--KK00-.   2 "(!2!21!5 %,KK0CR$H$H!$ +45F+G+G  Z'
{B(G(GHH 
"NN ,  !/ *; 7 *y% @ @ *|S A A *z2 > >"	 	 	 q  = = =;AaC;;3q66;;<<<<<<<<= 	

qs8}}qqdoqq&	
 
   	    VV
 
    	 	 	 	 	 	s   >U ;U >7R5U 61R'U (A#RU BR$G98R9H
RHJRU 
S'+SU SA%U 
U8 U3-U83U8z/api/categoriesc                     	 t                      } |                     t          j        j                  }|                    d           d |                                D             }|                                 |                                  t          d|d          S # t          $ r+}t          dt          |          d          dfcY d	}~S d	}~ww xY w)
u2   Получение списка категорийr   
            SELECT category, COUNT(*) as count
            FROM products 
            WHERE status = 'active'
            GROUP BY category
            ORDER BY count DESC
        c                 0    g | ]}|d          |d         dS )r   count)namer%  r   rz   r   s     r   r   z"get_categories.<locals>.<listcomp>  s8     3 3 3  #:WFF 3 3 3r8   T)r^   r   Fr]   ra   N)r   r   r   r   r   r   r   r   r   r   rB   )r   r   r   r   s       r   get_categoriesr(    s    ""HO,FGG  	 	 	3 3 & 1 13 3 3
 	

$
 
   	
    VV
 
    	 	 	 	 	 	s   BB" "
C, CCCz/api/analytics/clickc                     	 t          j                    } |                     d          }|                     dd          }|st          ddd          dfS t	                      }|                                }|                    d||f           |                                }|r|                    d	|d
         f           n|                    d||f           |                                 |	                                 |	                                 t          ddi          S # t          $ r+}t          dt          |          d          dfcY d}~S d}~ww xY w)u/   Трекинг кликов по товарамrO   sourcewebsiteFzproduct_id is requiredr]   r`   zy
            SELECT id FROM analytics 
            WHERE product_id = %s AND date = CURRENT_DATE AND source = %s
        zv
                UPDATE analytics 
                SET clicks = clicks + 1 
                WHERE id = %s
            r   z
                INSERT INTO analytics (product_id, clicks, source, date) 
                VALUES (%s, 1, %s, CURRENT_DATE)
            r^   Tra   N)r   rd   re   r   r   r   r   r   r   r   r   rB   )rQ   rO   r*  r   r   r   r   s          r   track_clickr,    s   (A!!XXl++
(I.. 	Wu7OPPQQSVVV "" 	  &!	# 	# 	#
 ??$$ 	'NN  1+	! ! ! ! NN  f%' ' '
 	

	4())) A A A53q66::;;S@@@@@@@As%   AD) CD) )
E3 EEEz
/api/statsc                  
   	 t                      } |                     t          j        j                  }|                    d           |                                }|                    d           d |                                D             }|                    d           d |                                D             }|                    d           |                                }|                                 |                                  t          d|d	         |d
         |d         |||d         |d         dd          S # t          $ r+}t          dt          |          d          dfcY d}~S d}~ww xY w)u'   Получение статистикиr   a  
            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
        r#  c                 0    g | ]}|d          |d         dS )r   r%  )r   r%  r   r'  s     r   r   zget_stats.<locals>.<listcomp>  s8     3 3 3 $'z?S\JJ 3 3 3r8   z
            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
        c                 T    g | ]%}|d                                           |d         d&S )dateclicks)r0  r1  )r   r'  s     r   r   zget_stats.<locals>.<listcomp>  sD     4 4 4 !$F 5 5 7 73x=QQ 4 4 4r8   z
            SELECT COUNT(*) as total_images,
                   COUNT(DISTINCT product_id) as products_with_images
            FROM product_images
        Ttotal_productsactive_productstoday_productstotal_imagesproducts_with_images)r2  r3  r4  r   clicks_last_7_daysr5  r6  )r^   r  Fr]   ra   N)r   r   r   r   r   r   r   r   r   r   r   rB   )r   r   r  r   clicks_dataimages_statsr   s          r   	get_statsr:    s   AA ""HO,FGG 	  	 	 	 !! 	  	 	 	3 3 & 1 13 3 3
 	  	 	 	4 4!'!2!24 4 4 	  	 	 	 ((

"'(8"9#():#;"'(8"9(&1 ,^ <(45K(L 
 
   	  A A A53q66::;;S@@@@@@@As   E
E 
F E=7F=Fz/api/healthc                  n    t          ddt          j                                                    d          S )u7   Проверка работоспособности APITu'   API работает корректно)r^   rc   	timestamp)r   r   r   r   r   r8   r   health_checkr=  .  s;     <\^^--//    r8   z/api/parser/startc                     	 t          j                    } |                     dg           |                     dd          st          ddd          dfS t	          t
                    rd                     d	          D             t          d
t                     d           t          d            ddl	}fd}|
                    |          }d|_        |                                 t          ddt                     dd          S # t          $ r=}t          d|            t          dt          |          d          dfcY d}~S d}~ww xY w)uD   Запуск парсера с официальным API AliExpressqueries	max_pagesr&   Fu5   Не указаны поисковые запросыr]   r`   c                 ^    g | ]*}|                                 |                                 +S r   )r   )rz   qs     r   r   z start_parser.<locals>.<listcomp>G  s-    YYYAqwwyyYaggiiYYYr8   
u,   🎯 Запуск API парсера для u    запросовu   📝 Запросы: r   Nc                     	 ddl m} m} ddlm} t          d            || |          }t          dz  d          }t          d|            |                    	|          }t          d	t          |                      d S # t          $ r,}t          d
|            t          d           Y d }~d S d }~wt          $ r5}t          d|            dd l}|                                 Y d }~d S d }~ww xY w)Nr   )ALIEXPRESS_APP_KEYALIEXPRESS_APP_SECRET)AliExpressAPIParseru5   🔑 Инициализация API парсера...   
   u8   📊 Максимум товаров на запрос: )max_products_per_queryuM   🎉 API парсинг завершен! Добавлено товаров: u!   ❌ Ошибка импорта: ue   🔧 Проверьте, что файлы config.py и aliexpress_api_parser.py существуютu(   ❌ Ошибка в API парсере: )configrE  rF  aliexpress_api_parserrG  r   minparse_and_saver   ImportErrorr   r   r   )
rE  rF  rG  parsermax_productsr   r   r   r@  search_queriess
           r   run_api_parserz$start_parser.<locals>.run_api_parserN  sw   &LLLLLLLLEEEEEENOOO,,-?AVWW"9q="55_Q]__```!00Xd0eeufijrfsfsuuvvvvv   =!==>>>}~~~~~~~~~ & & &DDDEEE    ##%%%%%%%%%&s$   BB	 	
C<!B::C<*C77C<)targetTu)   API парсинг запущен для uq    запросов. Используется официальный API AliExpress с вашими ключами!r  u4   ❌ Ошибка запуска API парсера: ra   )r   rd   re   r   r   rB   rA   r   r   	threadingThreaddaemonstartr   )rQ   rU  rS  threadr   r@  rR  s        @@r   start_parserrZ  7  s   :!!)R00HH[!,,	 	 P      nc** 	ZYY1E1Ed1K1KYYYNcS=P=Pcccddd6n66777	& 	& 	& 	& 	& 	&0 !!!88 J3~CVCV  J  J  J
 
   	
    HQHHIIIVV
 
    	 	 	 	 	 	s%   AD CD 
E$'2EE$E$z/api/parser/queriesc                  >    g dg dg dd} t          d| d          S )u^   Получение предустановленных запросов для парсинга)zcamping solar panelzrv battery 12vzportable camping stovezcamping mattress inflatable)zcar inverter 12v 220vzled strip 12vzcar charger usbzportable power bank)zcar tire pumpzemergency car kitzcar jump starterzautomotive tools set)campingrr   ru   T)r^   r?  )r   )r?  s    r   get_parser_queriesr]  w  s_    
 
 

 
 

 
 
 G*     r8   __main__Tz0.0.0.0ip  )debugr   portry   )6rk   r   r   r   
flask_corsr   r   psycopg2.extrasrE   r   r   requestsurllib.parser   r	   r'   loggingbasicConfigDEBUGrJ   rC   werkzeug.utilsr   __name__appr   r   r$   r+   rH   r5   r7   rX   routerg   rl   r   r   r   r  r  r
  r  r  r  r  r!  r(  r,  r:  r=  rZ  r]  runr   r8   r   <module>rm     s   ) ) ) ) ) ) ) ) ) )            				         + + + + + + + + 				   '- ( ( ( ( 				   * * * * * *eHoo S			 '!	 		 	 	    & R::: X X X, , , ,\ 11! ! 21!H /00% % 10%  (  D ?VH--W W .-Wt
 ?UG,,J J -,JZ +eW==U U >=Un 2UGDD  ED  2VHEEB B FEBH AE7SS< < TS<| AH:VV' ' WV'^ +hZ@@$ $ A@$L &22J J 32JZ ug..  /.> !F844*A *A 54*AX <%))CA CA *)CAJ =5'**  +* 11< < 21<~  5'22  328 zGG$YTG22222 r8   