
    Ni              
       R   d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZ  ee      j                   Zedz  Zed	z  Zed
z  Ze G d d             Zg dZdee   fdZdedefdZd"dedee   fdZd#dede
ee      dee e
e   f   fdZ!dede fdZ"dedee ef   fdZ#dedee ee   f   fdZ$d"dededee e
e   f   fdZ%d$dededefdZ&e'dk(  rKdZ( e&e(d      Z) e*de)jV                           e,e)jZ                  d      D ]  \  Z.Z/ e*d e. d!e/         yy)%u=  auto_approve.py — 자동 승인 5조건 검증

콘텐츠가 자동 승인 가능한지 5조건을 검증한다.
1. 사전 승인 템플릿 20종 매칭 여부
2. 저작권 안전 목록 체크
3. thread-hook-formula 체크리스트 통과 (5감정 중 2개+)
4. 블랙리스트 미저촉
5. 72시간 중복 아님
    N)	dataclassfield)Path)Optional   )scorecheck_blacklist_keywords	templatesapproved	publishedc                       e Zd ZU dZdZeed<   dZee	   ed<   dZ
eed<   dZeed<   dZeed	<   dZeed
<    ee      Zee	   ed<   dZeed<   dZee	   ed<   dZeed<    ee      Zee	   ed<   y)ApprovalResultu   승인 결과Fcondition_1_template_matchNmatched_templatecondition_2_copyright_safecondition_3_hook_passr   hook_emotion_countcondition_4_blacklist_clear)default_factoryblacklist_violationscondition_5_no_duplicateduplicate_hash
all_passedfail_reasons)__name__
__module____qualname____doc__r   bool__annotations__r   r   strr   r   r   intr   r   listr   r   r   r   r        N/home/jay/workspace/.worktrees/task-2117-dev1/content-pipeline/auto_approve.pyr   r      s    ',,&*hsm*',,"'4'(--&+D&A$s)A%*d*$(NHSM(J#D9L$s)9r%   r   )
   자체 작성u   금융감독원 공시u   보험개발원 통계u   국민건강보험공단u   생명보험협회u   손해보험협회u   금융위원회 보도자료u   한국은행 통계u   통계청 자료u   공공데이터포털returnc                  
   g } t         j                         s| S t        t         j                  d            D ]=  }t	        |dd      5 }| j                  t        j                  |             ddd       ? | S # 1 sw Y   KxY w)u%   사전 승인 템플릿 목록 로드*.jsonrutf-8encodingN)TEMPLATES_DIRexistssortedglobopenappendjsonload)r
   ffps      r&   _load_templatesr9   9   s~    I!M&&x01 ,!S7+ 	,rTYYr]+	, 	,, 	, 	,s   %A99B	textc                     | j                         j                         }t        j                  |j	                  d            j                         dd S )u*   콘텐츠 해시 생성 (중복 체크용)r,   N   )striplowerhashlibsha256encode	hexdigest)r:   
normalizeds     r&   _content_hashrD   D   s@    ##%J>>*++G45??A#2FFr%   hoursc                    t               }t        j                         | dz  z
  }t        t        fD ]  }|j	                         s|j                  d      D ]k  }	 t        |dd      5 }t        j                  |      }ddd       j                  dd      }||kD  r%|j                  d	d
      }|r|j                  |       m  |S # 1 sw Y   KxY w# t        j                  t        f$ r Y w xY w)u4   최근 N시간 내 게시된 콘텐츠 해시 로드i  r*   r+   r,   r-   N
created_atr   content_hash )settimeAPPROVED_DIRPUBLISHED_DIRr0   r2   r3   r5   r6   getaddJSONDecodeErrorKeyError)	rE   hashescutoff	directoryr7   r8   datarG   rH   s	            r&   _load_recent_hashesrV   J   s    uFYY[EDL)F"M2 	!) 
	A	!S73 )r99R=D)!XXlA6
&#'88NB#?L#

<0
	 M) ) (((3 s+   C(C>ACCCC0/C0c                      |
t               }|D ]C  }|j                  dd      }|j                  dg       }|s*t         fd|D              s?d|fc S  y)u   조건 1: 사전 승인 템플릿 매칭 여부

    텍스트가 사전 승인된 20종 템플릿 중 하나와 매칭되는지 확인.
    매칭 기준: 텍스트에 템플릿의 required_keywords가 모두 포함
    idunknownrequired_keywordsc              3   &   K   | ]  }|v  
 y wNr$   ).0kwr:   s     r&   	<genexpr>z'check_template_match.<locals>.<genexpr>m   s     6brTz6s   T)FN)r9   rN   all)r:   r
   tpltpl_idrZ   s   `    r&   check_template_matchrc   `   sh     #%	  y)GG$7< 6$566<  r%   sourcec                     | r| j                         j                         nd}t        D ](  }|j                         |v s||j                         v s( y d|v sd|v sd|v ryy)uy   조건 2: 저작권 안전 목록 체크

    콘텐츠 소스가 저작권 안전 목록에 포함되는지 확인.
    rI   Tu   자체u   원본u   직접F)r=   r>   COPYRIGHT_SAFE_SOURCES)rd   source_lowersafes      r&   check_copyright_saferi   r   sg    
 .46<<>'')L& ::<<'<4::<+G <8|#;x<?Wr%   c                 H    t        |       }|j                  |j                  fS )us   조건 3: thread-hook-formula 체크리스트 통과

    5감정 중 최소 2개 이상 포함 여부 판정.
    )
hook_scorehas_min_emotionsemotion_count)r:   results     r&   check_hook_formularo      s%    
 F""F$8$888r%   c                 (    t        |       \  }}| |fS )u   조건 4: 블랙리스트 미저촉

    블랙리스트 키워드 및 회사명 저촉 여부 확인.
    Returns: (통과 여부, 위반 키워드 목록) - True = 미저촉(통과)
    )r	   )r:   has_violation
violationss      r&   check_blacklistrs      s!     !9 >M:j((r%   c                 J    t        |       }t        |      }||v }| |r|fS dfS )u{   조건 5: 72시간 중복 아님

    최근 72시간 내 동일/유사 콘텐츠가 게시되지 않았는지 확인.
    N)rD   rV   )r:   rE   rH   recent_hashesis_duplicates        r&   check_no_duplicaterw      s:    
 !&L'.M=0L\\CCtCCr%   r'   c                 "   t               }t        |       \  |_        |_        t	        |      |_        t        |       \  |_        |_        t        |       \  |_
        |_        t        |       \  |_        |_        g |_        |j                  s|j                  j!                  d       |j
                  s|j                  j!                  d|        |j                  s)|j                  j!                  d|j                   d       |j                  s7|j                  j!                  ddj#                  |j                                |j                  s|j                  j!                  d       t%        |j                        dk(  |_        |S )	u   5조건 종합 검증

    Args:
        text: 콘텐츠 텍스트
        source: 콘텐츠 소스 (저작권 확인용)

    Returns:
        ApprovalResult 검증 결과
    u.   사전 승인 템플릿과 매칭되지 않음u#   저작권 안전 목록 미포함: u   훅 공식 미통과: 감정 u   개 (최소 2개 필요)u   블랙리스트 저촉: z, u$   72시간 내 중복 콘텐츠 존재r   )r   rc   r   r   ri   r   ro   r   r   rs   r   r   rw   r   r   r   r4   joinlenr   )r:   rd   rn   s      r&   approver{      su    F BVVZA[>F%v'> )=V(DF% ?QQU>V;F &"; GVVZF[CF&(C >PPT=U:F#V%: F,,""#ST,,""%H#QR''""+F,E,E+FF^_	
 --""&tyy1L1L'M&NO	
 **""#IJF//0A5FMr%   __main__u   7월부터 수수료 구조가 완전히 바뀌는데, 아직도 모르는 설계사가 47,382명이나 된다니. 이거 겪어본 사람? 안 하면 진짜 큰일남.)rd   u   자동 승인: u	     실패 z: )H   r\   )r'   )0r   r5   r?   rK   dataclassesr   r   pathlibr   typingr   hook_scorerr   rk   r	   __file__parentPIPELINE_DIRr/   rL   rM   r   rf   r#   dictr9   r!   rD   r"   rJ   rV   tupler   rc   ri   ro   rs   rw   r{   r   sample_textrn   printr   	enumerater   ireasonr$   r%   r&   <module>r      s      (   FH~$${*j({* : : :  d G G Gs CH ,s xT
/C uUY[cdg[hUhOi $  9S 9U49%5 9)# )%d3i"8 )DS D DeD(3-<O6P D.# .s . .b z	@  [9F	OF--.
/0v22A6 )	6	!Bvh'() r%   