
    a(                        d Z ddlmZ ddlmZ ddlmZ ddlZddlmZ ddlm	Z	 ddlm
Z dd	lmZ dd
lmZ ddlmZ ddlmZ ddl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.dZ#d Z$d Z%d Z&d Z'd  Z(d! Z)d" Z*d# Z+ G d$ d%ejX                        Z-d& Z. G d' d(ejX                        Z/d) Z0 G d* d+ejX                        Z1d, Z2d- Z3y)/z"hooks for billing budgets surface.    )absolute_import)division)unicode_literalsN)extra_types)apis)messages)base)
exceptions)yaml)timesc                 @    t        j                  dt        |             S Nbillingbudgets)r   GetMessagesModuleGetApiVersionargss    6lib/googlecloudsdk/command_lib/billingbudgets/hooks.pyr   r   "   s    			 0-2E	FF    c                 .    t        j                  d|       S r   )r   r   )versions    r   GetMessagesModuleForVersionr   &   s    			 0'	::r   c                     t        | d      r6| j                  j                         t        j                  j                  k(  ryy)Ncalliope_commandv1v1beta1)hasattrr   ReleaseTrackcalliope_baseGAr   s    r   r   r   *   s:    T%&4+@+@+M+M ,!!$$,%r   c                 f    t        |       }|dk(  r|j                  S |j                  j                  S Nr   )r   !googleCloudBillingBudgetsV1Budget3googleCloudBillingBudgetsV1beta1CreateBudgetRequestbudgetr   reqr   s      r   GetVersionedCreateBillingBudgetr(   2   1    $'_000BBIIIr   c                 f    t        |       }|dk(  r|j                  S |j                  j                  S r"   )r   r#   3googleCloudBillingBudgetsV1beta1UpdateBudgetRequestr%   r&   s      r   GetVersionedUpdateBillingBudgetr,   :   r)   r   c                 0    t        d      }t        | |      S )z:Convert the input to Money Type for v1beta1 Create method.r   r   
ParseMoneymoneyr   s     r   CreateParseToMoneyTypeV1Beta1r2   B       (3(	E8	$$r   c                 0    t        d      }t        | |      S )z5Convert the input to Money Type for v1 Create method.r   r.   r0   s     r   CreateParseToMoneyTypeV1r5   H       (.(	E8	$$r   c                 0    t        d      }t        | |      S )z:Convert the input to Money Type for v1beta1 Update method.r   r.   r0   s     r   UpdateParseToMoneyTypeV1Beta1r8   N   r3   r   c                 0    t        d      }t        | |      S )z5Convert the input to Money Type for v1 Update method.r   r.   r0   s     r   UpdateParseToMoneyTypeV1r:   T   r6   r   c                 0    t        d      }t        | |      S )z9Convert the input to Date Type for v1beta1 Create method.r   r   	ParseDatedater   s     r   CreateParseToDateTypeV1Beta1r@   Z       (3(	4	""r   c                 0    t        d      }t        | |      S )z4Convert the input to Date Type for v1 Create method.r   r<   r>   s     r   CreateParseToDateTypeV1rC   `       (.(	4	""r   c                 0    t        d      }t        | |      S )z9Convert the input to Date Type for v1beta1 Update method.r   r<   r>   s     r   UpdateParseToDateTypeV1Beta1rF   f   rA   r   c                 0    t        d      }t        | |      S )z4Convert the input to Date Type for v1 Update method.r   r<   r>   s     r   UpdateParseToDateTypeV1rH   l   rD   r   c                 L   t        |        d}t        j                  d| dd       r| dd }|rt        j                  d| dd d      nt        j                  d|       }|d   rt	        |d         nd}t        |      dkD  rt	        |d         }nd}|j                  |||      S )	z)Validate input and convert to Money Type. z[A-Za-z]{3}Nz\.   r   )unitsnanoscurrencyCode)CheckMoneyRegexrematchsplitintlenGoogleTypeMoney)r1   r   currency_codemoney_arrayrM   rN   s         r   r/   r/   r   s    %-XXneBCj)"#JM(5bhhueCRj!$288
<  "-Q#k!n
Q%AEE		!	!] 
" 
< <r   c                     t        j                  | |      }|j                  |j                  |j                  |j
                        S )zConvert to Date Type.)fmt)yearmonthday)r   ParseDateTimeGoogleTypeDater[   r\   r]   )r?   r   rZ   datetime_objs       r   r=   r=      sG    $$Ts3,		 	 L$6$6L<L<L 
! 
N Nr   c                 ~   t        |      }t        |      }t        j                  d|      }|j                  }|j
                  } |t        j                  | j                                     }|j                  |      j                  }	|j                  d      rg }	|	t        ||      _
        |j                  d      r+|j                  }
t        |	|
      }|t        ||      _
        |S |j                  d      rt        j                   |j"                        }|dk(  rBt%        j&                  d|i|j(                        }|j*                  xj,                  dz  c_        n"t%        j&                  d|i|j.                        }|j0                  xj,                  dz  c_        |j                  t        ||      _
        |S )	zAdd threshold rule to budget.r   )nameclear_threshold_rulesadd_threshold_rulethreshold_rules_from_filer   thresholdRulesz,thresholdRules)r   r   r   GetClientInstancebillingAccounts_budgets.BillingbudgetsBillingAccountsBudgetsGetRequestsix	text_typeRelativeNameGetrf   IsSpecifiedr,   rd   AddRulesr   loadre   messages_utilDictToMessageWithErrorCheck!GoogleCloudBillingBudgetsV1Budgetr#   
updateMask&GoogleCloudBillingBudgetsV1beta1Budgetr+   )refr   r'   r   r   clientbudgetsget_request_typeget_requestold_threshold_rulesadded_threshold_rulesfinal_rulesrules_from_filer%   s                 r   UpdateThresholdRulesr      s   t$($'!!"2G<&**'LL cmmC4D4D4F&GH+K0??	-.:M $D$'))7	*+ 33.0EFK@K#D#.=J	12ii > >?O$88_
-

4
46f 
++66:KK688_
-

9
9;f ;;FFJ[[F ;A:O:O $D$'))7	*r   c                 D    | }|D ]  }|| vs|j                  |        |S )N)append)	old_rulesrules_to_addall_threshold_rulesrules       r   ro   ro      s0    !d9  &  
r   c                 @    t        d      j                  }| r |       S y )Nr   )r   0GoogleCloudBillingBudgetsV1beta1LastPeriodAmountuse_last_period_amountr   s     r   LastPeriodAmountV1Beta1r      s(    (AA : r   c                 @    t        d      j                  }| r |       S y r"   )r   +GoogleCloudBillingBudgetsV1LastPeriodAmountr   s     r   LastPeriodAmountV1r      s(    (
77 : r   c                 t    ~ |j                  d      r%d|j                  j                  j                  _        |S Nall_updates_rule_pubsub_topic1.0)rn   r$   r%   allUpdatesRuleschemaVersionrv   r   r'   s      r   CreateAllUpdatesRuler      3    		56bgC;;BBQQ_	*r   c                 `    ~ |j                  d      rd|j                  j                  _        |S Nnotifications_rule_pubsub_topicr   rn   r#   notificationsRuler   r   s      r   CreateNotificationsRuler      -    		78LQC));;I	*r   c                 t    ~ |j                  d      r%d|j                  j                  j                  _        |S r   )rn   r+   r%   r   r   r   s      r   UpdateAllUpdatesRuler      r   r   c                 `    ~ |j                  d      rd|j                  j                  _        |S r   r   r   s      r   UpdateNotificationsRuler      r   r   c                       e Zd ZdZy)InvalidBudgetCreditTreatmentzEError to raise when credit treatment doesn't match the credit filter.N__name__
__module____qualname____doc__ r   r   r   r      s    Mr   r   c                     |j                  d      xr |j                  dk(  }|j                  d      xr |j                  }|r|st        d      |s|rt        d      |S )z:Validates credit treatment matches credit types in filter.credit_types_treatmentzinclude-specified-creditsfilter_credit_typesz^'--filter-credit-types' is required when '--credit-types-treatment=include-specified-credits'.zg'--credit-types-treatment' must be 'include-specified-credits' if '--filter-credit-types' is specified.)rn   r   r   r   )
unused_refr   r'   budget_tracks_creditspopulated_credits_filters        r   ValidateCreditTreatmentr      s    **+CD B
!!%@@ !-- :!%!9!9 #;
&	@A A 
#;
&	01 1 
*r   c                       e Zd ZdZy)InvalidBudgetAmountInputz4Error to raise when user input does not match regex.Nr   r   r   r   r   r      s    <r   r   c                 p    t        j                  d      }t        j                  ||       st        d      y )Nz^[0-9]*.?[0-9]+([a-zA-Z]{3})?$zoThe input is not valid for --budget-amount. It must be an int or float with an optional 3-letter currency code.)rQ   compilerR   r   )input_stringaccepted_regexs     r   rP   rP     s9    ::?@.	.,	/
"	NO O 
0r   c                       e Zd ZdZy)InvalidLabelInputz2Error to raise when user label input is not valid.Nr   r   r   r   r   r     s    :r   r   c                     ~ |j                  d      rMt        |      }t        ||      }|j                  |g      t	        ||      j
                  j                  _        |S )z!Adds labels to an Update request.filter_labels)additionalProperties)rn   r   CreateLabelsLabelsValuer,   budgetFilterlabelsr   )rv   r   r'   r   additional_propertys        r   UpdateParseLabelsr     sh    		o& &H&tX6 9A8L8L"5!6 9M 98 $\&&!5	*r   c                 V   t        j                  | j                        }t        |      dkD  rt	        d      t        |j                               d   }t        ||         dkD  rt	        d      ||   d   }|j                  j                  |t        j                  |      g      S )z"Parses and validates labels input.rL   zLThe input is not valid for `--filter-labels`. It must be one key/value pair.r   zPThe input is not valid for `--filter-labels`. It must be one key with one value.)string_value)keyvalue)r   rp   r   rU   r   listkeysr   AdditionalPropertyr   	JsonValue)r   r   labels_dictr   r   s        r   r   r     s    		$,,-+
 = > >[ ##S	Q
 A B B
c
1
%				0	0
k++?@ 
1 
B Br   )z%Y-%m-%d)4r   
__future__r   r   r   rQ   apitools.base.pyr   googlecloudsdk.api_lib.utilr   r   rq   googlecloudsdk.callioper	   r   googlecloudsdk.corer
   r   googlecloudsdk.core.utilr   rj   r   r   r   r(   r,   r2   r5   r8   r:   r@   rC   rF   rH   r/   r=   r   ro   r   r   r   r   r   r   Errorr   r   r   rP   r   r   r   r   r   r   <module>r      s    ) &  ' 	 ( , A 9 * $ * 
G;JJ%%%%####<$N(V:#3#3 
"z// 
O
(( 

Br   