
    :gEiP                        d Z ddlmZmZ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mZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ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&m'Z'm(Z(m)Z) ddl*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3Z3ddl4Z4ddlm5Z5  e       Z6e6jo                  de"       ed       ee,       ee      fdededefd       Z8e6js                  de"       ee,       ee      fde:dedefd       Z;e6jo                  de$       ed       ed       ed        ee,       ee      fde:d!e<d"e<d#e<dedefd$       Z=e6js                  d%e>e!          ee,       ee      fdedefd&       Z?e6jo                  d'e"       ee,       ee      fde:d(e(dedefd)       Z@e6j                  d*e"       ee+       ee      fde:d+e)d,edefd-       ZBe6j                  d       ee,       ee      fde:dedefd.       ZDy)/z(
Endpoints de gestion des prescriptions
    )	APIRouterDependsHTTPExceptionstatus
UploadFileFileForm)func)Session)OptionalDictAny)get_db)Product)User)Partner)PrescriptionPrescriptionStatus)PrescriptionProduct)PrescriptionSearch)	PrescriptionResponsePrescriptionDetailResponsePrescriptionSearchResponse PrescriptionSearchDetailResponseProductSearchResultPharmacyStockInfoPrescriptionProductResponsePrescriptionPaymentRequestDeliveryStatusUpdate)get_current_partnerget_current_user)
ai_service)prescription_service)payment_serviceN)DeliveryStatusz/upload)response_model.filecurrent_userdbc                 
  K   g d}| j                   |vrt        t        j                  d      d}t	        j
                  |d       t        j                  j                  | j                        d   }t        j                          | }t        j                  j                  ||      }t        |d      5 }| j                          d	{   }	|j                  |	       d	d	d	       t        j                          }
|j#                  t$              j'                  t$        j(                  |
k(        j+                         rXt        j                          }
|j#                  t$              j'                  t$        j(                  |
k(        j+                         rXt%        |
|j,                  |t.        j0                  
      }|j3                  |       |j5                          |j7                  |       	 t9        j:                  |       d	{   }|j=                  dg       D ]  }t?        |j,                  |j=                  dd      |j=                  d      |j=                  dd            }|j@                  xs djC                         jE                  dd      jG                         }|jH                  xs djC                         }|jJ                  xs djC                         }|j#                  tL              j'                  tL        jN                  jQ                  |      tL        j@                  jQ                  |      tL        jJ                  jQ                  |            j+                         }|sm|j#                  tL              j'                  tL        jN                  jQ                  |      tL        j@                  jQ                  |            j+                         }|r|j,                  |_)        |j3                  |        t.        jT                  |_        |j5                          |j7                  |       g }|j^                  D ]^  }|ja                  tc        |j,                  |jd                  |jR                  |jH                  |j@                  |jJ                               ` tg        |j,                  |jh                  |jj                  |j                  |jl                  |      }|S 7 %# 1 sw Y   xY w7 # tV        $ rQ}t.        jX                  |_        |j5                          t        t        jZ                  dt]        |             d	}~ww xY ww)z@
    Upload une ordonnance et analyse son contenu avec l'IA
    )z
image/jpegz	image/jpgz	image/pngzapplication/pdfu8   Type de fichier non supporté. Utilisez JPG, PNG ou PDF.status_codedetailzuploads/prescriptionsT)exist_ok   wbN)	referenceuser_idprescription_filer   productsname dosageform)prescription_idproduct_name_extractedr7   r8    zErreur lors de l'analyse: idr9   
product_idr:   r7   r8   r=   r2   r3   r   
created_atr4   )7content_typer   r   HTTP_400_BAD_REQUESTosmakedirspathsplitextfilenameuuiduuid4joinopenreadwriter#   generate_referencequeryr   filterr1   firstr=   r   
PROCESSINGaddcommitrefreshr"   analyze_prescriptiongetr   r7   stripreplacelowerr:   r8   r   r5   iliker>   ANALYZED	Exception	COMPLETEDHTTP_500_INTERNAL_SERVER_ERRORstrr4   appendr   r9   r   r2   r3   r@   )r'   r(   r)   allowed_types
upload_dirfile_extensionrG   filepathfcontentr1   prescriptionanalysis_resultproduct_dataproductclean_dosage
clean_name
clean_formexisting_producteproducts_listresponse_datas                         J/home/www/lebenam.kofcorporation.com/app/api/v1/endpoints/prescriptions.pycreate_prescriptionrt       sI     PM-33M
 	
 )JKK
T* WW%%dmm4Q7N**,/0Hww||J1H 
h	 		#	
 %779I
((<
 
'
'(>(>)(K
L
R
R
T(;;=	 ((<
 
'
'(>(>)(K
L
R
R
T
  "!,,	L FF<IIKJJ|.
 * ? ? II ,//
B? 	L) ,'3'7'7'C#''1!%%fb1	G $NN0b779AA#rJPPRL!88>BEEGJ!,,,"335J!xx077"":.$$\2"":.  eg	  $#%88G#4#;#;LL&&z2NN((6$ %' !  %5%8%8"FF7O;	@ 199
		


<  M(( 8zz#33))#*#A#A>>
 	 /??$$&88""**M w $ . JN  
0::
		==/Ax8
 	

sq   B7U"9S5S2S5#B6U"AU"4T TH1T >B4U"2S55S?:U"T 	UAUUU"z/{prescription_id}r9   c                 Z  K   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        t        j                  d      |j                  D cg c]O  }t        |j                  |j                  |j                  |j                  |j                  |j                        Q }}t!        |j                  |j                  |j"                  |j                  |j$                  |      S c c}w w)u5   
    Récupérer les détails d'une prescription
       Prescription non trouvéer+   r<   r?   )rO   r   rP   r=   r2   rQ   r   r   HTTP_404_NOT_FOUNDr4   r   r9   r>   r:   r7   r8   r   r3   r@   )r9   r(   r)   rh   prq   s         rs   get_prescriptionry      s     88L)00?*/ eg 
 11.
 	
 &&
  	$tt--||#$#;#;88	

M 
 &??$$&88""** 
s   BD+AD&!A
D+z/{prescription_id}/searchg      $@)defaultlatitude	longitude	radius_kmc                   K   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        t        j                  d      |j                  t        j                  k7  rt        t        j                  d      t        j                  |||||       d{   }|j                  t              j                  t        j                  | k(        j!                  t        j"                  j%                               j                         }|st        t        j&                  d      i }	|D ]n  }
|
d   D ]d  }|d   }t)        |
d	   |
d
   |
d   |
d   |
d   |
d   |d   |d         }||	vr||d   |d   |d   d|gd|	|<   N|	|   d   j+                  |       f p |j,                  }|j.                  }|j0                  }|	j3                         D cg c]  }t5        di | }}t7        |j                  |j                  |j8                  ||||j"                  |      S 7 c c}w w)uV   
    Rechercher les produits d'une prescription dans les pharmacies à proximité
    rv   r+   u,   La prescription doit d'abord être analysée)r)   rh   user_latuser_lonr}   NuM   Erreur lors de la création de l'enregistrement de recherche de prescription.products_foundr>   
partner_idpartner_namepartner_addressr{   r|   distance_kmquantity_available
unit_price)pharmacy_idpharmacy_namephysical_addressgps_latitudegps_longituder   quantityr   product_namer8   r7   zN/A)r>   r   r8   r7   unit
pharmaciesr   )r=   r9   r   total_products_foundtotal_products_searchedtotal_pharmacies_foundr@   results )rO   r   rP   r=   r2   rQ   r   r   rw   r   r\   rB   r#   search_in_pharmaciesr   r9   order_byr@   descr_   r   ra   r   r   r   valuesr   r   r   )r9   r{   r|   r}   r(   r)   rh   pharmacy_resultsprescription_search_recordproducts_mappharmacy_resultproduct_foundr>   pharmacy_stock_infor   r   r   dataresults_lists                      rs   search_prescriptionr      s     88L)00?*/ eg 
 11.
 	

 099933A
 	
 2FF!  "$*<!=!D!D**o="h!,,1134UUW  &==b
 	
 /1L+ S,-=> 	SM&|4J #4+L9-n=!01B!C,Z8-k:+M:&';<(6	# - #-$1.$A)&1+H5!#6"7,Z( Z(6==>QR7	SS> 8NN5JJ8PP
 !'') 	#d#L  ,%((2BB.::1 75-88	 	Cvs%   CI&ID:I&I!!>I&!I&/c                   K   |j                  t              j                  t        j                  | j                  k(        j                  t        j                  j                               j                         }g }|D ]  }|j                  D cg c]O  }t        |j                  |j                  |j                  |j                  |j                  |j                        Q }}|j!                  t#        |j                  |j                  |j$                  |j&                  |j                  |              |S c c}w w)uX   
    Lister toutes les prescriptions de l'utilisateur avec leurs produits associés
    r<   r?   )rO   r   rP   r2   r=   r   r@   r   allr4   r   r9   r>   r:   r7   r8   ra   r   r3   r   )r(   r)   prescriptionsresponse_listrh   rx   rq   s          rs   list_prescriptionsr   .  s     HH\*11/h|&&++-.ssu  M%  "**

  (44 ! 1 1<<'('?'?xxVV

 

 	1 ((*<<&&#.."
 	. +

s   BEAD<$AEz/{prescription_id}/paypayment_requestc                 0  K   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        t        j                  d      |j                  t        j                  t        j                  fvrt        t        j                  d      |j                  t              j                  t        j                  |j                  k(  t        j                  | k(        j                         }|st        t        j                  d      d|j                   d|j                   dt!        j"                         j$                  dd  }	 |j&                  j)                  d	      d
   dd }dv rd}nd}t+        j,                  ||j.                  ||       d{   }	t        j6                  |_        |j8                  |_        |j.                  |_        |j<                  |_        t>        j@                  |_!        |jE                          |jG                  |       |j8                  |_$        |jE                          |jG                  |       |jJ                  D cg c]O  }tM        |j                  |j                  |jN                  |jP                  |jR                  |jT                        Q }}tW        |j                  |j                  |jX                  |j                  |j8                  |j:                  |j<                  |jB                  |jZ                  |
      S 7 # t0        t2        f$ r#}
t        t        j4                  d|
       d}
~
ww xY wc c}w w)uR   
    Initier le paiement pour une prescription après une recherche réussie.
    rv   r+   ue   La prescription n'est pas dans un état permettant le paiement (doit être FOUND ou PARTIALLY_FOUND).u3   Résultat de recherche de prescription non trouvé.zPRES--N   z+228r/      )90919293707172TMONEYFLOOZ)
identifieramountphone_numbernetworkz/Erreur lors de l'appel au service de paiement: r<   
r=   r2   r3   r   selected_partner_idorder_totaldelivery_addressdelivery_statusr@   r4   ).rO   r   rP   r=   r2   rQ   r   r   rw   r   FOUNDPARTIALLY_FOUNDrB   r   prescription_search_idr9   rH   rI   hexr   splitr$   pay_with_paygatetotal_priceConnectionError
ValueErrorr_   PAIDr   r   r   r%   PENDINGr   rT   rU   r   r4   r   r>   r:   r7   r8   r   r3   r@   )r9   r   r(   r)   rh   prescription_searchtransaction_identifierr   r   payment_responserp   rx   rq   s                rs   initiate_paymentr   T  s3     88L)00?*/ eg 
 11.
 	

 #5#;#;=O=_=_"``33z
 	

 ((#56==!G!GG**o= eg 
 11H
 	
  %\__$5Q7J7M7M6NaPTPZPZP\P`P`acbcPdOef
 '..44V<Q?C@@GG!0!A!A-&22%	"
 
( -11L'6'J'JL$2>>L$3$D$DL!#1#9#9L IIKJJ| &5%H%H"IIKJJ"# &&
  	$tt--||#$#;#;88	

M 
 &??$$&88""(<< ,,%66$44** _
 Z( 
==DQCH
 	

,
sL   E>NAM MM B>NAN(A1NM N+N		NNz"/{prescription_id}/delivery_statusstatus_updatecurrent_partnerc                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        t        j                  d      |j                  |j                  k7  rt        t        j                  d      |j                  t        j                  k7  rt        t        j                  d      |j                  |_        |j                  t        j                   k(  rt        j"                  |_        |j%                          |j'                  |       |j(                  D cg c]O  }t+        |j                  |j,                  |j.                  |j0                  |j2                  |j4                        Q }}t7        |j                  |j8                  |j:                  |j                  |j                  |j<                  |j>                  |j                  |j@                  |
      S c c}w w)u`   
    Mettre à jour le statut de livraison d'une prescription (accessible aux partenaires).
    rv   r+   uT   Vous n'êtes pas autorisé à modifier le statut de livraison de cette prescription.u[   La prescription doit être payée pour que le statut de livraison puisse être mis à jour.r<   r   )!rO   r   rP   r=   rQ   r   r   rw   r   HTTP_403_FORBIDDENr   r   rB   
new_statusr   r%   	DELIVEREDr^   rT   rU   r4   r   r9   r>   r:   r7   r8   r   r2   r3   r   r   r@   )r9   r   r   r)   rh   rx   rq   s          rs   update_delivery_statusr     s     88L)00?*eg  11.
 	
 ''?+=+==11i
 	
 055533p
 	

 $1#;#;L  >#;#;;0::IIKJJ| &&
  	$tt--||#$#;#;88	

M 
 &??$$&88""(<< ,,%66$44** 
s   D?HAHA6Hc                   K   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        t        j                  d      t        j                  j                  |j                        rt        j                  |j                         |j                  |       |j                          dddS w)z$
    Supprimer une prescription
    rv   r+   Tu   Prescription supprimée)r   message)rO   r   rP   r=   r2   rQ   r   r   rw   rC   rE   existsr3   removedeleterT   )r9   r(   r)   rh   s       rs   delete_prescriptionr     s      88L)00?*/ eg 
 11.
 	
 
ww~~l445
		,001 IIlIIK'@AAs   C+C-)E__doc__fastapir   r   r   r   r   r   r	   
sqlalchemyr
   sqlalchemy.ormr   typingr   r   r   app.db.sessionr   app.models.productr   app.models.userr   app.models.partnerr   app.models.prescriptionr   r   app.models.prescription_productr   app.models.prescription_searchr   app.schemas.prescriptionr   r   r   r   r   r   r   r   r   app.core.securityr    r!   app.services.ai_servicer"   !app.services.prescription_servicer#   app.services.payment_servicer$   rC   rH   r%   routerpostrt   rW   intry   floatr   listr   r   putr   r   r   r       rs   <module>r      s   V U U  " & & ! &   & D ? =   D . B 8 	  2	Y'ABCy !12&/v
vv 	v Cvp  1KL !!12&/''' 	' M'R (9YZ 3iCyD) !12&/hhh h 	h
 h 	h [hT C%9 :; !12&/### <#J %6PQ !!12&/	pp/p p 		p Rpd 0A[\  '':;&/	BB'B B 		B ]BH #$ !!12&/BBB 	B %Br   