
    gjs                        d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZ  G d de          Z G d d	          Z G d
 d          Z G d d          ZddZdS )    )annotationsN)DecimalInvalidOperation)errorparserequest)_runtime_secret_valuec                  &     e Zd Zddd	 fdZ xZS )
HistoricalFxUnavailablemanual_override_requiredstatusmessagestrr   returnNonec               X    t                                          |           || _        d S N)super__init__r   )selfr   r   	__class__s      y/home/agent/.hermes/worktrees/FinanceManager-sprint14-twr-xirr-performance-attribution/src/jarvis_finance/fx/providers.pyr   z HistoricalFxUnavailable.__init__   s&    !!!    )r   r   r   r   r   r   )__name__
__module____qualname__r   __classcell__)r   s   @r   r   r   
   sJ        6P            r   r   c                  *    e Zd ZdZdddd
ZdddZdS )MockFxProvidermockN)unavailablerates0dict[tuple[str, str, str], Decimal | str | None]r"    set[tuple[str, str, str]] | Noner   r   c                   d |                                 D             | _        d |pt                      D             | _        d S )Nc                    i | ]Q\  \  }}}}|                                 |                                 |f|t          t          |                    nd RS r   )upperr   r   ).0abdvs        r   
<dictcomp>z+MockFxProvider.__init__.<locals>.<dictcomp>   sh      A  A  Abnbkcdfgijmnqwwyy!''))Q/Q]'#a&&///X\  A  A  Ar   c                h    h | ]/\  }}}|                                 |                                 |f0S  )r(   )r)   r*   r+   r,   s       r   	<setcomp>z*MockFxProvider.__init__.<locals>.<setcomp>   s5    \\\'!QQWWYY		15\\\r   )itemsr#   setr"   )r   r#   r"   s      r   r   zMockFxProvider.__init__   s[     A  Arwr}r}rr  A  A  A
\\kFZUXUZUZ\\\r   base_currencyr   quote_currency	rate_date
str | NoneDecimal | Nonec                    |pd}|                                 |                                 |f}|| j        v rt          d          | j                            |          S )Nlatestz#historical FX unavailable/paywalled)r(   r"   r   r#   get)r   r4   r5   r6   datekeys         r   get_ratezMockFxProvider.get_rate   sa    $H""$$n&:&:&<&<dC$""")*OPPPz~~c"""r   )r#   r$   r"   r%   r   r   r   r4   r   r5   r   r6   r7   r   r8   r   r   r   namer   r>   r0   r   r   r    r       s]        D DH ] ] ] ] ] ]# # # # # # #r   r    c                  2    e Zd ZdZdZdZdddd
ZdddZdS )FrankfurterFxProviderfrankfurterzhttps://api.frankfurter.devz@jarvis-finance/0.1 (+https://github.com/Gamexgit/FinanceManager)       @timeout_secondsrG   floatr   r   c                   || _         d S r   rF   )r   rG   s     r   r   zFrankfurterFxProvider.__init__$   s    .r   Nr4   r   r5   r6   r7   r8   c                X   |                                 }|                                 }||k    rt          d          S ||d}|r|dk    r||d<   | j         dt          j        |          z   }	 t          j        |d| j        d          }t          j        || j	        	          5 }	t          j        |	                                                    d
                    }
d d d            n# 1 swxY w Y   nf# t          j        $ r2}|j        dk    rt#          dd          |t#          d          |d }~wt          j        $ r}t#          d          |d }~ww xY w	 t'          |
t(                    r|
r|
d         }|rM|dk    rGt'          |t*                    r2t-          |                    d          pd          d d         |k    rd S t'          |t*                    r|                    d          nd }not'          |
t*                    rX|
                    di                               |          }|dv r*|
                    d          p|
                    d          }nd }|dvrt          t-          |                    nd S # t0          t2          t4          f$ r Y d S w xY w)N1)basequotesr:   r<   z
/v2/rates?application/json)Acceptz
User-Agentheaderstimeoututf-8  frankfurter_rate_limitedrate_limitedr   frankfurter_provider_errorfrankfurter_network_errorr    
   rater#      NrZ   amount)r(   r   base_urlr   	urlencoder   Request
user_agenturlopenrG   jsonloadsreaddecoder   	HTTPErrorcoder   URLError
isinstancelistdictr   r;   r   
ValueErrorAttributeError)r   r4   r5   r6   rL   quoteparamsurlreqresponsepayloadexcfirstvalues                 r   r>   zFrankfurterFxProvider.get_rate'   s*   ""$$$$&&5==3<<%00 	'h..&F6N***U_V-D-DD	P/#5T_UU  C d.BCCC Fx*X]]__%;%;G%D%DEEF F F F F F F F F F F F F F F 	Q 	Q 	Qx3-.HQ_```fii)*FGGSP~ 	P 	P 	P)*EFFCO	P	'4(( W 
 !X--"5$// .EIIf--344SbS9YFF4-7t-D-DN		&)))$GT** GR0044U;;J&&#KK11HW[[5H5HE*/z*A*A73u::&&&tK *n= 	 	 	44	sb   09C; ):C/#C; /C33C; 6C37C; ;E
-D77E	EE"A,J B=J J)(J))rG   rH   r   r   r   r?   )r   r   r   rA   r_   rb   r   r>   r0   r   r   rC   rC      s]        D,HSJ36 / / / / / /) ) ) ) ) ) )r   rC   c                  ,    e Zd ZdZdddddZdddZdS )TwelveDataFxProvider
twelvedataNrE   )api_keyrG   r|   r7   rG   rH   r   r   c               @    |pt          d          | _        || _        d S )N)TWELVEDATA_API_KEYTWELVE_DATA_API_KEYJARVIS_TWELVEDATA_API_KEYJARVIS_TWELVE_DATA_API_KEY)r	   r|   rG   )r   r|   rG   s      r   r   zTwelveDataFxProvider.__init__V   s2      b"7  9a  #b  #b.r   r4   r   r5   r6   r8   c                   |                                 }|                                 }||k    rt          d          S | j        st          dd          | d| }|r|dk    rdnd}|| j        d	}|dk    r|                    d
||dd           d|z   dz   t          j        |          z   }		 t          j        |	ddi          }
t          j	        |
| j
                  5 }t          j        |                                                    d                    }d d d            n# 1 swxY w Y   n# t          j        $ rM}|j        dv rt          dd          ||j        dk    rt          dd          |t          d          |d }~wt          j        $ r}t          d          |d }~ww xY wt'          |t(                    rIt+          |                    d          pd                                          dk    rt          d          d }|dk    r+t'          |t(                    r|                    d          }nct'          |t(                    rN|                    dg           }|r6t'          |d          t(                    r|d                              d!          }	 |d"vrt          t+          |                    nd S # t0          t2          f$ r Y d S w xY w)#NrK   twelvedata_api_key_missingr   r   /r:   exchange_ratetime_series)symbolapikey1day)interval
start_dateend_date
outputsizezhttps://api.twelvedata.com/?rO   rN   rP   rR   rT   >       twelvedata_auth_failed	forbiddenrU   twelvedata_rate_limitedrW   twelvedata_provider_errortwelvedata_network_errorr   rZ   r   r\   valuesr   closer]   )r(   r   r|   r   updater   r`   r   ra   rc   rG   rd   re   rf   rg   r   rh   ri   rj   rk   rm   r   r;   lowerr   rn   )r   r4   r5   r6   rL   rp   r   endpointrq   rr   rs   rt   ru   rv   rx   r   s                   r   r>   zTwelveDataFxProvider.get_rateZ   sp   ""$$$$&&5==3<<| 	k)*FOijjjj""5""*3_yH7L7L??R_,2dl!K!K}$$MMvYT]mpqqrrr+h6<uv?V?VV	O/#:L/MNNNCd.BCCC Fx*X]]__%;%;G%D%DEEF F F F F F F F F F F F F F F 	P 	P 	Px:%%-.F{[[[addx3-.GP^___ehh)*EFFCO~ 	O 	O 	O)*DEE3N	Ogt$$ 	GW[[-B-B-Hb)I)I)O)O)Q)QU\)\)\)*EFFF&&:gt+D+D&KK''EE&& 	/[[2..F /*VAY55 /q	g..	*/z*A*A73u::&&&tK *- 	 	 	44	s[   13D6 $:D*D6 *D..D6 1D.2D6 6F4AFF4F//F4,!K K#"K#)r|   r7   rG   rH   r   r   r   r?   r@   r0   r   r   rz   rz   S   sU        D04s / / / / / /% % % % % % %r   rz   rA   r   c                   | pd                                                     dd                              dd          }|dk    rt                      S |dk    rt                      S |dk    rt	          i           S t          d          )NrZ   _-rD   r{   r!   zunknown fx provider)r   replacerC   rz   r    rn   )rA   r=   s     r   fx_provider_by_namer      s    :2




&
&sB
/
/
7
7R
@
@C
m$&&&
l#%%%
f}}b!!!
*
+
++r   )rA   r   )
__future__r   rd   decimalr   r   urllibr   r   r   "jarvis_finance.market_data.catalogr	   RuntimeErrorr   r    rC   rz   r   r0   r   r   <module>r      s*   " " " " " "  - - - - - - - - ( ( ( ( ( ( ( ( ( ( D D D D D D    l   # # # # # # # #1 1 1 1 1 1 1 1h, , , , , , , ,^, , , , , ,r   