
    iX)                     b   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 ej                  j                  dd       ddlmZ dedefd	Zd
edefdZddZdedefdZdedej(                  ddfdZdedej(                  ddfdZdedej(                  ddfdZdedej(                  ddfdZdedej(                  ddfdZdedej(                  ddfdZdedej(                  ddfdZdedej(                  ddfdZdej:                  fdZdedej(                  ddfdZddZ e!dk(  r e         yy)/   Meta Ads CLI - Meta Marketing API 관리 도구    N)date	timedelta)NoReturnz/home/jay/workspace)MetaAdsClienttokenreturnc                 \    | syt        |       dk  rdt        |       z  S | dd dz   | dd z   S )u,   토큰 앞 8자 + '...' + 뒤 4자 마스킹z(empty)   *N   z...)len)r   s    E/home/jay/workspace/.worktrees/task-2116-dev1/scripts/meta_ads_cli.py
mask_tokenr      s?    
5zRSZ!9uuRSz))    messagec                 j    t        d|  t        j                         t        j                  d       y)u1   에러 메시지를 stderr로 출력하고 exit 1zError: file   N)printsysstderrexit)r   s    r   
error_exitr      s"    	GG9
CJJ/HHQKr   c                 F    t        t        j                  | dd             y)u   JSON 형식으로 출력   F)indentensure_asciiN)r   jsondumps)datas    r   
print_jsonr$   !   s    	$**T!%
89r   daysc                     t        j                         }|t        | dz
        z
  }|j                  d      |j                  d      dS )u3   --days 값을 Meta API time_range dict으로 변환r   )r%   z%Y-%m-%d)sinceuntil)r   todayr   strftime)r%   r(   r'   s      r   days_to_time_ranger+   &   sB    JJLEI4!8,,E
+
+ r   clientargsc           	         	 | j                         }	 | j                         }j	                         D ci c](  \  }}||dk(  rt        |t              rt        |      n|* }}}|d}t        |       y# t        $ r}t        d|        Y d}~d}~ww xY w# t        $ r}t        d|        Y d}~d}~ww xY wc c}}w )u/   status: 토큰 유효성 + 계정 정보 출력u   토큰 정보 조회 실패: Nu   계정 정보 조회 실패: access_token)r   account)	check_token	Exceptionr   get_account_infoitems
isinstancestrr   r$   )	r,   r-   
token_infoeaccount_infokv
safe_tokenr#   s	            r   
cmd_statusr=   5   s    8'')
8..0 ]g\l\l\nTXTUWXQ.0Z35GJqMQNJ 
 D t%  821#6778
  821#6778
s3   A7 B -B?7	B BB	B<$B77B<c                     t        |dd      }	 | j                  |      }t	               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u'   campaigns list: 캠페인 목록 출력limit   )r?   u    캠페인 목록 조회 실패: N)getattrlist_campaignsr2   r   r$   )r,   r-   r?   	campaignsr8   s        r   cmd_campaigns_listrD   Q   sW    w+E;)))6	 y  ;5aS9::;s   - 	AA		Ac                     	 | j                  |j                  |j                  d|j                        }t               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u9   campaigns create: 캠페인 생성 (status=PAUSED 고정)PAUSED)name	objectivestatusdaily_budgetu   캠페인 생성 실패: N)create_campaignrG   rH   budgetr2   r   r$   r,   r-   resultr8   s       r   cmd_campaigns_createrO   \   sc    4''nn	 ( 
 v  4.qc2334s   3A 	A"
AA"c                     	 | j                  |j                        }t	               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u&   campaigns get: 단일 캠페인 조회campaign_idu   캠페인 조회 실패: N)get_campaignidr2   r   r$   rM   s       r   cmd_campaigns_getrU   k   sM    4$$$9 v  4.qc2334s   * 	AAAc                     	 | j                  |j                        }t	        |j                  d       y# t        $ r}t        d|        Y d}~5d}~ww xY w)u"   campaigns delete: 캠페인 삭제rQ   u   캠페인 삭제 실패: N)successrR   )delete_campaignrT   r2   r   r$   )r,   r-   rW   r8   s       r   cmd_campaigns_deleterY   u   sV    4((TWW(= 7477;<  4.qc2334s   7 	A AAc                     	 | j                  |j                        }t        |j                  d       y# t        $ r}t        t	        |             Y d}~;d}~wt
        $ r}t        d|        Y d}~Zd}~ww xY w)u1   upload-image: 이미지 업로드 후 hash 반환)
image_pathNu   이미지 업로드 실패: )hashfilepath)upload_imager]   FileNotFoundErrorr   r6   r2   r$   )r,   r-   
image_hashr8   s       r   cmd_upload_imagera      sn    7((DMM(B
 
>?  3q6 71!5667s!   7 	A= AA=%A88A=c                     t        |j                        }	 | j                  |j                  |j                  |      }t               y# t
        $ r}t        d|        Y d}~(d}~ww xY w)u+   insights: 광고 성과 인사이트 조회)	object_idobject_type
time_rangeu   인사이트 조회 실패: N)r+   r%   get_insightsrc   rd   r2   r   r$   )r,   r-   re   resultsr8   s        r   cmd_insightsrh      sl    #DII.J7%%nn((! & 
 w  71!5667s   (A 	A,A''A,c                    	 | j                         }	 | j                         t	        d       t        dt              d       y# t        $ r}t        d|        Y d}~Qd}~ww xY w# t        $ r}t        d|        Y d}~cd}~ww xY w)u>   token refresh: 장기 토큰 교환 후 .env.keys 업데이트u   토큰 교환 실패: Nu&   .env.keys 토큰 업데이트 실패: u   장기 토큰 교환 완료rW   )rI   r   )exchange_tokenr2   r   update_env_tokenr   r$   r   )r,   r-   	new_tokenr8   s       r   cmd_token_refreshrm      s    1))+	A	* 

'()j.CDE  1+A3/001
  A;A3?@@As.   A A+ 	A(A##A(+	B4BBc                     t        j                  dt         j                        } | j                  dd      }|j	                  dd       |j	                  d	d
      }|j                  dd      }|j	                  dd      }|j                  dt        dd       |j	                  dd      }|j                  ddd       |j                  ddd       |j                  dt        dd       |j	                  dd      }|j                  d dd!       |j	                  d"d#      }|j                  d dd!       |j	                  d$d%      }|j                  d&d'       |j	                  d(d)      }	|	j                  d*d+dd,-       |	j                  d.d/d0g d1d23       |	j                  d4t        d5d6       |j	                  d7d8      }
|
j                  dd      }|j	                  d9d:       | S );Nr   )descriptionformatter_classcommandCOMMAND)destmetavarrI   u)   토큰 유효성 및 계정 정보 확인)helprC   u   캠페인 관리actionACTIONlistu   캠페인 목록 조회z--limitr@   u   최대 결과 수 (기본: 25))typedefaultru   createu   캠페인 생성z--nameTu   캠페인 이름)requiredru   z--objectiveu:   캠페인 목표 (예: OUTCOME_TRAFFIC, OUTCOME_AWARENESS)z--budgetu!   일일 예산 (센트/원 단위))ry   r|   ru   getu   단일 캠페인 조회z--idu   캠페인 IDdeleteu   캠페인 삭제upload-imageu   이미지 파일 업로드r]   u$   업로드할 이미지 파일 경로insightsu!   광고 성과 인사이트 조회z--object-idrc   u*   조회할 캠페인/광고세트/광고 ID)rs   r|   ru   z--object-typerd   campaign)r   adsetadu&   오브젝트 타입 (기본: campaign))rs   rz   choicesru   z--days   u?   조회 기간(일수), since/until 으로 변환됨 (기본: 7)r   u   토큰 관리refreshu?   장기 액세스 토큰으로 교환 및 .env.keys 업데이트)argparseArgumentParserRawDescriptionHelpFormatteradd_subparsers
add_parseradd_argumentint)parser
subparserscampaigns_parsercampaigns_sublist_pcreate_pget_pdelete_pupload_parserinsights_parsertoken_parser	token_subs               r   build_parserr      sv   $$E <<F
 &&Iy&IJ 8   ",, -  %3383TM %%f3L%MF
	R>^_ ''7I'JH(T8JKI  
 *3Dgh $$U1J$KE	v>B ''7I'JH&4nE ))) * M z0VW !++0 , O   9	 !    +5 !    N	 !  (( ) L ++8+LI)jkMr   c                    |j                   }|dk(  rt        | |       y |dk(  rt        |dd       }|dk(  rt        | |       y |dk(  rt	        | |       y |dk(  rt        | |       y |dk(  rt        | |       y t        dt        j                  	       t        j                  d
       y |dk(  rt        | |       y |dk(  rt        | |       y |dk(  rPt        |dd       }|dk(  rt        | |       y t        dt        j                  	       t        j                  d
       y t        dt        j                  	       t        j                  d
       y )NrI   rC   rv   rx   r{   r}   r~   uK   campaigns 서브 명령어를 지정하세요: list | create | get | deleter   r   r   r   r   r   u2   token 서브 명령어를 지정하세요: refreshuF   명령어를 지정하세요. --help 로 도움말을 확인하세요.)rq   r=   rA   rD   rO   rU   rY   r   r   r   r   ra   rh   rm   )r,   r-   rq   rv   s       r   dispatchr     s   llG(64 	K	x.Vvt,x .u_fd+x .]ZZ HHQK	N	"&	J	VT"	G	x.Yfd+FSZZXHHQK 	V]`]g]ghr   c                  p   t               } | j                         }|j                  s%| j                          t	        j
                  d       	 t               }t        |       y # t        $ rH}t        |      }t        d| t        j                         t	        j
                  d       Y d }~Yd }~ww xY w)Nr   u(   Error: MetaAdsClient 초기화 실패 - r   r   )r   
parse_argsrq   
print_helpr   r   r   r2   r6   r   r   r   )r   r-   r,   r8   msgs        r   mainr   B  s    ^FD<< VT  !f8>SZZPs   
A$ $	B5->B00B5__main__)r	   N)"__doc__r   r!   r   datetimer   r   typingr   pathinsertutils.meta_ads_clientr   r6   r   r   r$   r   dictr+   	Namespacer=   rD   rO   rU   rY   ra   rh   rm   r   r   r   r   __name__ r   r   <module>r      s   5   
 $  ( ) /*c *c *  :
S T } H,>,> 4 8} H4F4F 4  h6H6H T m 83E3E $ = =h6H6H =T =	@] 	@(2D2D 	@ 	@ h.@.@ T $Fm F83E3E F$ F*Sh-- Sv'] '(*<*< ' '^$ zF r   