U
    k7g=                     @   sH   d dl Z d dlmZmZmZ d dlmZ d dlmZ G dd de	Z
dS )    N)AnyDictOptionalTwilioException)Responsec                   @   s  e Zd ZdZdddddddd	d
ddhZi fedddZdd Zdd Zdd Z	e
eedddZeeef dddZeee dddZeee ddd Zeeef ed!d"d#Zed  dd$d%Zed  dd&d'Zed  dd(d)Zed  dd*d+Zedd,d-Zd.S )/Pagez
    Represents a page of records in a collection.

    A `Page` lets you iterate over its records and fetch the next and previous
    pages in the collection.
    endZfirst_page_urinext_page_uriZlast_page_uripageZ	page_sizeprevious_page_uritotalZ	num_pagesstarturi)responsec                 C   s0   |  |}|| _|| _|| _t| || _d S N)process_response_version_payload	_solutioniter	load_page_records)selfversionr   Zsolutionpayload r   4/tmp/pip-unpacked-wheel-qtbjxrb6/twilio/base/page.py__init__   s
    
zPage.__init__c                 C   s   | S )z/
        A `Page` is a valid iterator.
        r   r   r   r   r   __iter__&   s    zPage.__iter__c                 C   s   |   S r   )nextr   r   r   r   __next__,   s    zPage.__next__c                 C   s   |  t| jS )z8
        Returns the next record in the `Page`.
        )get_instancer!   r   r   r   r   r   r!   /   s    z	Page.next)r   returnc                 C   s    |j dkrtd|t|jS )z}
        Load a JSON response.

        :param response: The HTTP response.
        :return The JSON-loaded content.
           zUnable to fetch page)status_coder   jsonloadstext)clsr   r   r   r   r   5   s    

zPage.process_response)r   c                 C   s^   d|kr$d|d kr$||d d  S t | }|| j }t|dkrR||  S tddS )z
        Parses the collection of records out of a list payload.

        :param payload: The JSON-loaded content.
        :return list: The list of records.
        metakey   z$Page Records can not be deserializedN)setkeys	META_KEYSlenpopr   )r   r   r/   r,   r   r   r   r   B   s    
zPage.load_page)r$   c                 C   sR   d| j kr&d| j d kr&| j d d S d| j krN| j d rN| jj| j d S dS )z`
        :return str: Returns a link to the previous_page_url or None if doesn't exist.
        r+   previous_page_urlr   Nr   r   domainZabsolute_urlr   r   r   r   r3   S   s    zPage.previous_page_urlc                 C   sR   d| j kr&d| j d kr&| j d d S d| j krN| j d rN| jj| j d S dS )z\
        :return str: Returns a link to the next_page_url or None if doesn't exist.
        r+   next_page_urlr
   Nr4   r   r   r   r   r6   a   s
    zPage.next_page_url)r   r$   c                 C   s   t ddS )z
        :param dict payload: A JSON-loaded representation of an instance record.
        :return: A rich, resource-dependent object.
        z<Page.get_instance() must be implemented in the derived classNr   )r   r   r   r   r   r#   m   s    zPage.get_instancec                 C   s6   | j s
dS | jjjd| j }t| }|| j|| jS )zR
        Return the `Page` after this one.
        :return The next page.
        NGET)r6   r   r5   twiliorequesttyper   r   r   r*   r   r   r   	next_pagev   s
    zPage.next_pagec                    s<   | j s
dS | jjjd| j I dH }t| }|| j|| jS )za
        Asynchronously return the `Page` after this one.
        :return The next page.
        Nr7   )r6   r   r5   r8   request_asyncr:   r   r;   r   r   r   next_page_async   s    
 
zPage.next_page_asyncc                 C   s6   | j s
dS | jjjd| j }t| }|| j|| jS )zW
        Return the `Page` before this one.
        :return The previous page.
        Nr7   )r3   r   r5   r8   r9   r:   r   r;   r   r   r   previous_page   s
    zPage.previous_pagec                    s<   | j s
dS | jjjd| j I dH }t| }|| j|| jS )zf
        Asynchronously return the `Page` before this one.
        :return The previous page.
        Nr7   )r3   r   r5   r8   r=   r:   r   r;   r   r   r   previous_page_async   s    
 
zPage.previous_page_asyncc                 C   s   dS )Nz<Page>r   r   r   r   r   __repr__   s    zPage.__repr__N)__name__
__module____qualname____doc__r0   r   r   r    r"   r!   classmethodr   r   r   strr   propertyr   r3   r6   r#   r<   r>   r?   r@   rA   r   r   r   r   r      s<   	r   )r'   typingr   r   r   Ztwilio.base.exceptionsr   Ztwilio.http.responser   objectr   r   r   r   r   <module>   s   