
    %^j                         S r SSKJrJrJr  SS/rSS/r/ SQr\\-   \-   r1 Skr	S	\S
\\
\4   4S jrS	\S
\\   4S jrS
\
4S jrg)u  
Gestaffelte Validierung für Enrichment-Outputs.
CRITICAL + IMPORTANT + OPTIONAL mit Schätzungs-Unterstützung.

Dottores Regeln:
- CRITICAL: alle müssen vorhanden sein
- IMPORTANT: mind. 2/2 (explizit ODER als Schätzung markiert)
- >50% Felder geschätzt → needs_manual
    )DictTupleList
pain_pointcompany_descriptioncompany_sizeheadquarters)founding_yeartechnology_stackkey_productslinkedin_urlindustrylanguage>   1-10 mitarbeiter200+ mitarbeiter10-50 mitarbeiter50-200 mitarbeiterdatareturnc                 p   [        U [        5      (       d  gU R                  S0 5      =(       d    0 n[         H#  nX ;  d  [	        X   5      (       d  M  SSU 34s  $    Sn[
         H  nU R                  U5      n[	        U5      (       a  M&  US:X  a1  [        U5      R                  5       R                  5       [        ;  a  M]  US:X  a(  [        [        U5      R                  5       5      S:  a  M  US	-  nM     US
:  a  SSU S34$ SU ;   a  U S   b   [        U S   5        UR                  S/ 5      =(       d    / n[        U[        5      (       aM  [        U5      S:  a>  [        [        5      n[        U5      U-  nUS:  a  SS[        U5       SU SUS-  S S34$ g! [        [        4 a     gf = f)uU  
Validiert einen Enrichment-Output gegen strikte Regeln.

Regeln:
- ALLE CRITICAL müssen vorhanden und nicht leer sein
- Mindestens 2/2 IMPORTANT: Wert vorhanden UND (explizit ODER estimated=true)
- company_size: nur erlaubte Kategorien
- >50% Felder geschätzt → FAIL (needs_manual)

Returns:
    (True, "OK") oder (False, error_reason)
)FINVALID_JSON_TYPEmetaFzMISSING_CRITICAL: r   r   r	            zINSUFFICIENT_IMPORTANT: z/2r
   )FINVALID_YEAR_TYPEestimated_fieldsg      ?zTOO_MANY_ESTIMATES: /z (d   z.0fz%) Felder geschaetzt)TOK)
isinstancedictgetCRITICAL_FIELDSis_empty_valueIMPORTANT_FIELDSstrstriplowerVALID_COMPANY_SIZESlenint
ValueError	TypeErrorlistALL_DATA_FIELDS)r   r   fieldvalid_importantvaluer   total_fieldsestimated_ratios           /app/llm/validator.pyvalidater7   -   s    dD!!)88FB%2D !t{ ; ;.ug666 !
 O!%   N"5z!'')1DD N"3u:##%&* 	1! "$ 00ADDD $4#8#D	._%&
 xx 2B7=2"D))c2B.Ca.G?+./,>T!&s+;'<&=Q|n M#C',,@B 
  I& 	.-	.s   F" "F54F5c                 n    U R                  S0 5      =(       d    0 nUR                  S/ 5      =(       d    / $ )u/   Gibt die Liste der geschätzten Felder zurück.r   r   )r#   )r   r   s     r6   get_estimated_fieldsr9   p   s.    88FB%2D88&+1r1    c                     U c  g[        U [        5      (       a%  U R                  5       R                  5       nUS;   a  g[        U [        5      (       a  [        U 5      S:X  a  gg)u&   Prüft ob ein Wert praktisch leer ist.T) zn/aunknown	unbekanntnull-zkeine angaber   F)r!   r'   r(   r)   r/   r+   )r3   cleaneds     r6   r%   r%   v   sT    }%++-%%'VV%3u:?r:   N)__doc__typingr   r   r   r$   r&   OPTIONAL_FIELDSr0   r*   boolr'   r7   r9   r%    r:   r6   <module>rG      s    % $
   
 "$44F @4 @E$), @F2t 2S	 2
T 
r:   