o
    l>jc2                     @  s   d Z ddlmZ ddlZddlZddlmZmZm	Z	 ddl
mZ ddlmZmZmZmZ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mZ eeB ZG d
d dZ dS )z2CloudKit record mappers for the Reminders service.    )annotationsN)AnyCallableOptional)CKRecord   )
_as_raw_id_decode_attachment_url_decode_cloudkit_text_value_decode_crdt_document	_ref_name)RemindersApiError)
AlarmHashtagImageAttachmentLocationTrigger	ProximityRecurrenceFrequencyRecurrenceRuleReminderRemindersListURLAttachmentc                   @  s   e Zd ZdZd0dd	Zed1ddZd2ddZd3ddZd4ddZ	d5ddZ
d6d!d"Zd7d$d%Zd8d'd(Zd9d*d+Zd:d-d.Zd/S );RemindersRecordMapperz8Translate CloudKit records into Reminders domain models.get_rawCallable[[], Any]loggerlogging.LoggerreturnNonec                 C  s   || _ || _d S )N)_get_raw_logger)selfr   r    r"   Y/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/reminders/_mappers.py__init__&   s   
zRemindersRecordMapper.__init__payload_textstrsource	list[str]c              
   C  s   zt | }W n ttfy" } ztd| || dd|d}~ww t|ts4t| d||ddg }|D ]}t|tsKt| d||dd|t	|d q8|S )z<Decode a JSON array of reminder IDs into normalized raw IDs.zFailed to parse )r'   payloadr)   Nz must decode to a JSON arrayz& must contain only string reminder IDsr   )
_jsonloads
ValueError	TypeErrorr   
isinstancelistr&   appendr   )r%   r'   r)   excreminder_idsitemr"   r"   r#   _parse_reminder_ids_payload.   s2   

z1RemindersRecordMapper._parse_reminder_ids_payloadrecr   c           	   
   C  s  |j }|d}|dur)t|tstd|jt|jdd| |d|j dS |d}|du r4g S t	|d	d}|du r[t	|d
d}|sTtd|j dd|jid| 
 |}z|d}W n ty} } ztd|j dd|jid|d}~ww | |d|j dS )zALoad reminder membership from inline or asset-backed list fields.ReminderIDsNz%ReminderIDs field had unexpected type)
recordNametyper*   zList z ReminderIDsReminderIDsAssetdownloadedDatadownloadURLz1 ReminderIDsAsset is missing data and downloadURLr8   utf-8z% ReminderIDsAsset was not valid UTF-8z ReminderIDsAsset)fields	get_valuer/   r&   r   r8   r9   __name__r5   getattrr   download_asset_bytesdecodeUnicodeDecodeError)	r!   r6   r>   reminder_ids_rawassetasset_bytesdownload_urlr%   r2   r"   r"   r#   _reminder_ids_for_list_recordJ   sR   


z3RemindersRecordMapper._reminder_ids_for_list_recordvaluer   
field_namerecord_namec                C  s<   zt |W S  ty   | jd|| |jddd Y S w )zCNormalize CloudKit text-like values into ``str`` for domain models.z=Field %s on %s was undecodable bytes; replacing invalid UTF-8r=   replace)errors)r
   rD   r    warningrC   )r!   rJ   rK   rL   r"   r"   r#   _coerce_textw   s   
z"RemindersRecordMapper._coerce_textr   c                 C  s   |j }|d}|d}| |}|d}|d urt|nd}|dkr+|r+t|}t|j|r4t|nd|r;t|nd ||d|dt|dpLd||j	d		S )
NNameColorCountr   UntitledBadgeEmblemSortingStyleIsGroup)	idtitlecolorcountbadge_emblemsorting_styleis_groupr3   record_change_tag)
r>   r?   rI   intlenr   r8   r&   boolrecordChangeTag)r!   r6   r>   rY   rZ   r3   	raw_countr[   r"   r"   r#   record_to_list   s&   



z$RemindersRecordMapper.record_to_listr   c           
   
   C  s  |j }|d}|d u r|jd ur|jj}|d}|d u r'|jd ur'|jj}|d}d}|r[z| jt|d|jd}W n tyZ } z| j	
d|j| d}W Y d }~nd }~ww |d}d	}	|rz| jt|d|jd}	W n ty } z| j	
d
|j| W Y d }~nd }~ww td5i d|jdt|dd|d|	d|dd|ddt|dpdd|ddt|dpddt|dpddt|dpddt|d pdd!|d"d#d$d% |d&pg D d'd(d% |d)pg D d*d+d% |d,pg D d-d.d% |d/pg D d0t|d1p6d d2|d3|d4|jS d2|d3|d4|jS )6NCreationDateLastModifiedDateTitleDocumentrT   rK   rL   z&TitleDocument decode failed for %s: %szError Decoding TitleNotesDocument z&NotesDocument decode failed for %s: %srX   list_idListrY   descdue_dateDueDate
start_date	StartDate	completed	Completedr   completed_dateCompletionDatepriorityPriorityflaggedFlaggedall_dayAllDaydeletedDeleted	time_zoneTimeZone	alarm_idsc                 S     g | ]}t |d qS )r   r   .0xr"   r"   r#   
<listcomp>       
z<RemindersRecordMapper.record_to_reminder.<locals>.<listcomp>AlarmIDshashtag_idsc                 S  r   )r   r   r   r"   r"   r#   r      r   
HashtagIDsattachment_idsc                 S  r   )
Attachmentr   r   r"   r"   r#   r          AttachmentIDsrecurrence_rule_idsc                 S  r   )r   r   r   r"   r"   r#   r      r   RecurrenceRuleIDsparent_reminder_idParentRemindercreatedmodifiedr_   r"   )r>   r?   r   	timestampr   rP   r   r8   	Exceptionr    rO   r   r   rb   r`   rc   )
r!   r6   r>   r   r   	title_docrY   r2   	notes_docrn   r"   r"   r#   record_to_reminder   s   









	

z(RemindersRecordMapper.record_to_reminderr   c                 C  s6   |j }t|j|dpdt|d|dpd|jdS )NAlarmUIDrk   r   	TriggerID)rX   	alarm_uidreminder_id
trigger_idr_   )r>   r   r8   r?   r   rc   r!   r6   r>   r"   r"   r#   record_to_alarm   s   z%RemindersRecordMapper.record_to_alarmOptional[LocationTrigger]c                 C  s   |j }|dp	d}t|d}|dkrlt|dpd}zt|}W n ty7   | jd||j tj	}Y nw t
|j||dpBd|d	pHdt|d
pOdt|dpWdt|dp_d||dpgd|jd
S | jd||j d S )NTyperk   r   Locationr   r   zUnknown Proximity %d on %sTitleAddressLatitudeg        	LongitudeRadiusLocationUID)
rX   alarm_idrY   addresslatitude	longituderadius	proximitylocation_uidr_   z(Unsupported AlarmTrigger type '%s' on %s)r>   r?   r   r`   r   r-   r    rO   r8   ARRIVINGr   floatrc   )r!   r6   r>   trigger_typer   prox_rawr   r"   r"   r#   record_to_alarm_trigger   sB   

z-RemindersRecordMapper.record_to_alarm_triggerOptional[Attachment]c                 C  s   |j }|dp	d}t|d}|dkr*t|j|t|dpd|dp%d|jdS |dkro|d	}d}|rAt|d
rA|jp@d}t	|j|||dpLdt
|dpSdt
|dp[dt
|dpcd|dpjd|jd	S | jd||j d S )Nr   rk   r   URLUTIz
public.url)rX   r   urlutir_   Image	FileAssetr<   FileNameFileSizer   WidthHeightzpublic.jpeg)	rX   r   file_asset_urlfilename	file_sizewidthheightr   r_   z"Unknown Attachment type '%s' on %s)r>   r?   r   r   r8   r	   rc   hasattrr<   r   r`   r    rO   )r!   r6   r>   att_typer   
file_assetrH   r"   r"   r#   record_to_attachment  sB   


z*RemindersRecordMapper.record_to_attachmentr   c                 C  s<   |j }t|j| j|dd|jdt|d|d|jdS )NrQ   ri   r   rf   )rX   namer   r   r_   )r>   r   r8   rP   r?   r   rc   r   r"   r"   r#   record_to_hashtag>  s   z'RemindersRecordMapper.record_to_hashtagr   c              	   C  sx   |j }|dp	d}zt|}W n ty   tj}Y nw t|jt|d||dp+d|dp1d|dp7d|jdS )	N	Frequencyr   r   IntervalOccurrenceCountr   FirstDayOfTheWeek)rX   r   	frequencyintervaloccurrence_countfirst_day_of_weekr_   )	r>   r?   r   r-   DAILYr   r8   r   rc   )r!   r6   r>   freq_rawfreqr"   r"   r#   record_to_recurrence_ruleL  s    
z/RemindersRecordMapper.record_to_recurrence_ruleN)r   r   r   r   r   r   )r%   r&   r'   r&   r   r(   )r6   r   r   r(   )rJ   r   rK   r&   rL   r&   r   r&   )r6   r   r   r   )r6   r   r   r   )r6   r   r   r   )r6   r   r   r   )r6   r   r   r   )r6   r   r   r   )r6   r   r   r   )r@   
__module____qualname____doc__r$   staticmethodr5   rI   rP   re   r   r   r   r   r   r   r"   r"   r"   r#   r   #   s    


-


M


%
'r   )!r   
__future__r   jsonr+   loggingtypingr   r   r   pyicloud.common.cloudkitr   	_protocolr   r	   r
   r   r   clientr   modelsr   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   s    0