
    =[j@                       d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,  ed          Z- G d d          Z.dS )z2Read-side orchestration for the Reminders service.    )annotationsN)AnyCallableDictIterableListOptionalTypeVar)
CKErrorItem	CKFVInt64CKFVReferenceCKQueryFilterByCKQueryObjectCKRecordCKReferenceCKTombstoneRecordCKZoneChangesZoneCKZoneChangesZoneReq   )_REMINDERS_ZONE_REMINDERS_ZONE_REQ)
AttachmentRemindersRecordMapper_as_record_name)_assert_read_success)RemindersApiError)	AlarmAlarmWithTriggerHashtagListRemindersResultLocationTriggerRecurrenceRuleReminderReminderChangeEventRemindersListTRelatedc                      e Zd ZdZdSd
ZdddddTdZdUdZdVdWdZdXdZdddYd Z	dZd#Z
d[d+Zed\d2            Zd]dAZ	 	 d^d_dIZd`dLZdadNZdbdPZdcdRZdS )dRemindersReadAPIz;Encapsulates read/query behavior for the Reminders service.get_rawCallable[[], Any]mapperr   loggerlogging.LoggerreturnNonec                0    || _         || _        || _        d S N)_get_raw_mapper_logger)selfr*   r,   r-   s       j/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/pyicloud/services/reminders/_reads.py__init__zRemindersReadAPI.__init__,   s          N)desired_keys
sync_tokenreversedesired_record_typesOptional[List[str]]r:   r;   Optional[str]r<   Optional[bool]Iterable[CKZoneChangesZone]c          	   #    K   |}d}|ry|                                                      t          t          ||||                    }|j        sdS d}|j        D ]#}|V  |j        }|pt          |j                  }$|wdS dS )zAYield paged /changes/zone results, advancing the zone sync token.T)zoneIDdesiredRecordTypesdesiredKeysr<   	syncToken)zone_reqNF)r3   changesr   r   zonesrF   bool
moreComing)	r6   r=   r:   r;   r<   next_sync_tokenmore_comingresponsezones	            r7   _iter_zone_change_pagesz(RemindersReadAPI._iter_zone_change_pages6   s       % 	C}}..-*'; ,#-   /  H > K  C C


"&.)BT$/-B-B#  	C 	C 	C 	C 	Cr9   Iterable[RemindersList]c              #     K   |                      dg          D ]^}t          |j        d           |j        D ]?}t          |t                    r|j        dk    r#| j                            |          V  @_dS )z)Fetch reminders lists as a full snapshot.r   )r=   zFetch reminder listsN)rP   r   records
isinstancer   
recordTyper4   record_to_list)r6   rO   recs      r7   listszRemindersReadAPI.listsU   s      00vh0OO 	7 	7D /EFFF| 7 7!#x00 CNf4L4Ll11#6666667	7 	7r9   list_idIterable[Reminder]c              #     K   i }|r|g}nd |                                  D             }|D ].}|                     |dd          }|j        D ]}|||j        <   /|                                D ]}|V  dS )z@Fetch reminders as a full snapshot, optionally filtered by list.c                    g | ]	}|j         
S  id).0lsts     r7   
<listcomp>z.RemindersReadAPI.reminders.<locals>.<listcomp>f   s    7773777r9   T   )rY   include_completedresults_limitN)rX   list_reminders	remindersr_   values)r6   rY   reminder_maplist_idslidbatchreminders          r7   rg   zRemindersReadAPI.reminders^   s      ,.  	8yHH77$**,,777H 	5 	5C''"&! (  E
 "O 5 5,4X[))5 %++-- 	 	HNNNN	 	r9   strc                    |                                                      t                    }|r|S d}|                     g g d          D ]	}|j        }
|r|S t          d          )z;Return the latest usable sync token for the Reminders zone.)zone_idNF)r=   r:   r<   z.Unable to obtain sync token for Reminders zone)r3   current_sync_tokenr   rP   rF   r   )r6   query_tokenr;   rO   s       r7   sync_cursorzRemindersReadAPI.sync_cursort   s    mmoo88AT8UU 	$(
00!# 1 
 
 	( 	(D
 JJ 	 PQQQr9   )sincert   Iterable[ReminderChangeEvent]c             #  (  K   |                      dg|d          D ]}|j        D ]}t          |t                    rK|j        dk    r#| j                            |          }|j        rdnd}t          ||j	        |          V  bt          |t                    rt          d|j        d          V  t          |t                    rE|j        pd}|j        pd	}t          d
| d|j         d| d|j        |j        |j        d          dS )z6Iterate reminder changes since an optional sync token.r$   F)r=   r;   r<   deletedupdated)typereminder_idrm   Nz<unknown record>zno reason providedz&Iterating reminder changes failed for z: z ())
recordNameserverErrorCodereason)payload)rP   rS   rT   r   rU   r4   record_to_reminderrw   r%   r_   r   r|   r   r~   r   r}   )r6   rt   rO   rW   rm   evt_typerecord_namer~   s           r7   iter_changeszRemindersReadAPI.iter_changes   s      00", 1 
 
 &	 &	D
 | ! !c8,, ~33 #|>>sCCH,4,<Kyy)H-%$,K!)     
 c#455 -&$'N!%     
 c;// "%."F4FK Z?+?F+K&K K*-*=K KAGK K K +../2/B&)j! !   -!&	 &	r9   rz   r$   c                f   t          |d          }|                                                     |gt                    }t	          |j        d           d}|j        D ]&}t          |t                    r|j        |k    r|} n'|st          d|           | j
                            |          S )zFetch a single reminder by ID.r$   record_namesrp   zLookup reminderNzReminder not found: )r   r3   lookupr   r   rS   rT   r   r|   LookupErrorr4   r   )r6   rz   r   resptargetrW   s         r7   getzRemindersReadAPI.get   s    %k:>>}}%%%' & 
 
 	T\+<===< 	 	C#x(( S^{-J-J 	DB[BBCCC|..v666r9   raw_ids	List[str]prefixrecord_type(Callable[[CKRecord], Optional[TRelated]]operation_nameList[TRelated]c               L   |sg S |                                                      fd|D             t                    }t          |j        |           g }|j        D ]E}t          |t                    r|j        |k    r# ||          }	|	|                    |	           F|S )zAFetch and map linked child records while preserving lookup order.c                0    g | ]}t          |          S r]   r   )r`   uidr   s     r7   rb   z<RemindersReadAPI._lookup_related_records.<locals>.<listcomp>   s#    JJJ3/#v66JJJr9   r   )	r3   r   r   r   rS   rT   r   rU   append)
r6   r   r   r   r,   r   r   mapped_recordsrW   mappeds
     `       r7   _lookup_related_recordsz(RemindersReadAPI._lookup_related_records   s      	I}}%%JJJJ'JJJ' & 
 
 	T\>:::)+< 	. 	.Cc8,, +0M0MVC[[F!%%f---r9   rS   Dict[str, TRelated]relation_getter#Callable[[TRelated], Optional[str]]allowed_idsset[str]c               H    fd|                                  D             S )zFFilter a related-record map down to rows linked to allowed parent IDs.c                6    i | ]\  }} |          v ||S r]   r]   )r`   	record_idrecordr   r   s      r7   
<dictcomp>z;RemindersReadAPI._scope_related_records.<locals>.<dictcomp>   s>     
 
 
!	6v&&+55 v555r9   )items)rS   r   r   s    ``r7   _scope_related_recordsz'RemindersReadAPI._scope_related_records   s<    
 
 
 
 
%,]]__
 
 
 	
r9   rW   r   reminders_mapDict[str, Reminder]alarmsDict[str, Alarm]triggersDict[str, LocationTrigger]attachmentsDict[str, Attachment]hashtagsDict[str, Hashtag]recurrence_rulesDict[str, RecurrenceRule]c               ,   |j         }|dk    r&| j                            |          }	|	||	j        <   dS |dk    r&| j                            |          }
|
||
j        <   dS |dk    r(| j                            |          }|r
|||j        <   dS |dk    r(| j                            |          }|r
|||j        <   dS |dk    r&| j                            |          }|||j        <   dS |dk    r&| j                            |          }|||j        <   dS dS )zARoute one compound reminderList record into its typed collection.r$   Nr   AlarmTriggerr   r    r#   )	rU   r4   r   r_   record_to_alarmrecord_to_alarm_triggerrecord_to_attachmentrecord_to_hashtagrecord_to_recurrence_rule)r6   rW   r   r   r   r   r   r   r   rm   alarmtrigger
attachmenthashtagrecurrence_rules                  r7   _ingest_compound_recordz(RemindersReadAPI._ingest_compound_record   sM    n*$$|66s;;H)1M(+&F'!!L0055E$F58F.((l::3??G /'.$F,&&::3??J 8-7JM*F)##l44S99G#*HWZ F***"lDDSIIO3B_/000 +*r9   Frc   rd   rJ   re   intr!   c                    t          dt          ddt          dt          d                              t          dd	t	          d
|rdnd                    t          ddt	          d
d                    g          }i }i }i }i }i }	i }
d}	 |                                                     |t          ||          }t          |j	        d           |j	        D ]4}t          |t                    s|                     ||||||	|
           5|j        }|snfd|                                D             }d |D             }|                     |d |          }t!          |                                          }|                     |d |          }|                     |d |          }|                     |	d |          }|                     |
d |          }t%          ||||||          S )zGFetch all records for a list using the compound ``reminderList`` query.reminderListEQUALSr   	REFERENCEVALIDATE)r|   action)ry   value)
comparator	fieldName
fieldValueincludeCompletedINT64r   r   LookupValidatingReference)rU   filterByNT)queryrp   re   continuationzList reminders query)r   r   r   r   r   r   c                *    g | ]}|j         k    |S r]   )rY   )r`   rm   rY   s     r7   rb   z3RemindersReadAPI.list_reminders.<locals>.<listcomp>a  s1     
 
 
7** ***r9   c                    h | ]	}|j         
S r]   r^   )r`   rm   s     r7   	<setcomp>z2RemindersReadAPI.list_reminders.<locals>.<setcomp>f  s    LLLxx{LLLr9   c                    | j         S r2   rz   )r   s    r7   <lambda>z1RemindersReadAPI.list_reminders.<locals>.<lambda>j  s	    %*; r9   )r   r   c                    | j         S r2   )alarm_id)r   s    r7   r   z1RemindersReadAPI.list_reminders.<locals>.<lambda>q  s	    G,< r9   c                    | j         S r2   r   )r   s    r7   r   z1RemindersReadAPI.list_reminders.<locals>.<lambda>v  s	    z/E r9   c                    | j         S r2   r   )r   s    r7   r   z1RemindersReadAPI.list_reminders.<locals>.<lambda>{  s	    G,? r9   c                    | j         S r2   r   )r   s    r7   r   z1RemindersReadAPI.list_reminders.<locals>.<lambda>  s	    O4O r9   )rg   r   r   r   r   r   )r   r   r   r   r   r3   r   r   r   rS   rT   r   r   continuationMarkerrh   r   setkeysr!   )r6   rY   rd   re   r   r   r   r   r   r   r   r   r   rW   scoped_remindersscoped_reminder_idsscoped_alarmsscoped_alarm_idsscoped_triggersscoped_attachmentsscoped_hashtagsscoped_recurrence_ruless    `                    r7   rf   zRemindersReadAPI.list_reminders  s    %'$,()WZPPP         '0($#4;aa!         '9(gQ???  #
 
 
6 .0#%/1-/')68&*	==??((++)	 )  D !/EFFF|  !#x00 ,,"/!% +%%5 -      2L 1	4
 
 
 
)0022
 
 

 ML;KLLL33;;+ 4 
 

 }11334455<<( 6 
 

 "88EE+ 9 
 

 55??+ 6 
 

 #'"="=OO+ #> #
 #
 #& $*$4
 
 
 	
r9   rm   List[AlarmWithTrigger]c                  	 |j         sg S |                                                     d |j         D             t                    }t	          |j        d           g }|j        D ]Q}t          |t                    r:|j        dk    r/| j	        
                    |          }|                    |           Rd |D             }i 	|r|                                                     |t                    }t	          |j        d           |j        D ]V}t          |t                    r?|j        dk    r4| j	                            |          }|r|	t          |j        d          <   W	fd|D             S )	z2Fetch alarms + triggers for a reminder via lookup.c                .    g | ]}t          |d           S )r   r   )r`   r   s     r7   rb   z/RemindersReadAPI.alarms_for.<locals>.<listcomp>  s"    VVVC/#w77VVVr9   r   zLookup alarmsr   c                F    g | ]}|j         	t          |j         d           S )r   )
trigger_idr   )r`   r   s     r7   rb   z/RemindersReadAPI.alarms_for.<locals>.<listcomp>  s>     
 
 

E,n==
 
 
r9   zLookup alarm triggersr   c                    g | ]B}t          ||j        r(                    t          |j        d                     nd          CS )r   N)r   r   )r   r   r   r   )r`   r   trigger_maps     r7   rb   z/RemindersReadAPI.alarms_for.<locals>.<listcomp>  sk     

 

 

   'KOOOE4Dn$U$UVVV  

 

 

r9   )	alarm_idsr3   r   r   r   rS   rT   r   rU   r4   r   r   r   r   r_   )
r6   rm   r   r   rW   r   trigger_idstrigger_responser   r   s
            @r7   
alarms_forzRemindersReadAPI.alarms_for  s   ! 	I}}%%VV8CUVVV' & 
 
 	T\?;;;< 	% 	%C#x(( %S^w-F-F44S99e$$$
 

 
 

  	#}}55(+  6     !!1!9;RSSS'/  c8,, >1Q1Q"lBB3GGG # $OGJ$O$OP

 

 

 

  

 

 

 
	
r9   List[Hashtag]c                T    |                      |j        dd| j        j        d          S )z)Fetch hashtags for a reminder via lookup.r    zLookup hashtagsr   r   r   r,   r   )r   hashtag_idsr4   r   r6   rm   s     r7   tags_forzRemindersReadAPI.tags_for  s6    ++(!<1, , 
 
 	
r9   List[Attachment]c                T    |                      |j        dd| j        j        d          S )z,Fetch attachments for a reminder via lookup.r   zLookup attachmentsr   )r   attachment_idsr4   r   r   s     r7   attachments_forz RemindersReadAPI.attachments_for  s6    +++$<4/ , 
 
 	
r9   List[RecurrenceRule]c                T    |                      |j        dd| j        j        d          S )z1Fetch recurrence rules for a reminder via lookup.r#   zLookup recurrence rulesr   )r   recurrence_rule_idsr4   r   r   s     r7   recurrence_rules_forz%RemindersReadAPI.recurrence_rules_for  s6    ++0#(<94 , 
 
 	
r9   )r*   r+   r,   r   r-   r.   r/   r0   )
r=   r>   r:   r>   r;   r?   r<   r@   r/   rA   )r/   rQ   r2   )rY   r?   r/   rZ   )r/   rn   )rt   r?   r/   ru   )rz   rn   r/   r$   )r   r   r   rn   r   rn   r,   r   r   rn   r/   r   )rS   r   r   r   r   r   r/   r   )rW   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   r0   )Frc   )rY   rn   rd   rJ   re   r   r/   r!   )rm   r$   r/   r   )rm   r$   r/   r   )rm   r$   r/   r   )rm   r$   r/   r   )__name__
__module____qualname____doc__r8   rP   rX   rg   rs   r   r   r   staticmethodr   r   rf   r   r   r   r   r]   r9   r7   r)   r)   )   s       EE    -1$("&C C C C C C>7 7 7 7    ,R R R R( )-* * * * * *X7 7 7 7(   8 
 
 
 \
*C *C *C *C^ #( 	n
 n
 n
 n
 n
`.
 .
 .
 .
`
 
 
 

 
 
 

 
 
 
 
 
r9   r)   )/r  
__future__r   loggingtypingr   r   r   r   r   r	   r
   pyicloud.common.cloudkitr   r   r   r   r   r   r   r   r   r   
_constantsr   r   _mappersr   r   	_protocolr   _supportr   clientr   modelsr   r   r    r!   r"   r#   r$   r%   r&   r'   r)   r]   r9   r7   <module>r     s   8 8 " " " " " "  I I I I I I I I I I I I I I I I I I                        = < < < < < < < 7 7 7 7 7 7 7 7 & & & & & & * * * * * * % % % % % %
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 7:p
 p
 p
 p
 p
 p
 p
 p
 p
 p
r9   