U
    h:                     @   s\   d Z ddlZddlmZmZmZ ddlZddlmZm	Z	 ddl
mZ dZG dd deZdS )	zs
Util that calls several of Polygon's stock market REST APIs.
Docs: https://polygon.io/docs/stocks/getting-started
    N)AnyDictOptional)	BaseModelroot_validatorget_from_dict_or_envzhttps://api.polygon.io/c                   @   s   e Zd ZU dZdZee ed< edde	e	dddZ
eee d	d
dZeee d	ddZeee d	ddZeeee dddZeeeedddZdS )PolygonAPIWrapperzWrapper for Polygon API.Npolygon_api_keyT)pre)valuesreturnc                 C   s   t |dd}||d< |S )z%Validate that api key in environment.r
   ZPOLYGON_API_KEYr   )clsr   r
    r   I/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/utilities/polygon.pyvalidate_environment   s      z&PolygonAPIWrapper.validate_environment)tickerr   c                 C   sV   t  d| d| j }t|}| }|dd}|dkrJtd| |ddS )z
        Get fundamental financial data, which is found in balance sheets,
        income statements, and cash flow statements for a given ticker.

        /vX/reference/financials
        zvX/reference/financials?ticker=&apiKey=statusNOKZSTOCKBUSINESSAPI Error: resultsPOLYGON_BASE_URLr
   requestsgetjson
ValueErrorselfr   urlresponsedatar   r   r   r   get_financials   s    
z PolygonAPIWrapper.get_financialsc                 C   sV   t  d| d| j }t|}| }|dd}|dkrJtd| |ddS )zw
        Get the most recent National Best Bid and Offer (Quote) for a ticker.

        /v2/last/nbbo/{ticker}
        zv2/last/nbbo/?apiKey=r   Nr   r   r   r   r   r   r   r   get_last_quote4   s    
z PolygonAPIWrapper.get_last_quotec                 C   sV   t  d| d| j }t|}| }|dd}|dkrJtd| |ddS )z
        Get the most recent news articles relating to a stock ticker symbol,
        including a summary of the article and a link to the original source.

        /v2/reference/news
        zv2/reference/news?ticker=r   r   Nr   r   r   r   r   r   r   r   get_ticker_newsD   s    
z!PolygonAPIWrapper.get_ticker_news)r   kwargsr   c                 K   s   | dd}| dd}| dd}| dd}| dd	}| d
d}t d| d| d| d| d| d| j d| d| }	t |	}
|
 }| dd}|dkrtd| | ddS )z
        Get aggregate bars for a stock over a given date range
        in custom time window sizes.

        /v2/aggs/ticker/{ticker}/range/{multiplier}/{timespan}/{from_date}/{to_date}
        timespandayZtimespan_multiplier   	from_dateNto_dateadjustedTsortZasczv2/aggs/ticker/z/range//r%   z
&adjusted=z&sort=r   r   r   r   )r   r   r
   r   r   r   )r    r   r(   r)   Z
multiplierr,   r-   r.   r/   r!   r"   r#   r   r   r   r   get_aggregatesY   s    8
z PolygonAPIWrapper.get_aggregates)moder   r(   r   c                 K   sx   |dkrt | |S |dkr0t | |S |dkrHt | |S |dkrdt | j|f|S td| dd S )Nr$   r&   r'   r1   zInvalid mode z for Polygon API.)r   dumpsr$   r&   r'   r1   r   )r    r2   r   r(   r   r   r   run{   s    zPolygonAPIWrapper.run)__name__
__module____qualname____doc__r
   r   str__annotations__r   r   r   dictr$   r&   r'   r   r1   r4   r   r   r   r   r	      s   
	"r	   )r8   r   typingr   r   r   r   Zlangchain_core.pydantic_v1r   r   Zlangchain_core.utilsr   r   r	   r   r   r   r   <module>   s   