
    &id<                    ~   S r SSKJr  SSKrSSKJrJr  SSKJr  SSKr	SSK
Jr  SSKJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJrJrJr  SSKJr  SSKJrJrJrJ r J!r!J"r"J#r#  \RH                  " \%5      r&\#RN                  SS.r(\#RR                  SS.r*\#RV                  SS.r,\#RZ                  SS.r.\#R^                  SS.r0\*\.\0/r1\.\0/r2\(\,\.\0/r3\	Rh                  " \	R&                  " \5      \5\	R&                  " \5      \505      r6 " S S5      r7 " S S\7\Rp                  \S9r8 " S S\7\Rr                  5      r9g)z(Config flow for AC Infinity integration.    )annotationsN)datetime	timedelta)Any)config_entries)
CONF_EMAILCONF_PASSWORD)callback)selector)Required)ACInfinityDataUpdateCoordinator)ACInfinityClientACInfinityClientCannotConnectACInfinityClientInvalidAuth   )ACInfinityService)ConfigurationKeyDEFAULT_POLLING_INTERVALDOMAINHOSTControllerPropertyKeyDevicePropertyKeyEntityConfigValuezSensors, Controls, and SettingsvaluelabelzSensors and SettingszSensors and ControlszSensors OnlyDisablec                  J    \ rS rSrSr\SS j5       r S       S	S jjrSrg)
ACInfinityFlowBase?   z4Base class for AC Infinity config and options flows.c                Z    U c  [         R                  $ U [        R                     U   U   $ )z<Get saved entity configuration value from config entry data.)r   SensorsOnlyr   ENTITIES)data	device_identity_config_keys      4/config/custom_components/ac_infinity/config_flow.py__get_saved_entity_conf_value0ACInfinityFlowBase.__get_saved_entity_conf_valueB   s6     <$000 !**+I67HI	
    Nc                   UR                  U[        R                  5      nUR                  U[        R                  5      nUR                  U[        R                  5      n0 nUUS.n[        S[        SS.05      U[        R                  " SU R                  U[        U5      S5      S9'   [        S[        SS.05      U[        R                  " SU R                  U[        U5      S5      S9'   [        SUS-   5       Hm  n	S	U	 3n
UR                  X)[        R                  5      X'   [        S[         SS.05      U[        R                  " XR                  U[        U5      U
5      S9'   Mo     Xx4$ )
zBuild the entity configuration schema and description placeholders.

Args:
    ac_infinity: The AC Infinity service instance
    device_id: The device ID to build config for

Returns:
    Tuple of (entities schema dict, description_placeholders dict)
)
controllerdevice_codeselectdropdown)optionsmoder,   defaultsensorsr   port_)get_controller_propertyr   DEVICE_NAMEDEVICE_CODE
PORT_COUNTr    ENTITY_CONFIG_OPTIONS_CONTROLLERvolr   0_ACInfinityFlowBase__get_saved_entity_conf_valuestrENTITY_CONFIG_OPTIONS_SENSORSrangeget_device_propertyr   NAMEENTITY_CONFIG_OPTIONS_DEVICES)selfac_infinityr%   r$   device_namer-   
port_countentitiesdescription_placeholdersir&   s              r'   _build_entity_config_schema.ACInfinityFlowBase._build_entity_config_schemaM   s    "99)EZEfEfg!99)EZEfEfg 88DYDdDde
%&$
  mu?&m 	LL!%!C!CD#i.Zf!gi	j u}8"~
 u 	LLD,N,NtUXYbUcen,op	r q*q.)A"'s:E:Y:YZchyh~h~:$7 NV#@ *NHS\\"3=_=_`dfijsft  wH  >I  J  K * 11r*    )r$   dict[str, Any] | Noner%   r=   r&   r=   N)rD   r   r%   z	str | intr$   rM   returnz*tuple[dict[Required, Any], dict[str, str]])	__name__
__module____qualname____firstlineno____doc__staticmethodr<   rJ   __static_attributes__rL   r*   r'   r   r   ?   sL    >
 
 '+	62&62 62 $	62
 
462 62r*   r   c                  j    \ rS rSrSrSrS r\\    SS j5       5       r	SSS jjr
SSS jjrS	 rS
rg)
ConfigFlow   z%Handle a config flow for AC Infinity.   c                X    SU l         SU l        SU l        SU l        SU l        0 U l        g)zInitialize the config flow.Nr   )usernamepasswordrD   
device_idsdevice_indexrG   rC   s    r'   __init__ConfigFlow.__init__   s0     %)$(59,0!"(*r*   c                    [        5       $ )zCreate the options flow.)OptionsFlow)config_entrys    r'   async_get_options_flow!ConfigFlow.async_get_options_flow   s     }r*   Nc                f  #    0 nUb  [        [        U[           U[           5      n UR	                  5       I Sh  vN   U[           U l        U[           U l        [        U5      U l        U R                  R                  5       I Sh  vN   U R                  R                  5       U l        SU l        U R                  b  [        U R                  5      S:X  a  U R                  SS9$ U R                  5       I Sh  vN $ U R-                  S
[.        US9$  N N N! [          a!    UR#                  5       I Sh  vN    SUS'    NE[$         a!    UR#                  5       I Sh  vN    SUS'    Nn[&         a6    [(        R+                  S5        UR#                  5       I Sh  vN    S	US'    Nf = f7f)zHandle the initial step.Nr   
no_devicesreasoncannot_connectbaseinvalid_authUnexpected exceptionunknownuserstep_iddata_schemaerrors)r   r   r   r	   loginr\   r]   r   rD   refreshget_device_idsr^   r_   lenasync_abortasync_step_enable_entitiesr   closer   	Exception_LOGGER	exceptionasync_show_formCONFIG_SCHEMA)rC   
user_inputru   clients       r'   async_step_userConfigFlow.async_step_user   s     "$!%j,j.GF+lln$$ *: 6 *= 9#4V#< &&..000"&"2"2"A"A"C$%!??*c$//.Ba.G++<+@@!<<>>> ##f $ 
 	
5 %
 1 ?0 2lln$$!1v. 0lln$$!/v +!!"89lln$$!*v+s   %F1D DAD 	D
AD (F1)D <D=D  F1D D D F.9D<:
F.F1F."E%#
F.-F1/1F. F#!
F.+F1-F..F1c                h  #    U R                   b  U R                  c$  [        R                  S5        U R	                  SS9$ [        U R                  U R                     5      n0 nUb  XR                  [        U5      '   U R                  [        U R                  5      S-
  :  a-  U =R                  S-  sl        U R                  5       I S h  vN $ U R                  5       I S h  vN $ U R                  U R                   U5      u  pEU R                  S[        R                  " U5      UUS9$  N` NJ7f)Nz&AC Infinity service is not initializednot_initializedrj   r   enable_entitiesrs   rt   ru   rH   )rD   r^   r~   errorrz   r=   r_   rG   ry   r{   async_create_config_entryrJ   r   r;   Schema)rC   r   r%   ru   rG   rH   s         r'   r{   %ConfigFlow.async_step_enable_entities   s    #t'>MMBC##+<#==T__T->->?@	!#!,6MM#i.)  3t#7!#;;!!Q&!!<<>>> ";;===-1-M-M.
*
 ##%

8,%=	 $ 
 	
 ? >s%   CD2D.D2%D0&A	D20D2c                  #    U R                   (       a"  U R                   R                  5       I S h  vN   U R                  SU R                   35      I S h  vN   U R	                  5         U R                  SU R                   S3[        U R                  [        U R                  [        R                  [        [        R                  U R                  [        R                  [        R                   " 5       R#                  5       0S9$  N N7f)Nzac_infinity-zAC Infinity ()titler$   )rD   r|   async_set_unique_idr\   _abort_if_unique_id_configuredasync_create_entryr   r	   r]   r   POLLING_INTERVALr   r#   rG   MODIFIED_ATr   now	isoformatr`   s    r'   r   $ConfigFlow.async_create_config_entry   s     ""((***&&dmm_'EFFF++-&&!$--2DMMt}} 113K ))4== ,,hlln.F.F.H: ' 
 	
 +Fs"   /DD	%DDB2DD)rD   r^   r_   rG   r]   r\   )re   zconfig_entries.ConfigEntryrO   zconfig_entries.OptionsFlowrN   r   rM   )rP   rQ   rR   rS   rT   VERSIONra   rU   r
   rf   r   r{   r   rV   rL   r*   r'   rX   rX      sK    /G+ 4	#  '
R
<
r*   rX   )domainc                  x    \ rS rSrS rSSS jjrSSS jjrSSS jjrSSS jjrS r	S	 r
S
 rSS jrSS jrSrg)rd      c                    SU l         g)zInitialize the options flow.r   Ncurrent_device_idr`   s    r'   ra   OptionsFlow.__init__   s     -.r*   Nc                .   #    U R                  SSS/S9$ 7f)zManage the options.initgeneral_configcontroller_selectrs   menu_optionsasync_show_menu)rC   r   s     r'   async_step_initOptionsFlow.async_step_init   s)     ##*:<O)P $ 
 	
   c                  #    0 nUGb  UR                  [        R                  [        5      nUR                  [        R                  S 5      nUS:  a  SU[        R                  '   U(       aw  U R
                  R                  [           n[        [        UU5      n UR                  5       I S h  vN   UR                  5       I S h  vN nUR#                  5       I S h  vN   U(       d  U R
                  R                  R%                  5       nX8[        R                  '   U(       a  XH[&        '   U R)                  U5        U R*                  R                  [,           U R
                  R.                     n	[1        US9U	l        [        R5                  SU5        U(       a  U R7                  5       I S h  vN $ U R9                  S	0 S
9$ U R;                  S[<        R>                  " [<        R@                  " [        R                  U RC                  [        R                  [        5      S9[D        [<        RF                  " [        R                  5      [H        05      US9$  GN GN! [         a    SU[        R                  '    GN[         a    SU[        R                  '    GN[         a,    [        R!                  S5        SU[        R                  '    GNf = f GN! UR#                  5       I S h  vN    f = f GNI7f)N   invalid_polling_intervalrl   rn   ro   rp   )secondsz&Polling Interval changed to %s seconds r   r   r2   rr   )%getr   r   r   UPDATE_PASSWORDre   r$   r   r   r   rv   get_account_controllersr   r   r}   r~   r   r|   copyr	   &_OptionsFlow__update_config_entry_datahassr   entry_idr   update_intervalinfoasync_step_notify_restartr   r   r;   r   r   "_OptionsFlow__get_saved_conf_valueintOptionalr=   )
rC   r   ru   polling_intervalr]   emailr   _new_datacoordinators
             r'   async_step_general_config%OptionsFlow.async_step_general_config  s|    !#!)~~ 113K  $.>>2B2R2RTX#YH!#<V'889))..z: *) ,,.(($<<>>A !,,.((,,11668>N)::;.6]+//9?Cyy~~f?U%%..@ /8@P.Q+EGWX!%!?!?!AAA..Rb.AA##$

LL!1!B!B)-)D)DEUEfEfE]*_`adLL!1!A!ABC	  $ 
 	
A )>4 P?OF+;;<2 N?MF+;;<  I%%&<=?HF+;;<I )&,,.((& Bs   BK?I$ /I0I$ I!I$ K?K CK?3K<4B*K?I$ !I$ $KK K K #1KK KK K?K92K53K99K?c                  #    Ub"  US   U l         U R                  5       I S h  vN $ U R                  R                  [           U R
                  R                     nUR                  R                  5       nU(       d  U R                  SS9$ / nU Hp  nUR                  R                  U[        R                  5      nUR                  R                  U[        R                  5      nUR                  XW SU S3S.5        Mr     U R                  S[         R"                  " [         R$                  " S5      ['        SS	U005      05      S
9$  GN(7f)Nr%   ri   rj   z (r   r   r   r.   r0   )rs   rt   )r   r{   r   r$   r   re   r   rD   rx   rz   r6   r   r8   r7   appendr   r;   r   r   r   )rC   r   r   r^   r0   r%   r-   rE   s           r'   async_step_controller_select(OptionsFlow.async_step_controller_selectF  s?    !%/%<D"88:::7;yy~~f7M&&8
 !,,;;=
##<#88#I%11II)UjUvUvwK%11II)UjUvUvwKNNY=;-WX9YZ[	 $ ##'

[)8!75 ,$  $ 	
 		
# ;s   !EED(Ec                  #    0 nU R                   nUb  U R                  R                  R                  5       n[        R
                  U;  a  0 U[        R
                  '   X[        R
                     [        U R                   5      '   U R                  U5        U R                  5       I S h  vN $ U R                  R                  [           U R                  R                     R                  nU R                  UU[        U R                  R                  5      5      u  pgU R                  S[         R"                  " U5      UUS9$  N7f)Nr   r   )r   re   r$   r   r   r#   r=   r   r   r   r   r   rD   rJ   dictr   r;   r   )rC   r   ru   r%   r   rD   rG   rH   s           r'   r{   &OptionsFlow.async_step_enable_entitiese  s$    !##55	!((--224H((868)223OY%../D4J4J0KL++H577999)-)?&&*

+ 	 .2-M-M""''(.
* ##%

8,%=	 $ 
 	
 :s   B)E+E,BEc                .   #    U R                  SSS/S9$ 7f)Nnotify_restartrestart_yes
restart_nor   r   r`   s    r'   r   %OptionsFlow.async_step_notify_restart  s'     ##$M<3P $ 
 	
r   c                   #    U R                   R                  R                  SS5      I S h  vN   U R                  S0 S9$  N7f)Nhomeassistantrestartr   r   )r   services
async_callr   rC   r   s     r'   async_step_restart_yes"OptionsFlow.async_step_restart_yes  sA     ii  ++OYGGG&&Rb&99 	Hs   *AAAc                *   #    U R                  S0 S9$ 7f)Nr   r   )r   r   s     r'   async_step_restart_no!OptionsFlow.async_step_restart_no  s     &&Rb&99s   c                    [         R                  " 5       R                  5       U[        R                  '   U R
                  R                  R                  U R                  US9  g)z1Update config entry data with modified timestamp.)r$   N)	r   r   r   r   r   r   r   async_update_entryre   )rC   r   s     r'   __update_config_entry_data&OptionsFlow.__update_config_entry_data  sK    191I1I1K!--.		  33 	4 	
r*   c                    XR                   R                  ;   a3  U R                   R                  U   b  U R                   R                  U   $ U$ rN   )re   r$   )rC   conf_keyr3   s      r'   __get_saved_conf_value"OptionsFlow.__get_saved_conf_value  sR     ,,111!!&&x0< ""8,	
 		
r*   r   rN   r   )r   zdict[str, Any]rO   None)r   r=   )rP   rQ   rR   rS   ra   r   r   r   r{   r   r   r   r   r   rV   rL   r*   r'   rd   rd      s6    .

A
F
>
>

::

r*   rd   ):rT   
__future__r   loggingr   r   typingr   
voluptuousr;   r   r   homeassistant.constr   r	   homeassistant.corer
   homeassistant.helpers.selectorr   r   custom_components.ac_infinityr   $custom_components.ac_infinity.clientr   r   r   r   r   constr   r   r   r   r   r   r   	getLoggerrP   r~   AllOPTION_ALL_ENTITIESSensorsAndSettingsOPTION_SENSORS_AND_SETTINGSSensorsAndControlsOPTION_SENSORS_AND_CONTROLSr"   OPTION_SENSORS_ONLYr   OPTION_DISABLEr:   r>   rB   r   r=   r   r   rX   rd   rL   r*   r'   <module>r      sW   . "  (   ( 9 ' 3  I 
     

H
% !2 5 5@ab (9(L(LWmn (9(L(LWmn  1 = =W ,44yI  $   !  	!  

\\*sCLL$?E
D2 D2Nm
#^%>%>v m
`h
$n&@&@ h
r*   