
    J1i #                     L   d Z ddlZddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
mZmZmZmZmZmZ  ej"                  dd      Zdg d	d
ddg ddddg dg dddg ddddZddddZd
dg ddZd ed!ed"efd#Zd$ed"eeef   fd%Zd&ed'ed!ed(ed$ed"edz  fd)Zd*e
d"e
fd+Zy),z`
SERP Features Optimization Node
Optimizes content for featured snippets, PAA, and AI Overviews
    N)datetime)AnyDictList)SEOCampaignStateCampaignPhasetransition_phase	add_erroradd_warningOptimizationQueueItemSERPFeatureDataNEXT_API_URLzhttp://127.0.0.1:3000zCWhat is X? X is [40-60 word direct answer]. This [benefit/context].)direct_answer	expansioncontext)(   <   )format	structure
word_countz%Numbered list with clear action verbs)intronumbered_steps
conclusion)      )r   r   
step_countz*Table with clear headers and concise cells)r   comparison_tablerecommendation)FeaturezOption AzOption B)r   r   columnsz'Bulleted list with consistent structure)intro_sentencebullet_itemssummary)r   
   )r   r   
item_count)
definitionhow_to
comparisonlist)2   d   z,Question -> Direct Answer -> Brief Expansionr   )answer_lengthr   max_questionsz2Direct statement -> Evidence/Data -> Brand mention)zUnique data pointzProprietary methodologyzExpert authority signal)r,   r   differentiationfeaturekeywordreturnc                 (   |j                         }| j                  d      dk(  rD|j                  d      ry|j                  d      ryd|v sd|v sd	|v ry
|j                  d      ryy| j                  d      dk(  ry| j                  d      dk(  ryy)z7Determine the best optimization type for a SERP featurefeature_typesnippet)zwhat iszwhat aredefinez
meaning ofsnippet_definition)zhow tozhow dozsteps tozguide tosnippet_how_tovszcompared to
differencesnippet_comparison)besttopzlist ofztypes ofsnippet_listsnippet_paragraphpaapaa_expansionai_overviewai_overview_citationgeneral_optimization)lowerget
startswith)r/   r0   keyword_lowers      ;/var/www/html/langgraph-service/nodes/serp_features_node.py!get_optimization_type_for_featurerI   C   s    
 MMOM{{>"i/##$ST'%%&RS#]"m}&DXeHe'%%&LM!&	^	$	-	^	$	5%!    site_idc           
      X  K   i }	 t        j                  d      4 d{   }|j                  t         dddt	        j
                  dd       id	d
d       d{   }|j                  dk(  rd|j                         }|j                  dg       D ]?  }|||j                  dd      <   |j                  d      s*|||d   j                         <   A ddd      d{    |S 7 7 7 
# 1 d{  7  sw Y   |S xY w# t        $ r}t        d|        Y d}~|S d}~ww xY ww)z%Fetch existing pages for optimization      >@timeoutNz/api/admin/seo/pagesAuthorizationBearer INTERNAL_API_TOKEN 	PUBLISHEDr+   )statuslimit)headersparams   pagesslugtargetKeywordz&[SERPFeaturesNode] Fetch pages error: )httpxAsyncClientrE   r   osgetenvstatus_codejsonrD   	Exceptionprint)rK   rZ   clientresponsedatapagees          rH   fetch_existing_pagesrj   `   sM    E<$$T2 	D 	Df#ZZ. 45(GBII>RTV4W3X*YZ"-< (  H
 ##s*}} HHWb1 DD26E$((62./xx0?Cd?399;<D	D 	D  L!	D	D 	D 	D 	D  L  <6qc:;;L<s   D*D C)D ;C/C+ AC/?C/D "C-#D 'D*)D +C/-D /D5C86D=D  D*D 	D'D"D*"D''D*page_idoptimization_typepriorityc                   K   	 t        j                  d      4 d{   }|j                  t         dddt	        j
                  dd       i|| |||d	d
       d{   }|j                  dv r2|j                         }|j                  d      cddd      d{    S ddd      d{    y7 7 W7 7 # 1 d{  7  sw Y   yxY w# t        $ r}t        d|        Y d}~yd}~ww xY ww)z%Queue a SERP feature optimization jobrM   rN   Nz/api/admin/seo/optimize/queuerP   rQ   rR   rS   langgraph_serp_optimization)siteIdpageIdoptimizationTyper\   rm   source)rW   rb   )rY      jobIdz-[SERPFeaturesNode] Queue optimization error: )r]   r^   postr   r_   r`   ra   rb   rE   rc   rd   )	rk   rl   r0   rm   rK   re   rf   rg   ri   s	            rH   queue_optimizationrw   w   s    C$$T2 	) 	)f#[[. =>(GBII>RTV4W3X*YZ%%(9%, (; )  H ##z1}}xx(	) 	) 	) 	) 	)$ %	)	) 	) 	) 	) 	)$   C=aSABBCs   C8C B7C ?B?!B9"2B?C  B;!C %C8&C 1B=2C 6C87C 9B?;C =C ?CCCC C8C 	C5C0+C80C55C8statec           
        K   t        d| d           | d   }t        j                         j                         }g }d}	 t	        |       d{   }t        dt        |       d       | j                  dg       D ]z  }|j                  dd	      j                         }|j                  d
      r6|j                  d      rH|j                  |      }|s@|j                         D ]-  \  }	}
||	j                         v s|	j                         |v s+|
} n t        ||      }|j                  dd	      }|dk(  rd}n|dk(  rd}n
|dk(  rd}nd}|r|j                  d      nd}t        t        t        j                               |||||rdndd      }|j                  |       |s.| j                  di       j                  dd      }||k  sW	 t        |||||       d{   }|r
d|d<   |dz  }} |dk(  r|rt#        | d d!t        |       d"      } t        d#| d$t        |       d%       || d(<   || d)<   t'        | t(        j*                        } || d*<   | S 7 7 }# t         $ r}t        d| d|        Y d}~
d}~ww xY w# t         $ r1}t        d&|        t%        | d d't        |             } Y d}~d}~ww xY ww)+z
    SERP Features Optimization phase node

    - Analyzes existing content for SERP feature optimization opportunities
    - Queues optimizations for snippets, PAA, and AI Overviews
    - Tracks optimization queue in state
    z7[SERPFeaturesNode] Starting SERP optimization for site rK   r   Nz[SERPFeaturesNode] Found z existing pagesserp_features_datar0   rS   captured	optimizedr3   rA   r$   r4   	   r?   r      idpendingneeds_content)r   rk   rl   target_keywordrm   rU   completed_atconfigmax_optimizations_per_run   queuedrU      z5[SERPFeaturesNode] Failed to queue optimization for 'z': serp_featuresz$SERP optimization API unavailable - z opportunities identifiedz[SERPFeaturesNode] Queued z optimizations, z total opportunitiesz9[SERPFeaturesNode] Error during SERP optimization phase: z SERP optimization phase failed: optimization_queuepages_optimized
updated_at)rd   r   utcnow	isoformatrj   lenrE   rD   itemsrI   r   struuiduuid4appendrw   rc   r   r
   r	   r   	LINK_OPPS)rx   rK   nowr   optimized_countexisting_pagesr/   r0   rh   r[   prl   r3   rm   rk   opt_itemmax_to_queuejob_idri   s                      rH   serp_optimization_phaser      s8     
CE)DTCU
VWIG
//

%
%
'C68OL_3G<<)#n*=)>oNO yy!5r: ;	gGkk)R0668G {{:& {{;' "%%g.D-335 GD!$**,.$**,'2I  !B'7 S #;;~r:L},*& )-dhhtn$G,tzz|$"3&!$+y!H %%h/ $yy26::;VXZ["\1g'9#%67( " "19HX.+q0Os;	g| a$66s;M7N6OOhikE 	*?*;;KCPbLcKddxyz #5E
.E
 UM$;$;<EE,Li =p" % g UV]U^^abcadeffg  _I!MN%4TUXYZU[T\2]^_s   =K J I"CJ BJ +'J I''I%(I'8?J 7+K"J %I''	J0JJ JJ 	K	'K?KK		K)__doc__r_   r   r]   r   typingr   r   r   state.campaign_stater   r   r	   r
   r   r   r   r`   r   SNIPPET_OPTIMIZATIONPAA_OPTIMIZATIONAI_OVERVIEW_OPTIMIZATIONr   rI   dictrj   intrw   r    rJ   rH   <module>r      sF  
 
    " "   ryy)@A X> :> ?D6 <B! 0 ?  B """ 	": S$Y .  	
  	4Z<f)9 f>N frJ   