
    CiT                         d Z ddlmZ ddlmZ ddlZddlmZm	Z	m
Z
mZ ddlZ ej                  ej                          G d d      Z e       Zy)uB   
Service d'extraction des données de prescription avec Gemini AI
    N)settings)DictAnyListOptional)api_keyc                   V    e Zd Zd Zdedeeef   fdZdedeeeef      de	e
   fdZy)		AIServicec                 T    t        j                  t        j                        | _        y )N)genaiGenerativeModelr   GEMINI_MODELmodel)selfs    ?/home/www/lebenam.kofcorporation.com/app/services/ai_service.py__init__zAIService.__init__   s    **8+@+@A
    
image_pathreturnc                   K   	 t         j                  j                  |      sdddS t        |d      5 }|j	                         }ddd       d}| j
                  j                  |ddg      }|j                  j                         }|j                  d	      r|d
d }|j                  d      r|dd }|j                  d      r|dd }|j                         }t        j                  |      }|S # 1 sw Y   xY w# t        j                  $ r}ddt        |       dcY d}~S d}~wt        $ r}ddt        |       dcY d}~S d}~ww xY ww)u   
        Extrait les données d'une ordonnance à partir d'une image
        
        Args:
            image_path: Chemin vers l'image de l'ordonnance
            
        Returns:
            Dictionnaire contenant les données extraites
        FzImage file not found)is_validerrorrbNu  
            Analyse cette ordonnance médicale et extrait les informations suivantes au format JSON:
            
            {
                "is_valid": true/false,
                "patient_name": "nom complet du patient",
                "prescription_date": "date de la prescription (format YYYY-MM-DD)",
                "doctor_name": "nom du médecin prescripteur",
                "products": [
                    {
                        "name": "nom du médicament",
                        "dosage": "dosage (ex: 500mg, 10ml)",
                        "quantity": nombre_d_unites,
                        "form": "forme (comprimé, sirop, injection, etc.)"
                    }
                ]
            }
            
            Si le document n'est pas une ordonnance médicale valide, retourne {"is_valid": false}.
            Extrait tous les médicaments listés dans l'ordonnance.
            Retourne UNIQUEMENT le JSON, sans texte supplémentaire.
            z
image/jpeg)	mime_typedataz```json   z```   zFailed to parse AI response: zAI extraction failed: )ospathexistsopenreadr   generate_contenttextstrip
startswithendswithjsonloadsJSONDecodeErrorstr	Exception)	r   r   f
image_datapromptresponseresponse_textextracted_dataes	            r   analyze_prescriptionzAIService.analyze_prescription   s`    >	77>>*- %3 
 j$' &1VVX
&F0 zz22F,`j<k3lmH %MM//1M''	2 -ab 1''. -ab 1%%e, -cr 2)//1M "ZZ6N!!W& &Z ## 	!8QA   	!1#a&: 	sn   E#C> EC> C2B,C> 1E2C;7C> >ED'!E"E'E3E	EE	EEproduct_nameavailable_productsc                 |  K   	 dj                  |D cg c]  }|d    d|d    d|d    d|d     c}      }d| d	| d
}| j                  j                  |      }t        |j                  j                               }|dkD  r|S dS c c}w # t        $ r!}t        dt        |              Y d}~yd}~ww xY ww)aL  
        Utilise l'IA pour matcher un nom de produit extrait avec les produits en base
        
        Args:
            product_name: Nom du produit extrait de l'ordonnance
            available_products: Liste des produits disponibles en base
            
        Returns:
            ID du produit correspondant ou None
        
idz: namez - dosageformu;   
            Trouve le produit qui correspond le mieux à "z-" dans cette liste:
            
            z
            
            Retourne UNIQUEMENT l'ID du produit correspondant sous forme de nombre.
            Si aucun produit ne correspond, retourne 0.
            r   NzError matching product: )	joinr   r$   intr%   r&   r-   printr,   )	r   r6   r7   pproducts_listr0   r1   
product_idr4   s	            r   match_product_to_databasez#AIService.match_product_to_database\   s     	 II+' T7)2ai[AhK=AfI;G' M
;;G. IO F zz226:HX]]0023J!+a:9T9#'&  	,SVH56	sK   B<B  B
AB B<B 	B<
B 	B9B4/B<4B99B<N)__name__
__module____qualname__r   r,   r   r   r5   r   r   r?   rD    r   r   r
   r
      sY    BHS HT#s(^ HT%% !c3h0% 
#	%r   r
   )__doc__google.generativeaigenerativeair   app.core.configr   r)   typingr   r   r   r   r   	configureGEMINI_API_KEYr
   
ai_servicerH   r   r   <module>rQ      sJ    $ $  , , 	 // 0s sj [
r   