
    ɢinV                        d dl Z d dlmZ d dlmZmZ d dlmZ  e j                  e	      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ddddg dddddddddd
d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Zdg didd gg d!d"d#d$gd%d&gd'd(gg d)d*d+d#gg d,d-g d.g d/d0g d1g d!d"d dgg d2d"d#d dgid3	Zd#d4gd5gd d6d7dgg d8d d6d9d:gg d d6d;d<gd5gd d6d#d4gd5d=gd d6d d>gg d?d d6d d@gdAdBgd d6d#gg dCd d6d#gg dDd d6dE	ZdF dGdHdI dJdKdL dMdNdO dPdQdR dJdKdSZg dTZ G dU dV      Zd;edWedXefdYZdjdZed[edXeeef   fd\ZdjdZed[edXeeef   fd]ZdZed^efd_ZdjdZed[edXeeef   fd`Zdjdaed[edXeeef   fdbZ edcdddeeg dfg      dhedXefdi       Zy)k    N)Any)aura_moduleModuleResult)ValidatorInputstringT)typerequiredlist_of_strings   )r   r	   	min_itemsFlist_of_dictsnumber   )r   r	   default	affiliate mediumz	1000-5000bool)
namedescriptionscoremonetization_modeltarget_audiencetime_to_revenuevaluation_bandaffiliate_programsrequires_inventorysynopsis)r   r	   r   item_schema)domainkeywordsinterpretationsdomain_summarynichesr   taglinez#4F46E5z#7C3AEDz#06B6D4)optionsrecommendedcolor_primarycolor_secondarycolor_accentindustry_contextauthor)r   attributionpersonheadingr   )textbodydetail)titler   r4   tiercostamount)r   pricemember_name)r4   position	job_title)r   roleq)aresponser1   )questionanswer)r   statmetric)r4   r   r   )valuelabel)r0   r   step)r1   r2   summary)	testimonialsfeaturespricing_tiersteam_members	faq_itemsstatshow_it_works_stepsresource_itemsgallery_sectionsr   icon)required_keysoptional_keysr   quote)r<   companyratingr   r@   rA   rD   rE   step_numberr8   )r   rI   ctapopularr<   bioimage)r   r[   items)r   rQ   url)	rI   rH   rL   rM   rN   rJ   rK   rP   rO   c                     d| v xr d| v S )Nr@   rA    items    8/sites/domain-asset-master/aura_core/validator/engine.py<lambda>rc   q   s    zT'9'Nh$>N     rL   )looks_like_faqtargetc                 "    d| v xr
 d| v xr d| vS )NrQ   r4   r@   r_   r`   s    rb   rc   rc   u   s    6T>+hgo+hR\dhRh rd   rI   )looks_like_featurerf   c                 "    d| v xr
 d| v xr d| vS )Nr<   rZ   rT   r_   r`   s    rb   rc   rc   y   s    $(`5D=(`W\`M` rd   rK   )looks_like_teamrf   c                 
    d| v S )NrT   r_   r`   s    rb   rc   rc   }   s
    w$ rd   rH   )looks_like_testimonialrf   c                 V    d| v xr$ t        | j                  dd            dkD  xr d| vS )Nr   r   P   rD   )lengetr`   s    rb   rc   rc      sB    =D+@  ,CSR_acIdEehjEj  ,Cov  C  pC rd   )rI   rL   rH   rK   rM   )headlinesubheadline	hero_bodycta_textaboutabout_titlemission_statementfeatures_titlefeatures_subtitletestimonials_title	faq_titleproblem_titleproblem_descriptionsolution_titlesolution_descriptionpricing_titlepricing_subtitlecontact_titlecontact_descriptionresources_titlecomparison_titlegallery_title
team_titleteam_subtitlehow_it_works_titlefinal_cta_titlefinal_cta_bodyfinal_cta_buttonc                       e Zd ZdefdZdedefdZdedefdZdedefdZed	e	fd
       Z
ed	efd       Zd	efdZy)ValidationReportercontextc                 <    || _         g | _        g | _        g | _        y N)r   errorswarningsrepairs)selfr   s     rb   __init__zValidationReporter.__init__   s    "$$&#%rd   fieldmessagec                     | j                   j                  ||d       t        j                  d| j                   d| d|        y N)r   r   
[VALIDATE:z] : )r   appendloggererrorr   r   r   r   s      rb   r   zValidationReporter.error   s<    Uw?@z$,,r%7)DErd   c                     | j                   j                  ||d       t        j                  d| j                   d| d|        y r   )r   r   r   warningr   r   s      rb   warnzValidationReporter.warn   s<    uABDLL>E7"WIFGrd   actionc                     | j                   j                  ||d       t        j                  d| j                   d| d|        y )N)r   r   r   z] REPAIRED r   )r   r   r   infor   )r   r   r   s      rb   repairzValidationReporter.repair   s<    ev>?jk%6(KLrd   returnc                 2    t        | j                        dk(  S )Nr   )ro   r   r   s    rb   is_validzValidationReporter.is_valid   s    4;;1$$rd   c                     d}|t        | j                        dz  z  }|t        | j                        dz  z  }t        dt	        d|            S )Nd         r   )ro   r   r   maxmin)r   bases     rb   r   zValidationReporter.score   sJ    DKK 2%%DMM"Q&&1c#tn%%rd   c           
         | j                   | j                  | j                  t        | j                        t        | j
                        t        | j                        | j                  | j
                  | j                  d	S )N)	r   validr   error_countwarning_countrepair_countr   r   r   )r   r   r   ro   r   r   r   r   s    rb   to_dictzValidationReporter.to_dict   sZ    ||]]ZZt{{+ /-kk||

 
	
rd   N)__name__
__module____qualname__strr   r   r   r   propertyr   r   intr   dictr   r_   rd   rb   r   r      s    & &F3 F FH# H HMC M M %$ % % &s & &
 
rd   r   expected_typer   c                 \   |dk(  rt        | t              S |dk(  rt        | t        t        f      S |dk(  rt        | t              S |dk(  r$t        | t
              xr t        d | D              S |dk(  r$t        | t
              xr t        d | D              S |dk(  rt        | t              S y	)
Nr   r   r   r
   c              3   <   K   | ]  }t        |t                y wr   )
isinstancer   .0vs     rb   	<genexpr>z_check_type.<locals>.<genexpr>   s     .Qaz!S/A.Q   r   c              3   <   K   | ]  }t        |t                y wr   )r   r   r   s     rb   r   z_check_type.<locals>.<genexpr>   s     .Rqz!T/B.Rr   r   T)r   r   r   floatr   listallr   )rD   r   s     rb   _check_typer      s     %%% %#u..%&&))%&Q3.Q5.Q+QQ'%&R3.RE.R+RR%&&rd   dataauto_repairc                 	   t        d      }t        | t              s,|j                  ddt	        |       j
                          | |fS t        j                         D ]  \  }}| j                  |      }|J|j                  d      r8|j                  |d       |r$d|v r |d   | |<   |j                  |d|d           dt        ||d         s|j                  |d	|d    d
t	        |      j
                          |r|d   dk(  r1t        |t              s!t        |      | |<   |j                  |d       na|d   dk(  r)t        |t              r|g| |<   |j                  |d       n0|d   dk(  r(t        |t              r|g| |<   |j                  |d       |d   j                  d      rft        | j                  |      t              rG|j                  dd      }t        | |         |k  r$|j                  |d| dt        | |                 |d   dk(  sd|v s| j                  |g       }t        |t              st        |      D ]!  \  }}	t        |	t              sv|j                  | d| ddt	        |	      j
                          |rEt        |d   j!                               d   t        |	      i||<   |j                  | d| dd       |d   j                         D ]~  \  }
}|	j                  |
      }|\|j                  d      rK|j#                  | d| d|
 d       |sHd|v sM|d   |	|
<   |j                  | d| d|
 d|d           v|A|j                  d      s0d|v r,|s|d   |	|
<   |j                  | d| d|
 d|d           |t        ||d         r|j#                  | d| d|
 d	|d    d
t	        |      j
                          |r2|d   dk(  r*t        |      |	|
<   |j                  | d| d|
 d       6|s:|d   dk(  sDt        |t              sV	 t%        |      |	|
<   |j                  | d| d|
 d        $  | |fS # t&        $ rF |j                  dd      |	|
<   |j                  | d| d|
 d|j                  dd              Y w xY w)NanalysisrootExpected dict, got r	   Required field missingr   zSet default: r   z	Expected z, got r   Coerced to stringr
   zWrapped string in listr   zWrapped single dict in listlist_ofr   r   zExpected at least z items, got r   []Converted to dict].zRequired sub-field missingr   zCoerced to number)r   r   r   r   r   r   ANALYSIS_SCHEMAr\   rp   r   r   r   
startswithr   ro   	enumeratekeysr   r   
ValueError)r   r   report
field_namespecvalr   r\   ira   
item_field	item_specitem_vals                rb   validate_analysisr      sM   
+FdD!V24:3F3F2GHIV|+113 =D
Dhhz";xx
#Z)AB9#4'+ID$MM*d9o=N.OP3V-LLyffT#YEWEWDX%YZ<8+JsC4H'*3xD$MM*.AB&\%66:c3;O(+uD$MM*.FG&\_4C9N(+uD$MM*.KL<""9-*TXXj=QSW2Xa0I4
#$y0Z+=i[UXY]^hYiUjTk)lm<?*}/DHHZ,E%&(/ DGAt%dD1
|1QCq%9=PQUVZQ[QdQdPe;fg&(,T--@-E-E-G(H(KSQUY'WE!H"MMZL!A*>@ST 15m1D1J1J1L D-
I#'88J#7#+	j0I"KK:,as"ZL(IKgh*yI/E3<Y3GZ 0 &AaS:,.OS`ajktau`vQw x%-immJ6OT]ajTj*3<Y3GZ 0 &AaS:,.OS`ajktau`vQw x%1+hPYZ`Pa:b"KK:,as"ZL(IYW`agWhViioptu}p~  qH  qH  pI  LJ  K*y/@H/L36x=Z 0 &AaS:,.OQd e!,61Bh1NS]^fhkSl!D7<XD$4$*MMZL!Bzl2SUh$i'DDA=D~ <	 (2 !D7@}}YPQ7RD$4$*MMZL!Bzl2SWdenerers|~  fA  eB  VC  %D!Ds   	(Q>>AS	S	c           	         t        d      }t        | t              sI|j                  ddt	        |       j
                          |rdddgdd} |j                  dd	       | |fS t        j                         D ]  \  }}| j                  |      }|C|j                  d
      r|j                  |d       |rd|v r|d   | |<   |j                  |d       |d   dk(  sed|v sj| j                  |g       }t        |t              st        |      D ]Z  \  }}t        |t              r|j                  | d| dd       |s2t        |      dd||<   |j                  | d| dd       \  | j                  dg       }	| j                  dd      }
t        |	t              rat        |
t        t        f      rK|
t        |	      k\  r=|	r;|j!                  dd|
 dt        |	       d       |rd| d<   |j                  dd       | |fS )Nbrandr   r   Brandr   r%   r   )r'   r(   zCreated minimal brand structurer	   r   r   zSet defaultr   r   r   r   r   zExpected dict in listr   r'   r(   zIndex z out of range (options length: )z
Reset to 0)r   r   r   r   r   r   r   BRAND_SCHEMAr\   rp   r   r   r   r   r   ro   r   )r   r   r   r   r   r   r\   r   ra   r'   recs              rb   validate_brandr     s
   (FdD!V24:3F3F2GHI)0R @ARSTDMM&"CDV|(..0 U
Dhhz";xx
#Z)AByD0#'	?Z j-8<?*}/DHHZ,E%&(/ UGAt%dD1
|1QCq%9;RS&03D	b'IE!H"MMZL!A*>@STUU& hhy"%G
((=!
$C'4 Zc5\%B#g,7KKu4STWX_T`Saab'cd&']#m\:<rd   r   c                 T   t         j                         D ]{  \  }}| j                  |      }t        |t              r|s+|d   }|j                         D ci c]  \  }}|dk7  st        |      s|| }}}g }	t        |      D ]h  \  }
}t        |t              s|j                         D ]?  \  }}	  ||      r1|	j                  |
       |j                  | d|
 dd| d|         gA j |	s|| vst        | j                  |      t              sg | |<   t        |	d      D ]d  }|j                  |      }| |   j                  |       |j                  | d| d	|j                  d
|j                  dd            d d         f ~ y c c}}w # t        $ r Y w xY w)Nrf   r   r   zLooks misplaced (z), moving to T)reverseu   →zMoved misplaced item: r4   r@   ra   (   )MISPLACEMENT_SIGNATURESr\   rp   r   r   callabler   r   r   r   	Exceptionsortedpopr   )r   r   source_fieldsigssource_itemstarget_fieldkr   	check_fnsmisplaced_indicesr   ra   
check_namecheck_fnidx
moved_items                   rb   _detect_and_fix_misplacementsr  F  s   5;;= dxx-,-\H~&*jjlTdaa8mQRQTT	T . 
	GAtdD)(1(9 $
H~)003|nAaS$:>OPZ|[hiuhv<wx &
	 4'z$((<:PRV/W%'\"/> )--c2
\"))*5#nC~6,Z^^GZ^^T^`fEg-hiljl-m,no3 U ! s$   F&F2F57F	F'	&F'	c                    t        d      }t        | t              sD|j                  ddt	        |       j
                          |rddi} |j                  dd       | |fS |rt        | |       t        D ]  }| j                  |      }|t        |t              r(|j                  |dt	        |      j
                          |sSt        |t              rg|j                  ||j                  d|j                  d	|j                  d
d                        }t        |t              r|| |<   nt        |      | |<   nt        |      | |<   |j                  |d        t        j                         D ],  \  }}| j                  |      }|t        |t              r7||v r3|j                  |d       |r||   | |<   | |   }|j                  |d       t        |t              sY|j                  |dt	        |      j
                          |r.t        |t              r|g| |<   ng | |<   |j                  |d       t        |      D ]S  \  }}	t        |	t              s|j                  | d| ddt	        |	      j
                          |rYt        |	t              rI|d   rD|d   d   |	i||<   t!        |d         dkD  rd||   |d   d   <   |j                  | d| dd       t"        j                  |i       }
|d   D ]  }||	vsd}|
j                  |g       D ]8  }||	v s|	|   s|r&|	|   |	|<   |j                  | d| d| d| d       d} n |rZ|j                  | d| d| d       |swd|	|<   |j                  | d| d| d        V / | j                  d      }|t        |t              sH|j                  ddt	        |      j
                          |rg g d| d<   |j                  dd        | |fS d!|vrg |d!<   |j                  d"d#       d$|vrg |d$<   |j                  d%d&       | |fS )'N	site_copyr   r   rq   WelcomezCreated minimal site_copyExpected string, got r1   contentr4   r   r   zNested wrapper detectedzUnwrapped nested structurezExpected list, got zConverted to listr   r   rR   r   r   zConverted string to dictFr   zResolved from alias ''Tz!Required key missing in list itemzSet empty string defaultcomparison_table)headersrowszReset to empty tabler  zcomparison_table.headerszAdded empty headersr  zcomparison_table.rowszAdded empty rows)r   r   r   r   r   r   r   r  SITE_COPY_STRING_FIELDSrp   r   r   SITE_COPY_LIST_FIELDSr\   r   r   ro   FIELD_ALIASES)r   r   r   r   r   r1   r   r   r   ra   aliasesreq_keyresolvedaliascts                  rb   validate_site_copyr  i  s   ,FdD!V24:3F3F2GHI	*DMM&"=>V|%dF3( :hhuo?:c3#7KK!6tCy7I7I6JKLc4(775#''&#'')SWWU\^`Ma:b*cdD!$,&*U&)#hU"%c(DKe%89: 2779 1f
Dhhz";c4 S J(AB'*:D$z*CMM*.JK#t$LL':49;M;M:N%OPc4((+uD$')D$j*=> ~ 	fGAtdD)zl!A3a04GT
H[H[G\2]^!$,o1F"&"7":D!AAtO459?ACF4#8#;<AaS&:<VW#''
B7G0 f$&$H!(Wb!9 " D=T%[*04UW &AaS7).LPefkellmNn o'+H!" $zl!A3b	$BDgh&,.DM"MMZL!Bwi*HJdef	f/1ff 
$	%B	~"d#KK*.A$r(BSBSAT,UV792+F'(02HI < " "98:OPR6
57IJ<rd   package_datac                    t        d      }t        | t              sC|j                  ddt	        |       j
                          |ri } |j                  dd       n| |fS | j                  di       }t        ||      \  }}|| d<   |j                  j                  |j                         |j                  j                  |j                         |j                  j                  |j                         | j                  di       }t        ||      \  }}|| d<   |j                  j                  |j                         |j                  j                  |j                         |j                  j                  |j                         | j                  d      }|Zt        |t              sJ|j                  dd	t	        |      j
                          |r t        |      | d<   |j                  dd
       | |fS )Npackager   r   zCreated empty package dictr   r   r  sales_letterr  r   )r   r   r   r   r   r   r   rp   r   r   extendr   r   r  r   r   )r  r   r   r   brand_reportr  copy_reportsaless           rb   validate_packager    s   	*FlD)V243E3N3N2OPQLMM&">?''Wb)E(KHE<!L
MM,,-
OO<001
NN,../  b1I/	{SI{ )L
MM++,
OO;//0
NN+--.^,EE3!7N&;DK<P<P;Q$RS+.u:L(MM.*=>rd   	validatorz1.0.0u   Three-layer validation pipeline — normalizes, validates schemas for site copy and brand data, and auto-repairs missing fields with safe defaults)r   
validationquality)r   versionr   input_modeltagsconfigc                    | j                  di       }| j                  dd      }| j                  dd      }|dk(  rt        |      }t        |d   |      S |d	k(  r8t        ||
      \  }}t        |j                  ||j                         d      S t        ||
      \  }}t        |j                  ||j                         d      S )Nr   r   Trf   r  r   r   )okoutputr   r  )r   r   )rp   r   r   validate_brand_datar   r   r  )r&  r   r   rf   result	validatedr   s          rb   run_validatorr-    s     ::fb!D**]D1KZZ+.F"4(vgv>>	7	/+N	6%1AB
 	

 /tM	6%1AB
 	
rd   )T)loggingtypingr   aura_core.module_contractr   r   aura_core.typesr   	getLoggerr   r   r   r   r  r  r   r  r   r   r   r   tupler   r   r   r  r  r  r-  r_   rd   rb   <module>r4     s     ? *			8	$  T2*1M 1uE'U;%48$,$?&EaH+3S^"_(0ePRS(0ePXY'/U{[+<%\^"_+1uQV"W!)uL
	4  %48 (eK
	 %%AF&EiP (e	R%5YO!)uL$ @A$f->XY&/68:LM+_6XY"Gn8QR3>^_$?Pjk!' 3D_` 69"56
 "=1  "8,> %h/ "7+  "=1 -0 !'*F !&)) ": "7S. d O
 i
 a 
 #? 
 C# . $)
 )
Xs 3 4  FC Fd FeDJ\D\>] FR& &4 &5GYAY;Z &R   6H  F^S ^t ^uTK]E]?^ ^B  3   T   U4QcKcEd   F 	 e	/
$ 
< 

rd   