
    +i{                         d Z ddlZddlZddlZddlZddlZddlZddlZdZ	dZ
dZdZdZdZd	Zd
 ZddZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"e#dk(  r e"        yy) u   InfoKeyword Firebase 프로젝트 분리 자동화 스크립트
새 Firebase 프로젝트 생성 → 서비스 설정 → 규칙 배포 → 인덱스 생성 → 환경변수 교체
    Nzinfokeyword-j2hInfoKeywordzinsuwiki-j2hzasia-northeast3z/home/jay/projects/InfoKeywordz/home/jay/projects/insuwikizH/home/jay/.config/gcloud/service-accounts/insuwiki-j2h-fa603f4f75f5.jsonc                  j    t        j                  g ddd      } | j                  j                         S )zGet access token from gcloud)gcloudauthzprint-access-tokenT)capture_outputtext)
subprocessrunstdoutstrip)results    0/home/jay/workspace/teams/dev2/firebase-setup.py	get_tokenr      s-    ^^0$F ==      c                    |
t               }d| dd}|r||d<   |r#t        j                  |      j                         nd}t        j
                  j                  ||||       }	 t        j
                  j                  |      5 }|j                  t        j                  |j                         j                               fcddd       S # 1 sw Y   yxY w# t        j                  j                  $ rh}	|	j                         j                         }	 |	j                  t        j                  |      fcY d}	~	S #  |	j                  dd|iifcY cY d}	~	S xY wd}	~	ww xY w)	zMake authenticated API callNzBearer zapplication/json)AuthorizationzContent-TypezX-Goog-User-Project)dataheadersmethoderrormessage)r   jsondumpsencodeurllibrequestRequesturlopenstatusloadsreaddecoder   	HTTPErrorcode)
r   urlr   tokenquota_projectr   bodyreqrespes
             r   api_callr,      s)   } #5'**G )6%&(,4::d""$$D
..
 
 4
 
PC8^^##C( 	AD;;

499;+=+=+? @@	A 	A 	A<<!! 8vvx 	8664::d+++	866Gi%67778sZ   'C =C	C CC C E6E D;5E;EEEEEc                    | sy| j                  d      rd|  }nd| v rd|  }nd| v rd|  }nd|  }t        d	      D ]  }t        d
|||      \  }}|dk(  rg|j                  dd      }|r+d|v rt	        d|d            y|j                  d|      c S t	        d|dz    d       t        j                  d       t	        d| d|         y t	        d       y)z-Wait for a long-running operation to completeNzoperations/(https://firebase.googleapis.com/v1beta1/	firestorez$https://firestore.googleapis.com/v1/identitytoolkitz'https://identitytoolkit.googleapis.com/z/https://cloudresourcemanager.googleapis.com/v1/<   GETr&   r'      doneFr   u     ✗ Operation failed: responsez  ... waiting (   z/60)   u!     ✗ Failed to check operation:  u     ✗ Operation timed out)
startswithranger,   getprinttimesleep)op_namer&   r'   r%   ir   r*   r5   s           r   wait_for_operationrB   8   s    -(8	B		4WI>	g	%7yA?yI2Y s%}US=88FE*Dd?4T']ODExx
D11OAaC5-.JJqM5fXQtfEF 

%&r   c                  d   t        d       t        d       t        d       t               } t        ddt         |       \  }}|dk(  r(|j	                  d      d	k(  rt        d
t         d       yt        dt         d       t        ddt        t
        d| t              \  }}|dk(  s|dk(  r?|j	                  d      }t        d|        t        || t              }|rt        d       y|dk(  rt        d       yt        d|        t        dt        j                  |d              y)zStep 1: Create GCP project=
============================================================zSTEP 1: Create GCP Project<============================================================r2   8https://cloudresourcemanager.googleapis.com/v1/projects/r&   r4   lifecycleStateACTIVEu     ✓ Project z already exists!Tz  Creating project ...POSTz7https://cloudresourcemanager.googleapis.com/v1/projects)	projectIdnamer   r&   r'      rM     Operation started: r3   u#     ✓ Project created successfully!  u+     ✓ Project already exists (409 conflict)u      ✗ Failed to create project:     Error:    indentF)
r=   r   r,   NEW_PROJECT_IDr<   NEW_PROJECT_NAMEOLD_PROJECT_IDrB   r   r   r&   r   r*   r@   r   s        r   step1_create_projectrZ   X   s9   	-	
&'	&M KE
B>BRSLFD }"23x?~..>?@ 
/s
34A'$
 $	LFD }#((6"%gY/0#G5W79};=	,VH
56	K

423
45r   c                     t        d       t        d       t        d       t               } t        ddt         | t              \  }}|dk(  rt        dt                y	t        d
t         d       t        ddt         di | t              \  }}|dk(  r?|j                  d      }t        d|        t        || t              }|rt        d       y	t        d|        t        dt        j                  |d              y)z$Step 1b: Add Firebase to the projectrD   z STEP 1b: Add Firebase to ProjectrE   r2   1https://firebase.googleapis.com/v1beta1/projects/r3   r4   u#     ✓ Firebase already enabled for Tz  Adding Firebase to rJ   rK   z:addFirebaserN   rM   rP   u"     ✓ Firebase added successfully!u     ✗ Failed to add Firebase: rR   rS   rT   F)	r=   r   r,   rV   rX   r<   rB   r   r   rY   s        r   step1b_add_firebaser]      s   	-	
,-	&MKE 
;N;KL$	LFD }3N3CDE 
!.!1
56
;N;K<X$LFD }((6"%gY/0#G5W68	*6(
34	K

423
45r   c                      t        d       t        d       t        d       t               } t        ddt         d| t              \  }}|dk(  rT|j                  d	g       }|r@|d
   j                  d      }t        d|        t        |d
   j                  d      |       S t        dt         d       t        ddt         ddt        i| t              \  }}|dk(  rn|j                  d      }t        d|        t        || t              }|r;|j                  dd      }t        d|j                  d              t        ||       S t        d|        t        dt        j                  |d              y)z Step 1c: Create Firebase Web ApprD   z STEP 1c: Create Firebase Web ApprE   r2   r\   z/webAppsr3   r4   appsr   appIdu     ✓ Web app already exists: rM   z  Creating web app for rJ   rK   displayNamerN   rP    u     ✓ Web app created: u      ✗ Failed to create web app: rR   rS   rT   N)r=   r   r,   rV   rX   r<   get_web_app_configrW   rB   r   r   )r&   r   r*   r_   app_idr@   r   app_names           r   step1c_create_web_apprf      s~   	-	
,-	&MKE 
;N;K8T$	LFD }xx#!W[[)F26(;<%d1gkk&&95AA 
#N#33
78
;N;K8T-.$LFD }((6"%gY/0#G5Wzz&"-H+FJJw,?+@AB%h66	,VH
56	K

423
45r   c           	         | syt        dd|  d|t              \  }}|dk(  r|j                  dd      |j                  d	d      |j                  d
d      |j                  dd      |j                  dd      |j                  dd      d}t        d       |j	                         D ]  \  }}t        d| d|         |S t        d| d|        y)zGet web app Firebase configNr2   r.   /configr3   r4   apiKeyrb   
authDomainrL   storageBucketmessagingSenderIdr`   )ri   rj   rL   rk   rl   r`   u     ✓ Got web app config:    : u     ✗ Failed to get config: r9   )r,   rX   r<   r=   items)re   r&   r   r*   configkvs          r   rc   rc      s    
28*GD$	LFD }hhx,((<4+r2!XXor:!%*=r!BXXgr*
 	)+LLN 	#DAqD2aS/"	#	($
89r   c            	      H   t        d       t        d       t        d       t               } g d}|D ]  }t        d| d       t        ddt         d	| d
i | t              \  }}|dk(  rz|j                  dd      }|rVt        d      D ]H  }t        dd| | t              \  }}|dk(  r|j                  d      r nt        j                  d       J t        d| d       |dk(  rt        d| d       t        d| dt        j                  |      dd          y)z'Enable required APIs on the new projectrD   zSTEP 1d: Enable Required APIsrE   )zfirestore.googleapis.comzidentitytoolkit.googleapis.comzfirebaserules.googleapis.comzfirebase.googleapis.comz  Enabling rJ   rK   z0https://serviceusage.googleapis.com/v1/projects/z
/services/z:enablerN   r4   rM   rb   
   r2   z'https://serviceusage.googleapis.com/v1/r3   r5   rS   u       ✓ z enabledrQ   z already enabledu       ✗ Failed: r9   N)r=   r   r,   rV   rX   r<   r;   r>   r?   r   r   )	r&   apisapir   r*   op_s2r2s	            r   step1d_enable_apisr{      sD   	-	
)*	&MKED  HC5$%>~>NjY\X]]de(
 S=&"%Br "A%e/VWYVZ-[ch  yG  HFBSyRVVF^JJqM	"
 HSE*+s]HSE!123$VHAdjj.>t.D-EFG-Hr   c                  j   t        d       t        d       t        d       t               } d}t        ddt         di | t              \  }}|d	k7  rt        d
|        y|}|j                  dg       }d| }d}|D ]  }|d   dk(  s|} n |r)||j                  dg       vr*|d   j                  |       n|j                  d|gd       ||d<   t        ddt         dd|i| t              \  }}|d	k(  rt        dt                yt        d| dt        j                  |      dd	         y)z&Grant the SA access to the new projectrD   z'STEP 1e: Grant SA Access to New ProjectrE   z,anu2026@insuwiki-j2h.iam.gserviceaccount.comrK   rF   z:getIamPolicyrN   r4   u     ✗ Cannot get IAM policy: FbindingszserviceAccount:Nrolezroles/ownermembers)r~   r   z:setIamPolicypolicyu!     ✓ SA granted owner access to Tu     ✗ Failed to set IAM: r9   )	r=   r   r,   rV   rX   r<   appendr   r   )	r&   sa_emailr   r*   r   r}   	sa_memberowner_bindingbs	            r   step1e_grant_sa_accessr   "  s}   	-	
34	&MKE=H 
B>BRR_`$LFD }-fX67Fzz*b)H "(,IM V9%M
 M--i<<)$++I6!!{
 	
 "F:
B>BRR_`$LFD }1.1ABC)&4::d3CDS3I2JKLr   c            	         t        d       t        d       t        d       t               } t        d       t        ddt         d| t              \  }}|d	k(  rt        d
       nst        ddt         dddiddiddt         dt         ddgd| t              \  }}|d	k(  rt        d       n't        d| dt        j                  |      dd	         t        d       t        ddt         d| t              \  }}|d	k(  rt        d       n[t        ddt         ddddd | t              \  }}|d	k(  rt        d!       n't        d"| dt        j                  |      dd#         t        d$       t        ddt         d%d&dt         dt         ddgi| t              \  }}|d	k(  rt        d'       yt        d(| dt        j                  |      dd	         y))z:Step 2: Setup Firebase Authentication with Google providerrD   z%STEP 2: Setup Firebase AuthenticationrE   z  Enabling Identity Platform...r2   z9https://identitytoolkit.googleapis.com/admin/v2/projects/rh   r3   r4   u*     ✓ Identity Platform already configuredPATCHenabledF)emailphoneNumber	localhost.firebaseapp.comz.web.appz100.76.130.39)signInauthorizedDomainsrN   u"     ✓ Identity Platform configuredu     ✗ Failed: r9   Nz%  Enabling Google Sign-In provider...z&/defaultSupportedIdpConfigs/google.comu$     ✓ Google Sign-In already enabledrK   z,/defaultSupportedIdpConfigs?idpId=google.comTrb   )r   clientIdclientSecretu%     ✓ Google Sign-In provider enabledu'     ✗ Failed to enable Google Sign-In: ,  z  Setting authorized domains...z$/config?updateMask=authorizedDomainsr   u     ✓ Authorized domains setu     ✗ Failed to set domains: r=   r   r,   rV   rX   r   r   r&   r   r*   s      r   step2_setup_authr   ]  sc   	-	
12	&MKE 

+, 
CNCSSZ[$	LFD }:<  GGWW^_ (/$-u#5
  %&&67%&h/#	& (!
$ S=68N6(!DJJt,<Tc,B+CDE 

12 
CNCSSyz$	LFD }46  GGW  XD  E "
 (

 S=9;;F81TZZPTEUVZWZE[D\]^ 

+,
CNCSSwx!""23!"(+	"
 $LFD },.  	-fXQtzz$7G7M6NOPr   c                     t        d       t        d       t        d       t               } t        ddt         d| t              \  }}|dk(  rt        d	       y
t        dt
         d       t        ddt         ddt
        d| t              \  }}|dk(  rA|j                  d      }t        d|        |r t        || t              }|rt        d       y
t        d|        t        dt        j                  |d              y)z!Step 3: Create Firestore databaserD   z!STEP 3: Create Firestore DatabaserE   r2   -https://firestore.googleapis.com/v1/projects/z/databases/(default)r3   r4   u'     ✓ Firestore database already existsTz!  Creating Firestore database in rJ   rK   z/databases?databaseId=(default)FIRESTORE_NATIVE)type
locationIdrN   rM   rP   u!     ✓ Firestore database created!u"     ✗ Failed to create Firestore: rR   rS   rT   F)
r=   r   r,   rV   rX   REGIONr<   rB   r   r   rY   s        r   step3_create_firestorer     s   	-	
-.	&MKE 
77GG[\$	LFD }79 
-fXS
9:
77GGfg& 
 $	LFD }((6"%gY/0'uN[F9;	.vh
78	K

423
45r   c            	         t        d       t        d       t        d       t               } t        j                  j	                  t
        d      }t        |d      5 }|j                         }ddd       t        d|        t        dt               d	       t        d
       t        ddt         dddd|dgii| t              \  }}|dk7  r(t        d| dt        j                  |      dd         y|j                  dd      }t        d|        t        d       dt         d}t        dd| | t              \  }}	|dk(  r t        d d| d!||d"i| t              \  }}n"t        ddt         d#||d"| t              \  }}|dk(  rt        d$       y%t        d&| dt        j                  |      dd         y# 1 sw Y   ]xY w)'z(Step 3b: Deploy Firestore security rulesrD   z(STEP 3b: Deploy Firestore Security RulesrE   firestore.rulesrN  Rules file:   Rules length:  charsz  Creating ruleset...rK   1https://firebaserules.googleapis.com/v1/projects/	/rulesetssourcefilesrM   contentrN   r4   u      ✗ Failed to create ruleset: r9   r   FrM   rb   u     ✓ Ruleset created: z  Deploying ruleset...	projects//releases/cloud.firestorer2   (https://firebaserules.googleapis.com/v1/r3   r   releaserM   rulesetName	/releasesu"     ✓ Rules deployed successfully!Tu     ✗ Failed to deploy rules: )r=   r   ospathjoinINFOKEYWORD_DIRopenr!   lenr,   rV   rX   r   r   r<   
r&   
rules_pathfrules_contentr   r*   ruleset_namerelease_namestatus2resp2s
             r   step3b_deploy_rulesr     s!   	-	
45	&MKE o/@AJ	j#	 !!! 
N:,
'(	S/0
78 

!"
;N;K9U 1#0	
 $LFD" }0$**T:J4C:P9QRS88FB'L	#L>
23 

"#~..GHL 
2<.A$	NGU #~6|nE(#/ (
  ??OyY$+ (	
 }24.vha

48H#8N7OPQY! !s   GGc            	         t        d       t        d       t        d       t               } t        ddt         d| t              \  }}|dk(  r_|j                  d	g       }|D ]H  }|j                  d
g       }|D cg c]  }|j                  d       }}d|v s8d|v s=t        d        y t        d       t        ddt         ddddddddgd| t              \  }}|dk(  r+|j                  d      }t        d|        t        d       y|dk(  rt        d       yt        d| dt        j                  |      dd          y!c c}w )"z(Step 4: Create Firestore composite indexrD   z(STEP 4: Create Firestore Composite IndexrE   r2   r   z9/databases/(default)/collectionGroups/ik_analyses/indexesr3   r4   indexesfields	fieldPathuserId	createdAtu$     ✓ Composite index already existsTzF  Creating composite index: ik_analyses(userId ASC, createdAt DESC)...rK   
COLLECTION	ASCENDING)r   order
DESCENDING)
queryScoper   rN   rM   u     ✓ Index creation started: z+  (Index building may take several minutes)rQ   u      ✓ Index already exists (409)u     ✗ Failed to create index: r9   Nr   F)r=   r   r,   rV   rX   r<   r   r   )	r&   r   r*   r   idxr   r   field_namesr@   s	            r   step4_create_indexr   H  s   	-	
45	&MKE 
77G  HA  	B$	LFD }((9b) 	CWWXr*F7=>!155->K>;&;++E<>	 

RS
77G  HA  	B&&=)LA
 $LFD }((6".wi89;<	302.vha

48H#8N7OPQ? ?s   <Ec           	      N   t        d       t        d       t        d       | st        d       yt        j                  j                  t        d      }t        |d      5 }|j                         }ddd       t        d	       j                         j                  d
      D ]*  }d|v s|j                  d      d   }t        d| d       , |j                         j                  d
      }g }| j                  dd      | j                  dd      | j                  dd      | j                  dd      | j                  dd      | j                  dd      d}|D ]N  }d|v r|j                  d      d   nd}||v r|j                  | d||           ||= >|j                  |       P |j                         D ]  \  }}	|j                  | d|	         d
j                  |      d
z   }
|dz   }t        |d      5 }|j                  |       ddd       t        d|        t        |d      5 }|j                  |
       ddd       t        d       | j                  dd      | j                  dd      | j                  dd      | j                  dd      | j                  dd      | j                  dd      dj                         D ].  \  }}t        |      dkD  r|dd dz   n|}t        d| d|        0 y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w) z1Step 5: Update .env.local with new project configrD   z$STEP 5: Update Environment VariablesrE   u.     ✗ No config available to update .env.localFz
.env.localr   Nz  Current .env.local:
FIREBASE=r   rm   z=***ri   rb   rj   rL   rk   rl   r`   )NEXT_PUBLIC_FIREBASE_API_KEY NEXT_PUBLIC_FIREBASE_AUTH_DOMAINNEXT_PUBLIC_FIREBASE_PROJECT_ID#NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET(NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_IDNEXT_PUBLIC_FIREBASE_APP_IDz.bakwu     ✓ Backed up to u)     ✓ Updated .env.local with new config:rt      rJ   T)r=   r   r   r   r   r   r!   r   splitr<   r   ro   writer   )rp   env_pathr   currentlinekeylines	new_linesfirebase_keysvaluenew_contentbackup_pathrq   rr   maskeds                  r   step5_update_envr   }  s   	-	
01	&M>?ww||O\:H 
h	 &&( 
!#%%d+ $**S/!$CDT"#$ MMO!!$'EI(.

8R(@,2JJ|R,H+1::k2+F/5zz/2/N4:JJ?RTV4W'-zz'2'>M  #$'4Kdjjoa R-uAmC&8%9:;c"T"# $))+ +
UC5%)*+ ))I&-K V#K	k3	 1		}
-. 
h	 	 
57(.

8R(@,2JJ|R,H+1::k2+F/5zz/2/N4:JJ?RTV4W'-zz'2'> eg	#1 #&a&2+2A1QCq!"	# s J 
 s$    L L4LLLL$c           
      ~   t        d       | syt        j                  j                  t        d      }d| j                  dt        dz          d| j                  dt               d	| j                  d
t        dz          d}t        |d      5 }|j                  |       ddd       t        d       y# 1 sw Y   xY w)z5Update .env.local.example with new project referencesz!
  Updating .env.local.example...Fz.env.local.examplez|# Firebase Configuration (InfoKeyword - independent project)
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=rj   r   z!
NEXT_PUBLIC_FIREBASE_PROJECT_ID=rL   z%
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=rk   z.firebasestorage.appzH
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
r   Nu      ✓ Updated .env.local.exampleT)	r=   r   r   r   r   r<   rV   r   r   )rp   example_pathr   r   s       r   step5b_update_env_exampler     s    	
./77<<1EFL""(**\>L^;^"_!` a!!'K!H I J%%+ZZRhAh%i$j k	K 
lC	  A	 
,.	 s   B33B<c            	         t        d       t        d       t        d       t               } t        j                  j	                  t
        d      }t        |d      5 }|j                         }ddd       dv rt        d       t        d	       nt        d
       t        d|        t        dt        |       d       t        d       t        ddt         dddd|dgii|       \  }}|dk7  r(t        d| dt        j                  |      dd         y|j                  dd      }t        d|        dt         d}t        d d!| | "      \  }}	|dk(  rt        d#d!| d$||d%i|       \  }}nt        ddt         d&||d%|       \  }}|dk(  rt        d'       y(t        d)| dt        j                  |      dd         y# 1 sw Y   dxY w)*z3Step 6: Remove ik_ rules from InsuWiki and redeployrD   z7STEP 6: Redeploy InsuWiki Rules (remove ik_ references)rE   r   r   Nik_u@     ⚠ WARNING: InsuWiki firestore.rules contains ik_ references!z  This needs manual review.u4     ✓ InsuWiki firestore.rules has no ik_ referencesr   r   r   z"  Creating ruleset for InsuWiki...rK   r   r   r   r   r   )r   r&   r4   u)     ✗ Failed to create InsuWiki ruleset: r9   r   FrM   rb   u      ✓ InsuWiki ruleset created: r   r   r2   r   rG   r   r   r   r   u-     ✓ InsuWiki rules redeployed successfully!Tu'     ✗ Failed to deploy InsuWiki rules: )r=   r   r   r   r   INSUWIKI_DIRr   r!   r   r,   rX   r   r   r<   r   s
             r   step6_redeploy_insuwiki_rulesr     s3   	-	
CD	&MKE l,=>J	j#	 !!! PQ+,DE	N:,
'(	S/0
78 

./
;N;K9U 1#0	
 LFD  }9&4::dCSTXUXCYBZ[\88FB'L	,\N
;< ~..GHL 
2<.ANGU #~6|nE(#/ 

  ??OyY$+ 
 }=?7xqDAQRVSVAW@XYZY! !s   GGc            
      (   t        d       t        d       t        d       t        d       t        j                  g dt        ddd      } | j                  d	k(  rt        d
       nBt        d       t        d| j
                  dd         t        d| j                  dd         yt        d       t        j                  ddgt        dddi t        j                  ddi      } | j                  d	k(  rYt        d       | j
                  j                  d      D ]/  }d|v sd|v s	d|v sd|v st        d|j                                 1 y t        d       t        d| j
                  dd         t        d| j                  dd         y)!z"Step 7: Build and test InfoKeywordrD   zSTEP 7: Build and TestrE   z  Running npm run build...)npmr
   buildTr   )cwdr   r   timeoutr   u     ✓ npm run build succeeded!u     ✗ npm run build failed:z    stdout: iNz    stderr: )FFz  Running npm test...r   testCItrue)r   r   r   r   envu     ✓ npm test passed!r   zTests:zTest Suites:PASSFAILrm   u     ✗ npm test failed:)TF)TT)r=   r	   r
   r   
returncoder   stderrr   environr   r   )r   r   s     r   step7_build_and_testr   5  s   	-	
"#	&M 

&'^^F A./+-V]]451234V]]451234 

!"^^	(rzz(4(F A&'MM''- 	-D4>T#9Vt^vY]~TZZ\N+,	-  	&(V]]451234V]]451234r   c                      t        d       t               } t        ddt         dddi| t              \  }}|dk(  rt        d	       y
t        d| dt        j                  |      dd         y)z#Link billing account to new projectz
  Linking billing account...PUTz0https://cloudbilling.googleapis.com/v1/projects/z/billingInfobillingAccountNamez$billingAccounts/01F099-BCE8BC-89A521rN   r4   u     ✓ Billing account linkedTu     ✗ Failed to link billing: r9   NFr   r   s      r   link_billing_accountr   f  s    	
*+KE
:>:J,W "H
 $LFD },..vha

48H#8N7OPQr   c            	         t        d       t        d       t        d       t        dt                t        dt                t        dt                i } d }t	               | d<   | d   st        d       t        d       t        d	       t        d
       t        d       t        dt
                t        dt                t        d       d}t        |d      5 }t        j                  | |d       d d d        | S t                t               | d<   | d   st        d       | S t               }|d u| d<   t                t                t               | d<   t               | d<   | d   rt!               | d<   | d   rt#               | d<   |rt%        |      | d<   t'        |       t)               | d<   |rt+               \  }}|| d<   || d<   t        d       t        d       t        d       | j-                         D ]  \  }}|rd nd!}t        d"| d#| d$|        ! d}t        |d      5 }t        j                  | |dt.        %       d d d        t        d&|        |r=d'}	t        |	d      5 }t        j                  ||d       d d d        t        d(|	        | S # 1 sw Y   | S xY w# 1 sw Y   exY w# 1 sw Y   2xY w))NrE   u2   InfoKeyword Firebase 프로젝트 분리 자동화zNew Project: zOld Project: zRegion: project_createu$   
⚠ GCP 프로젝트 생성 실패!uc   서비스 계정으로는 조직이 없는 환경에서 프로젝트를 생성할 수 없습니다.u0   수동으로 프로젝트를 생성해주세요:u0     1. https://console.firebase.google.com/ 접속u!     2. '프로젝트 추가' 클릭u     3. 프로젝트 이름: u     4. 프로젝트 ID: u>   
수동 생성 후 이 스크립트를 다시 실행하세요.z9/home/jay/workspace/teams/dev2/firebase-setup-result.jsonr   rS   rT   firebase_adduA   
⚠ Firebase 추가 실패. 나머지 단계를 건너뜁니다.web_app_config
auth_setupfirestore_createrules_deployindex_create
env_updateinsuwiki_redeployr   r   rD   SUMMARYu   ✓u   ✗z  r9   rn   )rU   defaultz
Results saved to z3/home/jay/workspace/teams/dev2/firebase-config.jsonzConfig saved to )r=   rV   rX   r   rZ   rW   r   r   dumpr   r]   rf   r{   r   r   r   r   r   r   r   r   r   ro   str)
resultsrp   results_pathr   build_oktest_okr   r   r   config_paths
             r   mainr  |  s   	(O	
>?	(O	M.)
*+	M.)
*+	HVH
GF !5 6G#$56st@A@B13*+;*<=>&~&678OP S,$ 	,IIgq+	,   23GN>"RS #$F &d 2G   -.GL #9":G !""5"7 !""4"6  0 8!&) $A#BG  02'#! 
/	)	(Ommo ,
UU6(!C55'*+,
 OL	lC	  5A		'1Q45	~
./ K+s# 	+qIIfa*	+ ./NU	, x5 5	+ 	+s$   "J(3J57K(J25J>K
__main__)NNN)NN)$__doc__r   r   r	   sysr>   urllib.requestr   urllib.errorrV   rW   rX   r   r   r   SA_KEY_FILEr   r,   rB   rZ   r]   rf   rc   r{   r   r   r   r   r   r   r   r   r   r   r  __name__ r   r   <module>r     s     	  
    #  	2,X!82@-^(T,\:$HL9vcJ,\Vp3jFP0Vp/b,dL zF r   