o
    l>j@                     @  s   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 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                   @  s   e Zd ZdZdbd
dZdddddcddZddddZdedfddZdgd d!Zdd"dhd%d&Z	did)d*Z
djd2d3Zedkd:d;ZdldJdKZ	L	MdmdndSdTZdodWdXZdpdZd[Zdqd]d^Zdrd`daZdS )sRemindersReadAPIz;Encapsulates read/query behavior for the Reminders service.get_rawCallable[[], Any]mapperr   loggerlogging.LoggerreturnNonec                 C  s   || _ || _|| _d S N)_get_raw_mapper_logger)selfr(   r*   r+    r4   W/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/reminders/_reads.py__init__,   s   
zRemindersReadAPI.__init__N)desired_keys
sync_tokenreversedesired_record_typesOptional[List[str]]r7   r8   Optional[str]r9   Optional[bool]Iterable[CKZoneChangesZone]c          	      c  sl    |}d}|r4|   jtt||||dd}|jsdS d}|jD ]}|V  |j}|p.t|j}q |sdS dS )zAYield paged /changes/zone results, advancing the zone sync token.T)zoneIDdesiredRecordTypesdesiredKeysr9   	syncToken)zone_reqNF)r0   changesr   r   zonesrB   bool
moreComing)	r3   r:   r7   r8   r9   next_sync_tokenmore_comingresponsezoner4   r4   r5   _iter_zone_change_pages6   s*   		
z(RemindersReadAPI._iter_zone_change_pagesIterable[RemindersList]c                 c  sV    | j dgdD ] }t|jd |jD ]}t|tr|jdkr q| j|V  qqdS )z)Fetch reminders lists as a full snapshot.r   )r:   zFetch reminder listsN)rL   r   records
isinstancer   
recordTyper1   record_to_list)r3   rK   recr4   r4   r5   listsU   s   
zRemindersReadAPI.listslist_idIterable[Reminder]c                 c  sl    i }|r	|g}n	dd |   D }|D ]}| j|ddd}|jD ]}|||j< q!q| D ]}|V  q.dS )z@Fetch reminders as a full snapshot, optionally filtered by list.c                 S  s   g | ]}|j qS r4   id).0lstr4   r4   r5   
<listcomp>f       z.RemindersReadAPI.reminders.<locals>.<listcomp>T   )rT   include_completedresults_limitN)rS   list_reminders	remindersrW   values)r3   rT   reminder_maplist_idslidbatchreminderr4   r4   r5   r`   ^   s"   
zRemindersReadAPI.remindersstrc                 C  sH   |   jtd}|r|S d}| jg g ddD ]}|j}q|r |S td)z;Return the latest usable sync token for the Reminders zone.)zone_idNF)r:   r7   r9   z.Unable to obtain sync token for Reminders zone)r0   current_sync_tokenr   rL   rB   r   )r3   query_tokenr8   rK   r4   r4   r5   sync_cursort   s   
zRemindersReadAPI.sync_cursor)sincerl   Iterable[ReminderChangeEvent]c             
   c  s    | j dg|ddD ]`}|jD ]Z}t|tr3|jdkrq| j|}|jr'dnd}t||j	|dV  qt|t
rBtd|jddV  qt|tri|jpKd}|jpPd	}td
| d|j d| d|j|j|jddqq
dS )z6Iterate reminder changes since an optional sync token.r#   F)r:   r8   r9   deletedupdated)typereminder_idrf   Nz<unknown record>zno reason providedz&Iterating reminder changes failed for z: z ())
recordNameserverErrorCodereason)payload)rL   rN   rO   r   rP   r1   record_to_reminderrn   r$   rW   r   rs   r
   ru   r   rt   )r3   rl   rK   rR   rf   evt_typerecord_nameru   r4   r4   r5   iter_changes   sX   







zRemindersReadAPI.iter_changesrq   r#   c                 C  st   t |d}|  j|gtd}t|jd d}|jD ]}t|tr*|j|kr*|} nq|s4t	d| | j
|S )zFetch a single reminder by ID.r#   record_namesrh   zLookup reminderNzReminder not found: )r   r0   lookupr   r   rN   rO   r   rs   LookupErrorr1   rw   )r3   rq   ry   resptargetrR   r4   r4   r5   get   s   

zRemindersReadAPI.getraw_ids	List[str]prefixrecord_type(Callable[[CKRecord], Optional[TRelated]]operation_nameList[TRelated]c          
        sx   |sg S |   j fdd|D td}t|j| g }|jD ]}t|tr+|j|kr,q||}	|	dur9||	 q|S )zAFetch and map linked child records while preserving lookup order.c                   s   g | ]}t | qS r4   r   rX   uidr   r4   r5   rZ          z<RemindersReadAPI._lookup_related_records.<locals>.<listcomp>r{   N)	r0   r}   r   r   rN   rO   r   rP   append)
r3   r   r   r   r*   r   r   mapped_recordsrR   mappedr4   r   r5   _lookup_related_records   s    


z(RemindersReadAPI._lookup_related_recordsrN   Dict[str, TRelated]relation_getter#Callable[[TRelated], Optional[str]]allowed_idsset[str]c                  s    fdd|   D S )zFFilter a related-record map down to rows linked to allowed parent IDs.c                   s"   i | ]\}}| v r||qS r4   r4   )rX   	record_idrecordr   r   r4   r5   
<dictcomp>   s
    z;RemindersReadAPI._scope_related_records.<locals>.<dictcomp>)items)rN   r   r   r4   r   r5   _scope_related_records   s   z'RemindersReadAPI._scope_related_recordsrR   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                C  s   |j }|dkr| j|}	|	||	j< dS |dkr%| j|}
|
||
j< dS |dkr8| j|}|r6|||j< dS |dkrK| j|}|rI|||j< dS |dkr\| j|}|||j< dS |dkrm| j|}|||j< dS dS )zARoute one compound reminderList record into its typed collection.r#   Nr   AlarmTriggerr   r   r"   )	rP   r1   rw   rW   record_to_alarmrecord_to_alarm_triggerrecord_to_attachmentrecord_to_hashtagrecord_to_recurrence_rule)r3   rR   r   r   r   r   r   r   r   rf   alarmtrigger
attachmenthashtagrecurrence_ruler4   r4   r5   _ingest_compound_record   s6   




z(RemindersReadAPI._ingest_compound_recordFr\   r]   rF   r^   intr    c                   s~  t dtddtdt ddddtdd	td
|rdndddtddtd
dddgd}i }i }i }i }i }	i }
d}	 |  j|t||d}t|j	d |j	D ]}t
|tsWqO| j||||||	|
d qO|j}|sjnq; fdd| D }dd |D }| j|dd |d}t| }| j|dd |d}| j|dd |d}| j|	dd |d}| j|
dd |d}t||||||dS ) zGFetch all records for a list using the compound ``reminderList`` query.reminderListEQUALSr   	REFERENCEVALIDATE)rs   action)rp   value)
comparator	fieldName
fieldValueincludeCompletedINT64r   r   LookupValidatingReference)rP   filterByNT)queryrh   r^   continuationzList reminders query)r   r   r   r   r   r   c                   s   g | ]	}|j  kr|qS r4   rT   rX   rf   r   r4   r5   rZ   a  s
    
z3RemindersReadAPI.list_reminders.<locals>.<listcomp>c                 S  s   h | ]}|j qS r4   rV   r   r4   r4   r5   	<setcomp>f  r[   z2RemindersReadAPI.list_reminders.<locals>.<setcomp>c                 S     | j S r/   rq   )r   r4   r4   r5   <lambda>j      z1RemindersReadAPI.list_reminders.<locals>.<lambda>)r   r   c                 S  r   r/   )alarm_id)r   r4   r4   r5   r   q  r   c                 S  r   r/   r   )r   r4   r4   r5   r   v  r   c                 S  r   r/   r   )r   r4   r4   r5   r   {  r   c                 S  r   r/   r   )r   r4   r4   r5   r     r   )r`   r   r   r   r   r   )r   r   r   r   r   r0   r   r   r   rN   rO   r   r   continuationMarkerra   r   setkeysr    )r3   rT   r]   r^   r   r   r   r   r   r   r   r   r   rR   scoped_remindersscoped_reminder_idsscoped_alarmsscoped_alarm_idsscoped_triggersscoped_attachmentsscoped_hashtagsscoped_recurrence_rulesr4   r   r5   r_     s   






zRemindersReadAPI.list_remindersrf   List[AlarmWithTrigger]c           	        s   |j sg S |  jdd |j D td}t|jd g }|jD ]}t|tr6|jdkr6| j	
|}|| qdd |D }i  |rq|  j|td}t|jd |jD ]}t|trp|jdkrp| j	|}|rp| t|jd< qT fd	d|D S )
z2Fetch alarms + triggers for a reminder via lookup.c                 S  s   g | ]}t |d qS )r   r   r   r4   r4   r5   rZ     r   z/RemindersReadAPI.alarms_for.<locals>.<listcomp>r{   zLookup alarmsr   c                 S  s   g | ]}|j rt|j d qS )r   )
trigger_idr   rX   r   r4   r4   r5   rZ     s    
zLookup alarm triggersr   c              	     s0   g | ]}t ||jr t|jd nddqS )r   N)r   r   )r   r   r   r   r   trigger_mapr4   r5   rZ     s    	)	alarm_idsr0   r}   r   r   rN   rO   r   rP   r1   r   r   r   r   rW   )	r3   rf   r   r   rR   r   trigger_idstrigger_responser   r4   r   r5   
alarms_for  sB   



	zRemindersReadAPI.alarms_forList[Hashtag]c                 C     | j |jdd| jjddS )z)Fetch hashtags for a reminder via lookup.r   zLookup hashtagsr   r   r   r*   r   )r   hashtag_idsr1   r   r3   rf   r4   r4   r5   tags_for     zRemindersReadAPI.tags_forList[Attachment]c                 C  r   )z,Fetch attachments for a reminder via lookup.r   zLookup attachmentsr   )r   attachment_idsr1   r   r   r4   r4   r5   attachments_for  r   z RemindersReadAPI.attachments_forList[RecurrenceRule]c                 C  r   )z1Fetch recurrence rules for a reminder via lookup.r"   zLookup recurrence rulesr   )r   recurrence_rule_idsr1   r   r   r4   r4   r5   recurrence_rules_for  r   z%RemindersReadAPI.recurrence_rules_for)r(   r)   r*   r   r+   r,   r-   r.   )
r:   r;   r7   r;   r8   r<   r9   r=   r-   r>   )r-   rM   r/   )rT   r<   r-   rU   )r-   rg   )rl   r<   r-   rm   )rq   rg   r-   r#   )r   r   r   rg   r   rg   r*   r   r   rg   r-   r   )rN   r   r   r   r   r   r-   r   )rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r.   )Fr\   )rT   rg   r]   rF   r^   r   r-   r    )rf   r#   r-   r   )rf   r#   r-   r   )rf   r#   r-   r   )rf   r#   r-   r   )__name__
__module____qualname____doc__r6   rL   rS   r`   rk   rz   r   r   staticmethodr   r   r_   r   r   r   r   r4   r4   r4   r5   r'   )   s0    

	

,

/
p
0


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'   r4   r4   r4   r5   <module>   s    $0,