
    	j                        U d Z ddlZddlZddlmZmZmZmZ dZdZ	dZ
dZdZd	d
dddddddddddddddddddddddddddddd d!ddd"d#d$ddgZeeeef      ed%<   d
dd&d
dd&ddd&ddd&ddd&ddd&ddd&ddd&d d!d&d d!d&d#d$d&d#d$d&d'Zeeeeef   f   ed(<   d)eeef   d*eeeef      d+eeeef      fd,Zd-eeeef      d+eeef   fd.Zd+eeef   fd/Zy)0z
Evidence builder for AI categorization predictions.

Extracts evidence signals from a product record and its attributes, then
writes evidence rows to the database.  Each evidence record maps to a
source_type defined in the schema.
    N)ListDictAnyOptionalpart_number_patternmanufacturer_categoryenrichment_attributeproduct_descriptioncategory_rulez
^(CB|CAB)-
cat_cableszCables & Connectorsg?)patterncodelabelstrengthz
^(R|RES)\dcat_resistors	Resistors      ?z
^(C|CAP)\dcat_capacitors
Capacitorsz	^(IC|U)\dcat_icszIntegrated Circuitsgffffff?z
^(SW|BTN)-cat_switcheszSwitches & Buttonsz^(PSU|PWR)-	cat_powerzPower Suppliesz^(LED|DIODE)-
cat_diodeszDiodes & LEDsz^(FAN|COOL)-cat_coolingzCooling & Thermal_PART_NUMBER_PATTERNSr   r   )cable	connectorresistor	capacitorsemiconductoricswitchpowerleddiodethermalcooling_MANUFACTURER_CATEGORY_MAPproduct
attributesreturnc                    g }t        | j                  d      xs d      j                         }t        | j                  d      xs d      j                         }t        | j                  d      xs d      j                         }|xs |}|ret        D ]\  }t	        j
                  |d   |t        j                        s,|j                  t        dd| d|d	    d
d|d   |d   |d	   d        n |r_|j                         }t        j                         D ]8  \  }	}
|	|v s|j                  t        dd| d|
d	    d
dd|
d   |
d	   d        n |D ]|  }t        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }|r|s`|j                  t        ||ddddd       ~ |S )u
  
    Build a list of evidence signal dicts for a product.

    Each returned dict has:
        source_type (str), source_label (str), evidence_value (str),
        weight (float 0.0–1.0), signal_strength (float 0.0–1.0),
        suggested_category_code (str), suggested_category_label (str)

    Args:
        product:    Dict of product DB row columns.
        attributes: List of product_attribute DB rows for this product.

    Returns:
        List of evidence signal dicts (may be empty if no signals found).
    sku mpnr   r   zPart Number PatternzSKU 'z$' matches the pattern for category 'r   'g?r   r   source_typesource_labelevidence_valueweightsignal_strengthsuggested_category_codesuggested_category_labelzManufacturer CategoryzManufacturer category 'z' maps to 'gffffff?r   attribute_nameattribute_valueg333333?g      ?N)strgetstripr   rematch
IGNORECASEappendSOURCE_PART_NUMBER_PATTERNlowerr)   itemsSOURCE_MANUFACTURER_CATEGORYSOURCE_ENRICHMENT_ATTRIBUTE)r*   r+   signalsr.   r0   r   
identifierrulemc_lowerkeywordmappingattr	attr_name
attr_values                 9/var/www/html/ai_cats/python/services/evidence_builder.pybuild_evidencerR   8   s     %'G
gkk% &B
'
-
-
/C
gkk% &B
'
-
-
/C,C D JKQQS J) 	DxxYR]]C/I/D
| , M?!- 03/3J/?/3F|/3G}   	" (..0 : @ @ B 	GW("/K/F12G1H I$$+G$4#5Q8 04/3/6v/6w/?   	"  "23:;AAC	"34:;AAC

'B'0'1'+'*'+(,
 	 N    rH   c                 4   i }| D ]d  }|j                  d      }|s|j                  dd      |j                  dd      z  }||vs||   d   |k  sL|||j                  d|      d||<   f |sdd	d
S t        |j                         d       }|d   |d   d
S )u  
    Choose the best suggested category from the evidence signals.

    Picks the category with the highest combined weight × signal_strength
    among signals that carry a category suggestion.

    Returns:
        {"code": str, "label": str} — falls back to generic defaults.
    r8   r6   g        r7   scorer9   )rU   r   r   cat_uncategorizedUncategorizedr   c                     | d   S )NrU    )xs    rQ   <lambda>zpick_category.<locals>.<lambda>   s
    aj rS   )keyr   r   )r=   maxvalues)rH   scoredsr   wbests         rQ   pick_categoryrc      s     )+F 
uu./EE(C 155):C#@@vg!6!:94@F4L
 +oFFv}}$89DL4=99rS   c                      t         dddddddS )z@Return the standard fallback evidence signal (confidence floor).FallbackzFNo specific evidence found; prediction based on default category rulesgMbP?g?rV   rW   r2   )SOURCE_CATEGORY_RULErY   rS   rQ   fallback_signalrg      s#     $8#-T#(#&#6$3
 
rS   )__doc__jsonr?   typingr   r   r   r   rC   rF   rG   SOURCE_PRODUCT_DESCRIPTIONrf   r   r<   __annotations__r)   rR   rc   rg   rY   rS   rQ   <module>rm      s    	 , , 4 6 5 4 .  <H]lop?mqr+;mqr9H]mpq>H\mpq;HXmpq <mqr=H[mpq
/ tDcN+ 
 +8MN*8MN-D.E'8MN'8MN,8LM)8HI*H*H+8KL+8KL9 Dd38n!45  LDcN LT#s(^8L LQUVZ[^`c[cVdQe L^:4S#X/ :DcN :<c3h rS   