o
    -m‘j—  ã                   @  sÀ   d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 e 
e¡ZdZd1d
d„Zd2dd„Zd3dd„Zd4dd„Zd5dd„Zddddœd6d"d#„Zddd$dd%œd7d(d)„Zd8d+d,„Zdd-œd9d/d0„ZdS ):ud  
Opt-in per-call-group configuration helpers.

Safety contract:
- group_config_enabled defaults to 0 on every BID.
- When disabled, all resolvers use the existing BID-level tables/config only.
- When enabled:
  1) map call groupname â†’ named parameter_scope (if configured in UI)
  2) else try exact groupname as scope
  3) else fall back to BID defaults
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚ ÚvalueúOptional[str]ÚreturnÚstrc                 C  s   t | pdƒ ¡ S )zOEmpty string = BID default set. Non-empty = Mcube call groupname or named pack.r   )r   Ústrip)r   © r   ú>/home/aiteam/pcaa-dev/dashboard-backend/group_scoped_config.pyÚnormalize_scope_groupname   s   r   Úpipeline_cfgúOptional[Dict[str, Any]]Úboolc              	   C  s6   zt | pi  d¡p
dƒdkW S  ttfy   Y dS w )NÚgroup_config_enabledr   é   F)ÚintÚgetÚ	TypeErrorÚ
ValueError)r   r   r   r   Úis_group_config_enabled   s
   ÿr   Ú
db_handlerr   Úbidc              
   C  sV   z|   ¡  |  |¡pi }t|ƒW S  ty* } zt d||¡ W Y d }~dS d }~ww )Nz,group_config_enabled check failed for %s: %sF)Ú%ensure_business_pipeline_config_tableÚget_pipeline_configr   Ú	ExceptionÚloggerÚdebug)r   r   ÚcfgÚexcr   r   r   Úis_group_config_enabled_for_bid$   s   
€þr#   Úcallidc              
   C  sÎ   t |ƒ ¡ }t |ƒ ¡ }|r|sdS |› d�}z4|  ¡ �%}| ¡ }| d|› d�|f¡ | ¡ p1i }t| d¡ƒW  d  ƒ W S 1 sDw   Y  W dS  tyf } zt	 
d|||¡ W Y d}~dS d}~ww )z6Read groupname from {bid}_raw_calls; empty if missing.r   Ú
_raw_callszSELECT groupname FROM `z` WHERE callid = %s LIMIT 1Ú	groupnameNz&Could not load groupname for %s/%s: %s)r   r   Úget_connectionÚcursorÚexecuteÚfetchoner   r   r   r   r    )r   r   r$   ÚtableÚconnr(   Úrowr"   r   r   r   Úget_call_groupname.   s(   


þ(ù€þr.   úOptional[Any]r&   c              
   C  sp   t |ƒ}|r
| du r|S z|  ||¡}|rt |ƒW S W |S  ty7 } zt d|||¡ W Y d}~|S d}~ww )z�
    Resolve which parameter pack key to load for a call group.
    Uses UI scope map when present; otherwise the call groupname itself.
    Nz/parameter scope map lookup failed for %s/%s: %s)r   Úget_parameter_scope_for_groupr   r   r    )r   r   r&   ÚscopeÚmappedr"   r   r   r   Úresolve_parameter_scope_keyC   s   	
ÿþ€þr3   F)r&   r   r   Úquality_handlerr   úList[Dict[str, Any]]c          	      C  s’   t |ƒ ¡ }|s|  |¡pg S t|||ƒ}|rB|  ||¡pg }|r#|S t|ƒ}|r4||kr4|  |¡p3g S |rB|  ||¡p=g }|rB|S |  |¡pHg S )uÈ   
    Return quality parameters for analysis.

    Flag off â†’ always BID default table (current behavior).
    Flag on â†’ mapped/named scope rows if present, else exact group, else BID default.
    ©r   r   Úget_parametersr3   Úget_parameters_for_scoper   )	r4   r   r&   r   r   r1   ÚscopedÚoriginalÚexactr   r   r   Úresolve_quality_parametersX   s    r<   T)r&   r   Úactive_onlyr   Úpropensity_handlerr=   c          
      C  s¦   t |ƒ ¡ }|s| j||d�pg S t|||ƒ}|rJ| j|||d�p"g }|r'|S t|ƒ}|r:||kr:| j||d�p9g S |rJ| j|||d�pEg }	|	rJ|	S | j||d�pRg S )N)r=   r6   )
r>   r   r&   r   r=   r   r1   r9   r:   r;   r   r   r   Úresolve_propensity_parameters{   s(   	ÿþr?   úDict[str, Any]c              
   C  s   t |pi ƒ}t|ƒs|S t|ƒ}|s|S z|  ||¡}t|ƒp |}W n ty-   |}Y nw z|  ||¡p6i }|sE||krE|  ||¡pDi }W n tyb }	 zt d|||	¡ |W  Y d}	~	S d}	~	ww |sg|S | d¡}
|
dur€t	|
ƒ 
¡ r€t	|
ƒ 
¡  ¡ |d< | d¡durŽ| d¡|d< |S )z¥
    Return pipeline config, optionally overlaying group summary overrides.
    When flag is off or no group row exists, returns a shallow copy of pipeline_cfg.
    z&group config load failed for %s/%s: %sNÚsummary_modeÚsummary_instructions)Údictr   r   r0   r   Úget_business_group_configr   r    r   r   r   Úlower)r   r   r   r&   Úbaser1   r2   ÚlookupÚoverrider"   Úmoder   r   r   Úmerge_pipeline_config_for_group™   s<   
ÿ€€þ
rJ   )r   Úintegration_configc                C  s
  t |pi ƒ}|s
|S t|ƒ}|s|S z|  ||¡}t|ƒp|}W n ty+   |}Y nw z|  ||¡p4i }	|	sC||krC|  ||¡pBi }	W n tyO   | Y S w |	 d¡}
t|
tƒrq|
 ¡ rqzt	 
|
¡}
W n typ   d}
Y nw t|
t ƒrƒ|
rƒt |ƒ}| |
¡ |S |S )zAShallow-merge CRM toggle overrides for a call group when enabled.Ú
crm_configN)rC   r   r0   r   rD   r   Ú
isinstancer   r   ÚjsonÚloadsÚupdate)r   r   rK   r&   r   rF   r1   r2   rG   rH   ÚcrmÚmergedr   r   r   Úmerge_crm_config_for_groupÅ   s@   	ÿ€ÿ
ÿ
rS   )r   r	   r
   r   )r   r   r
   r   )r   r   r   r   r
   r   )r   r   r   r   r$   r   r
   r   )r   r/   r   r   r&   r	   r
   r   )r4   r   r   r   r&   r	   r   r   r   r/   r
   r5   )r>   r   r   r   r&   r	   r   r   r=   r   r   r/   r
   r5   )
r   r   r   r   r   r   r&   r	   r
   r@   )r   r   r   r   rK   r   r&   r	   r   r   r
   r@   )Ú__doc__Ú
__future__r   rN   ÚloggingÚtypingr   r   r   r   Ú	getLoggerÚ__name__r   ÚDEFAULT_SCOPEr   r   r#   r.   r3   r<   r?   rJ   rS   r   r   r   r   Ú<module>   s0    






ú'ù
2ú