Ë
    È�õiT5  ã                   óÎ  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZm Z  d d
l!m"Z" ejF                  jI                  ejF                  jK                  e&«      «      Z'ejF                  jI                  e'«      Z(d dl)m*Z*  e*ejF                  jW                  e(d«      «       ejF                  jW                  e'd«      Z, ejZ                  dd«      Z. ejZ                  dd«      Z/ ejZ                  dd«      Z0dZ1dZ2 ee/¬«      Z3da4da5 e jl                  «       Z7e jl                  e8d<   d„ Z9d„ Z:d5d„Z;d„ Z<e"defd„«       Z= ee=¬«      Z>e>j                  edgdgdg¬ «       e>j�                  d!«       e
d"«      fd#e	fd$„«       ZAe>j…                  d%«      d&„ «       ZCd'eDfd(„ZEe>j�                  d)«      d'eDfd*„«       ZFe>j�                  d+d,¬-«      d'eDfd.„«       ZGe>j…                  d/«      d0„ «       ZHe>j�                  d1«       e
d"«      fd#e	fd2„«       ZIe>j•                  d3«      d'eDfd4„«       ZKy)6é    N)Úglob)ÚFastAPIÚ
UploadFileÚFileÚHTTPException)ÚCORSMiddleware)ÚImageÚ	ImageStatÚImageEnhanceÚImageOpsÚImageFilter)ÚSentenceTransformer)ÚYOLO)ÚQdrantClient)ÚDistanceÚVectorParamsÚPointStructÚFilterÚFieldConditionÚ
MatchValue)Úasynccontextmanager)Úload_dotenvz.envÚmodelsÚ	IMAGE_DIRz$/var/www/pod-logistic/pod-api/designÚQDRANT_PATHz+/var/www/pod-logistic/pod-ai/vector_db_dataÚCOLLECTION_NAMEÚsticker_visual_searchzclip-ViT-B-32z
yolov8s.pt)ÚpathÚindex_queuec                  ó¶  — t        j                  t        d¬«       t        j                  t        d¬«       t        j                  t        «      s?t        j                  t        t        dt        j                  ¬«      ¬«       t        d«       t        t        «      at         j                  j!                  t        t"        «      } t         j                  j%                  | «      s_t        dt"        › d�«       t'        t"        «       t         j                  j%                  t"        «      rt)        j*                  t"        | «       t'        | «      at        d	«       y )
NT)Úexist_oki   )ÚsizeÚdistance)Úcollection_nameÚvectors_configu+   => Ä�Ã£ táº¡o Database Qdrant thÃ nh cÃ´ng.u   => Ä�ang tá»± Ä‘á»™ng táº£i z...u)   => ToÃ n bá»™ AI Models Ä‘Ã£ sáºµn sÃ ng!)ÚosÚmakedirsÚ
MODELS_DIRr   ÚclientÚcollection_existsr   Úcreate_collectionr   r   ÚCOSINEÚprintr   ÚCLIP_MODEL_NAMEÚmodelr   ÚjoinÚYOLO_MODEL_NAMEÚexistsr   ÚshutilÚmoveÚdetector)Ú	yolo_paths    ú,/var/www/pod-logistic/pod-ai/backend/main.pyÚsetup_systemr8   >   sÔ   € ä‡K�K”
 TÕ*Ü‡K�K”	 DÕ)ä×#Ñ#¤OÔ4Ü× Ñ Ü+Ü'¨S¼8¿?¹?ÔKð 	!ô 	
ô 	Ð;Ô<ä¤Ó0€Eä—‘—‘œZ¬Ó9€IÜ�7‰7�>‰>˜)Ô$ÜÐ,¬_Ð,=¸SÐAÔBÜŒ_ÔÜ�7‰7�>‰>œ/Ô*Ü�K‰Kœ¨Ô3Ü�I‹€HÜ	Ð
5Õ6ó    c                 ó  — t        j                  | «      }|j                  dv s|j                  dk(  rÄd|j                  v r¶|j	                  d«      }|j                  «       d   }t        j                  |j	                  d«      |¬«      }|j                  r|j                  d   nd	}|d
kD  rd}nd}t        j                  d|j                  |«      }|j                  ||¬«       |j	                  d«      S |j	                  d«      S )uî   
    Xá»­ lÃ½ áº£nh PNG thÃ´ng minh:
    Tá»± Ä‘á»™ng lÃ³t ná»�n Ä�en Tuyá»‡t Ä�á»‘i cho chá»¯ Tráº¯ng, vÃ  Tráº¯ng Tuyá»‡t Ä�á»‘i cho chá»¯ Ä�en
    nháº±m giá»¯ láº¡i tá»‘i Ä‘a Ä‘áº·c trÆ°ng hÃ¬nh há»�c (Geometry) cá»§a nÃ©t chá»¯.
    )ÚRGBAÚLAÚPÚtransparencyr;   é   ÚL)Úmaskr   é€   é   )r   r   r   éÿ   )rD   rD   rD   rD   ÚRGB)r	   ÚopenÚmodeÚinfoÚconvertÚsplitr
   ÚStatÚmeanÚnewr"   Úpaste)Úimage_sourceÚimgÚ
alpha_maskÚstatÚavg_brightnessÚbg_colorÚ
backgrounds          r7   Úload_and_preprocess_imagerV   V   sÛ   € ô �*‰*�\Ó
"€Cà
‡x�x�>Ñ! c§h¡h°#¢o¸.ÈCÏHÉHÑ:TØ�k‰k˜&Ó!ˆØ—Y‘Y“[ ‘^ˆ
ä�~‰~˜cŸk™k¨#Ó.°ZÔ@ˆØ)-¯ª˜Ÿ™ 1š¸ˆð ˜CÒØ%‰Hà+ˆHä—Y‘Y˜v s§x¡x°Ó:ˆ
Ø×Ñ˜ :ÐÔ.Ø×!Ñ! %Ó(Ð(à�;‰;�uÓÐr9   c           	      ó|  — g }| j                   \  }} || |d¬«      }|d   j                  j                  D ]ƒ  }t        t        |«      \  }	}
}}||	kD  sŒ||
kD  sŒ$t        d|	|z
  «      }t        d|
|z
  «      }t        |||z   «      }t        |||z   «      }|j                  | j                  ||||f«      «       Œ… |S )uc   Sá»­ dá»¥ng YOLO Ä‘á»ƒ gáº¯p váº­t thá»ƒ vÃ  ná»›i lá»�ng viá»�n (Padding) Ä‘á»ƒ khÃ´ng láº¹m chá»¯F)ÚconfÚverboser   )	r"   ÚboxesÚxyxyÚmapÚintÚmaxÚminÚappendÚcrop)rP   r5   rX   ÚpaddingÚcropsÚwÚhÚresultsÚboxÚx1Úy1Úx2Úy2Úpx1Úpy1Úpx2Úpy2s                    r7   Ú	get_cropsrp   r   sÆ   € à€EØ�8‰8�D€A€qÙ�s ¨uÔ5€GØ�q‰z×Ñ×$Ñ$ò 9ˆÜœS #›‰ˆˆB��BØ�‹7�r˜B“wä�a˜˜g™Ó&ˆCÜ�a˜˜g™Ó&ˆCÜ�a˜˜g™Ó&ˆCÜ�a˜˜g™Ó&ˆCØ�L‰L˜Ÿ™ 3¨¨S°#Ð"6Ó7Õ8ð9ð €Lr9   c               ƒ   óP  K  — 	 t         j                  «       ƒ d{  –—† } 	 t        | «       t        d| › dt         j	                  «       › �«       t         j                  «        Œ`7 ŒH# t
        $ r}t        d| › d|› �«       Y d}~Œ6d}~ww xY w# t         j                  «        w xY w­w)uP   Worker FIFO: láº¥y tá»«ng file_name ra khá»�i hÃ ng chá»� vÃ  index vÃ o Qdrant.Nu   [Queue] Ä�Ã£ index: u    | CÃ²n láº¡i: u   [Queue] Lá»—i index z: )r   ÚgetÚindex_design_filer-   ÚqsizeÚ	ExceptionÚ	task_done)Ú	file_nameÚes     r7   Ú_background_indexerry   ƒ   s”   è ø€ à
Ü%Ÿ/™/Ó+×+ˆ	ð	$Ü˜iÔ(ÜÐ(¨¨°?Ä;×CTÑCTÓCVÐBWÐXÔYô ×!Ñ!Ô#ð Ø+ùô ò 	;ÜÐ(¨¨°2°a°SÐ9×:Ñ:ûð	;ûô ×!Ñ!Õ#üsD   ‚B&›A$œB&¡.A& ÁB&Á&	B
Á/BÂ B ÂB
Â
B ÂB#Â#B&Úappc                ó„   K  — t        «        t        j                  t        «       «      }d ­–— |j	                  «        y ­w)N)r8   ÚasyncioÚcreate_taskry   Úcancel)rz   Úworkers     r7   Úlifespanr€   �   s+   è ø€ ä„NÜ× Ñ Ô!4Ó!6Ó7€FÜ	Ø
‡M�M…Oùs   ‚>A )r€   Ú*)Úallow_originsÚallow_methodsÚallow_headersz/search-image.Úfilec           	   ƒ   óÎ  K  — d}	 | j                  «       ƒ d {  –—† }t        t        j                  |«      «      }|j                  \  }}||z  }t        |t        dd¬«      }g }|D ]<  }	|	j                  \  }
}|
|z  }d|z  |cxk  r	d|z  k  sŒ)n Œ,|j                  |	«       Œ> g }t        |«      dkD  r|}n½|j                  |«       t        |dz  «      t        |dz  «      }}||dz  kD  r2||dz  kD  r*|j                  |j                  ||||z
  ||z
  f«      «       t        |d	z  «      t        |d	z  «      }}||dz  kD  r2||dz  kD  r*|j                  |j                  ||||z
  ||z
  f«      «       g }|D ]Þ  }	t        j                  |	«      }|j                  d
«      }t        j                  |«      }|j                  d«      }t        j                   |	d¬«      }g d¢}|D ]p  }|dk(  r#|j                  |«       |j                  |«       Œ+|j                  |j#                  |dd¬«      «       |j                  |j#                  |dd¬«      «       Œr Œà i }|D ]˜  }	t$        j'                  |	d¬«      j)                  «       }t*        j-                  t.        |d|¬«      }|j0                  D ]E  }|j2                  j5                  d«      }t7        |j8                  d«      }||vs	|||   kD  sŒA|||<   ŒG Œš |j;                  «       D � �!cg c]
  \  } }!|!| dœ‘Œ }"} }!t=        |"d„ d¬«      }#d|#d d iS 7 �Œc c}!} w # t>        $ r}$tA        dtC        |$«      ¬«      ‚d }$~$ww xY w­w)Ngffffffæ?ç333333Ã?é   )rX   rb   gš™™™™™©?g®Gáz®ï?r   é   g      Ð?g       @g333333ó?)Úcutoff)r   éZ   é´   i  rˆ   iñÿÿÿT)rD   rD   rD   )ÚexpandÚ	fillcolorF©Úshow_progress_baréô  )r$   ÚqueryÚlimitÚscore_thresholdrw   é   )Úscorerw   c                 ó   — | d   S )Nr–   © )Úxs    r7   ú<lambda>z#search_by_sticker.<locals>.<lambda>  s
   € ¸!¸G¹*€ r9   )ÚkeyÚreverserf   éÈ   ©Ústatus_codeÚdetail)"ÚreadrV   ÚioÚBytesIOr"   rp   r5   r`   Úlenr]   ra   r   Ú	SharpnessÚenhanceÚContrastr   ÚautocontrastÚrotater/   ÚencodeÚtolistr)   Úquery_pointsr   ÚpointsÚpayloadrr   Úroundr–   ÚitemsÚsortedru   r   Ústr)%r…   ÚFIXED_THRESHOLDÚcontentÚ	query_imgrd   re   Ú
total_areaÚ	raw_cropsÚvalid_cropsra   ÚcwÚchÚ	crop_areaÚsearch_targetsÚpad_15xÚpad_15yÚpad_25xÚpad_25yÚaugmented_targetsÚsharp_enhancerÚ
crop_sharpÚcontrast_enhancerÚcrop_stdÚcrop_rescueÚanglesÚangleÚunique_resultsÚquery_vectorÚresponseÚpÚfnamer–   ÚfÚsÚ
final_listÚsorted_resultsrx   s%                                        r7   Úsearch_by_stickerrÒ   ¡   s™  è ø€ à€Oðh<ØŸ	™	›×#ˆÜ-¬b¯j©j¸Ó.AÓBˆ	Ø�~‰~‰ˆˆ1Ø˜‘Uˆ
ô ˜i¬¸ÀbÔIˆ	àˆØò 	)ˆDØ—Y‘Y‰FˆB�Ø˜R™ˆIà�jÑ  9Ô@¨t°jÑ/@Ö@Ø×"Ñ" 4Õ(ð	)ð ˆÜˆ{Ó˜aÒà(‰Nð ×!Ñ! )Ô,ô  # 1 t¡8›}¬c°!°d±(«m�WˆGØ�7˜Q‘;Š 1 w°¡{¢?Ø×%Ñ%Ø—N‘N G¨W°a¸'±kÀ1ÀwÁ;Ð#OÓPôô
  # 1 t¡8›}¬c°!°d±(«m�WˆGØ�7˜Q‘;Š 1 w°¡{¢?Ø×%Ñ%Ø—N‘N G¨W°a¸'±kÀ1ÀwÁ;Ð#OÓPôð ÐØ"ò 	ˆDä)×3Ñ3°DÓ9ˆNØ'×/Ñ/°Ó4ˆJÜ ,× 5Ñ 5°jÓ AÐØ(×0Ñ0°Ó5ˆHô #×/Ñ/°¸QÔ?ˆKò 0ˆFØò �Ø˜A’:Ø%×,Ñ,¨XÔ6Ø%×,Ñ,¨[Õ9ð &×,Ñ,Ø Ÿ™¨°dÀo˜ÓVôð &×,Ñ,Ø#×*Ñ*Ø!¨$¸/ð +ó õñð	ð> ˆØ%ò 	2ˆDÜ Ÿ<™<¨À˜<ÓF×MÑMÓOˆLÜ×*Ñ*Ü /Ø"ØØ /ð	 +ó ˆHð —_‘_ò 2�ØŸ	™	Ÿ™ kÓ2�Ü˜aŸg™g qÓ)�à Ñ.°%¸.ÈÑ:OÓ2OØ,1�N 5Ò)ñ2ð	2ð" @N×?SÑ?SÓ?U×V±t°q¸! °Ó2ÐVˆ
ÑVÜ 
Ñ0DÈdÔSˆà˜>¨$¨3Ð/Ð0Ð0ðI $ûóB Wøô
 ò <Ü¨´C¸³FÔ;Ð;ûð<üsX   ‚M%†L> ™L5šA5L> ÂI L> Ë1L> ÌL8ÌL> Ì4M%Ì5L> Ì8L> Ì>	M"ÍMÍM"Í"M%z/list-productsc               ƒ   ó(  K  — t        t        j                  j                  t        d«      «      t        t        j                  j                  t        d«      «      z   } d| D �cg c]!  }t        j                  j                  |«      ‘Œ# c}iS c c}w ­w)Nz*.[jJ][pP][gG]z*.[pP][nN][gG]Úproducts)r   r&   r   r0   r   Úbasename)Úimage_pathsrÌ   s     r7   Úlist_productsr×     sj   è ø€ ä”r—w‘w—|‘|¤IÐ/?Ó@ÓAÄDÜ
�‰�‰”YÐ 0Ó1óEñ €Kð °kÖB°œŸ™×)Ñ)¨!Õ,ÒBÐCÐCùÒBùs   ‚A!BÁ#&BÂ		Brw   c           	      óH  — t         j                  j                  t        | xs d«      j	                  «       «      } | st        d«      ‚t         j                  j                  t        | «      }t         j                  j                  |«      st        d|› �«      ‚t        |«      }t        t        t        j                  t        j                  | dz   «      «      t        j!                  |d¬«      j#                  «       | ddœ¬«      g}t$        j'                  t(        |¬	«       | S )
NÚ zMissing file namezDesign file not found: Ú_fullFr�   )rw   Úis_crop)ÚidÚvectorr®   )r$   r­   )r&   r   rÕ   r²   ÚstripÚ
ValueErrorr0   r   r2   ÚFileNotFoundErrorrV   r   ÚuuidÚuuid5ÚNAMESPACE_DNSr/   rª   r«   r)   Úupsertr   )rw   Ú	file_pathÚfull_imgr­   s       r7   rs   rs     sà   € Ü—‘× Ñ ¤ Y¢_°"Ó!5×!;Ñ!;Ó!=Ó>€IÙÜÐ,Ó-Ð-ä—‘—‘œY¨	Ó2€Iä�7‰7�>‰>˜)Ô$ÜÐ"9¸)¸Ð EÓFÐFä(¨Ó3€Hô 	Ü”4—:‘:œd×0Ñ0°)¸gÑ2EÓFÓGÜ—<‘< ¸E�<ÓB×IÑIÓKØ"+¸Ñ>ô	
ð€Fô ‡M�M¤/¸&€MÔAØÐr9   z/index-existing/{file_name}c              ƒ   óê   K  — 	 t        j                   «       }t        | «      }d|› d�|t        t        j                   «       |z
  d«      dœS # t        $ r}t	        dt        |«      ¬«      ‚d }~ww xY w­w)Nu   Ä�Ã£ index file thiáº¿t káº¿ u	    vÃ o AI!r‰   ©Úmessagerw   Ú
time_takenr‘   rž   )Útimers   r¯   ru   r   r²   )rw   Ú
start_timeÚindexed_file_namerx   s       r7   Úindex_existing_productrî   /  su   è ø€ ð
<Ü—Y‘Y“[ˆ
Ü-¨iÓ8Ðð 7Ð7HÐ6IÈÐSØ*Ü¤§	¡	£¨jÑ 8¸!Ó<ñ
ð 	
øô
 ò <Ü¨´C¸³FÔ;Ð;ûð<üs)   ‚A3„AA ÁA3Á	A0ÁA+Á+A0Á0A3z/queue-index/{file_name}éÊ   )rŸ   c              ƒ   ó  K  — t         j                  j                  t        | xs d«      j	                  «       «      } | st        dd¬«      ‚t        j                  | «      ƒ d{  –—†  d| › d�| t        j                  «       dœS 7 Œ ­w)	uS   ThÃªm file vÃ o hÃ ng chá»� FIFO Ä‘á»ƒ AI há»�c ná»�n, tráº£ vá»� ngay láº­p tá»©c.rÙ   i�  u   Thiáº¿u tÃªn filerž   Nu   Ä�Ã£ thÃªm u    vÃ o hÃ ng chá»� AI)ré   ÚqueuedÚ
queue_size)	r&   r   rÕ   r²   rÞ   r   r   Úputrt   )rw   s    r7   Úqueue_index_productrô   >  s|   è ø€ ô —‘× Ñ ¤ Y¢_°"Ó!5×!;Ñ!;Ó!=Ó>€IÙÜ¨Ð4GÔHÐHä
�/‰/˜)Ó
$×$Ð$à   Ð+?Ð@ØÜ!×'Ñ'Ó)ñð ð %ús   ‚A"BÁ$BÁ%!Bz/queue-statusc               ƒ   ó6   K  — dt         j                  «       iS ­w)u4   Kiá»ƒm tra sá»‘ lÆ°á»£ng áº£nh Ä‘ang chá»� AI há»�c.Úpending)r   rt   r˜   r9   r7   Úget_queue_statusr÷   M  s   è ø€ ð ”{×(Ñ(Ó*Ð+Ð+ùs   ‚z/add-productc              ƒ   ó  K  — 	 t        j                   «       }t        j                  j                  | j                  «      }t        j                  j                  t        |«      }t        |d«      5 }|j                  | j                  «       ƒ d {  –—† «       d d d «       t        |«      }d|› d�|t        t        j                   «       |z
  d«      dœS 7 ŒD# 1 sw Y   Œ?xY w# t        $ r}t        dt        |«      ¬«      ‚d }~ww xY w­w)NÚwbu&   Ä�Ã£ lÆ°u vÃ  index file thiáº¿t káº¿ u    thÃ nh cÃ´ng!r‰   rè   r‘   rž   )rë   r&   r   rÕ   Úfilenamer0   r   rF   Úwriter¡   rs   r¯   ru   r   r²   )r…   rì   rw   rå   Úbufferrí   rx   s          r7   Úadd_productrý   S  sà   è ø€ ð<Ü—Y‘Y“[ˆ
ä—G‘G×$Ñ$ T§]¡]Ó3ˆ	Ü—G‘G—L‘L¤¨IÓ6ˆ	ä�)˜TÓ"ð 	, fØ�L‰L˜tŸy™y›{×*Ô+÷	,ô .¨iÓ8Ðð @Ð@QÐ?RÐR`ÐaØ*Ü¤§	¡	£¨jÑ 8¸!Ó<ñ
ð 	
ð	 +ø÷	,ð 	,ûô ò <Ü¨´C¸³FÔ;Ð;ûð<üsS   ‚D
„A-C# Á1CÂC
ÂCÂ;C# ÃD
ÃCÃC ÃC# Ã#	DÃ,DÄDÄD
z/delete-product/{file_name}c              ƒ   ó�  K  — 	 t         j                  j                  t        | «      }t         j                  j	                  |«      rt        j
                  |«       t        j                  t        t        t        dt        | ¬«      ¬«      g¬«      ¬«       dd| › d�iS # t        $ r}t        d	t        |«      ¬
«      ‚d }~ww xY w­w)Nrw   )Úvalue)r›   Úmatch)Úmust)r$   Úpoints_selectorré   u   Ä�Ã£ xÃ³a sticker u    khá»�i há»‡ thá»‘ng!r‘   rž   )r&   r   r0   r   r2   Úremover)   Údeleter   r   r   r   ru   r   r²   )rw   rå   rx   s      r7   Údelete_productr  i  s£   è ø€ ð<Ü—G‘G—L‘L¤¨IÓ6ˆ	Ü�7‰7�>‰>˜)Ô$Ü�I‰I�iÔ ä�‰Ü+Ü"ä" {¼*È9Ô:UÔVðôð 	ô 	
ð Ð/°	¨{Ð:OÐPÐQÐQøÜò <Ü¨´C¸³FÔ;Ð;ûð<üs)   ‚C„BB ÂCÂ	CÂ(B>Â>CÃC)r‡   rˆ   )Lr|   r¢   r&   rá   r3   rë   r   Úfastapir   r   r   r   Úfastapi.middleware.corsr   ÚPILr	   r
   r   r   r   Úsentence_transformersr   Úultralyticsr   Úqdrant_clientr   Úqdrant_client.modelsr   r   r   r   r   r   Ú
contextlibr   r   ÚdirnameÚabspathÚ__file__ÚBASE_DIRÚPROJECT_DIRÚdotenvr   r0   r(   Úgetenvr   r   r   r.   r1   r)   r/   r5   ÚQueuer   Ú__annotations__r8   rV   rp   ry   r€   rz   Úadd_middlewareÚpostrÒ   rr   r×   r²   rs   rî   rô   r÷   rý   r  r  r˜   r9   r7   ú<module>r     s�  ðÜ Û 	Û 	Û Û Û Ý ß <Ó <Ý 2ß EÕ EÝ 5Ý Ý &÷÷ õ +ð
 �7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�g‰g�o‰o˜hÓ'€å Ù ˆB�G‰G�L‰L˜ fÓ-Ô .à�W‰W�\‰\˜( HÓ-€
àˆB�I‰IØØ*ó€	ð
 ˆb�i‰iØØ1ó€ð
 �"—)‘)Ð-Ð/FÓG€ð "€Ø€á	˜;Ô	'€Ø€Ø€à*˜WŸ]™]›_€ˆW�]‰]Ó ,ò7ò0ó8ò"
$ð ð˜ò ó ðñ �xÔ €Ø × Ñ Ø 3 %¸°uÈSÈEð ô ð ‡�ˆ/ÓÙ/3°C«yñ j< *ò j<ó ðj<ðZ ‡�Ð	ÓñDó ðDð ó ð0 ‡�Ð
'Ó(ð<¨Cò <ó )ð<ð ‡�Ð
$°#€Ó6ð¨ò ó 7ðð ‡�ˆÓñ,ó ð,ð
 ‡�ˆ.ÓÙ)-¨c«ñ <˜Jò <ó ð<ð* ‡�Ð)Ó*ð< Cò <ó +ñ<r9   