
    hj%                        d dl mZ d dlmZ d dl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 d dlmZ d d	lmZ d d
lmZ d dlmZmZmZ d*dZ d+dZ!d,d-dZ"d.dZ#d/d Z$d0d"Z%d1d$Z&d2d&Z'd3d)Z(dS )4    )annotations)DecimalN)urlparse)
Connection)HTTPException)	
ActionItemCoinGeckoInfoCryptoPositionCryptoPositionDetail
PricePointWalletAllocation
WalletCoinWalletDetailWalletSummary)calculate_crypto_holdings)data)get_crypto_chart_points)decimal_textoptional_decimal_textstatus_labelvalueobjectreturn
str | Nonec                    t          | t                    r|                                 sd S t          |                                           }|j        dvs|j        sd S |                                 S )N>   httphttps)
isinstancestrstripr   schemenetloc)r   parseds     /home/agent/.hermes/worktrees/FinanceManager-sprint16-smart-household-inbox-real-data-onboarding-v2/src/jarvis_finance/services/crypto_service.py_safe_external_urlr%      se    eS!!  tekkmm$$F}---V]-t;;==    connr   asset_idr   CoinGeckoInfo | Nonec                   |                      d|f                                          }|r|d         sd S 	 t          j        |d                   }n# t          t          j        f$ r Y d S w xY wt          |t                    r|                    d          nd }t          |t                    sd S t          |                    d          |                    d          "t          |                    d                    nd |                    d          "t          |                    d                    nd |                    d          "t          |                    d                    nd |                    d          "t          |                    d                    nd t          |                    d	                    t          |                    d
          p|                    d                              S )Nz0SELECT notes FROM crypto_assets WHERE asset_id=?notes	coingeckomarket_cap_rank
market_cap
volume_24hchange_24h_pctchange_7d_pcthomepage	image_urllogo_url)r-   r.   r/   r0   r1   r2   r3   )executefetchonejsonloads	TypeErrorJSONDecodeErrorr   dictgetr	   r   r%   )r'   r(   rowpayloadinfos        r$   _coingecko_info_from_cacher@      s   
,,IH;
W
W
`
`
b
bC c'l t*S\**t+,   tt'1'4'@'@J7;;{###dDdD!! t!23326((<2H2H2T3txx--...Z^26((<2H2H2T3txx--...Z^:>((CS:T:T:`s488$455666fj8<8Q8Q8]c$((?33444cg#DHHZ$8$899$TXXk%:%:%Rdhhz>R>RSS   s   A A,+A,CHFcurrencyc                z    |                      d||                                f                                          S )Nz
        SELECT price, quality_status, fetched_at, provider_timestamp
        FROM crypto_prices
        WHERE asset_id = ? AND price_currency = ?
        ORDER BY COALESCE(provider_timestamp, fetched_at, '') DESC, fetched_at DESC
        LIMIT 1
        )r5   upperr6   )r'   r(   rB   s      r$   _latest_crypto_pricerE   0   s<    <<	 
8>>##$	 	 hjj	r&   rowslist[dict[str, object]]r   c                P    t          d | D             t          d                    S )Nc              3  d   K   | ]+}t          j        |                    d                     V  ,dS )_sort_value_chfN)dashboard_datadr<   ).0r=   s     r$   	<genexpr>z#_portfolio_total.<locals>.<genexpr>>   s:      MM ):!;!;<<MMMMMMr&   0)sumr   )rF   s    r$   _portfolio_totalrQ   =   s(    MMMMMwWZ||\\\r&   r=   dict[str, object]c                h    |                      d          p|                      d          }|sd S d| S )Ncoingecko_id_coingecko_idz#https://www.coingecko.com/en/coins/)r<   )r=   coin_ids     r$   _coingecko_urlrW   A   s?    ggn%%A)A)AG t::::r&   list[CryptoPosition]c                   t          t          j        | d                    }t          |          }g }|D ]D}t	          |                    d          p*|                    d          p|                    dd                    }|                     d|f                                          }t          j        |                    d                    }|d	k    rt          d
          n||z  t          d          z  }|
                    t          |t	          |                    dd                    t	          |                    dd                    t          |                    d                    t          |                    d          p |                    d          p|r|d         nd           t          |d          t          |d          t          |                    d          pd	          t          |                    d          p|                    d                    |                    d          p|                    d          pd t!          |                               F|S )NT)
admin_moder(   	_asset_idcoin znSELECT price FROM crypto_prices WHERE asset_id = ? AND price_currency = 'CHF' ORDER BY fetched_at DESC LIMIT 1rJ   r   rO   100symbolgesamtmenge	price_chf
_price_chfprice   walletsprice_statusstatuslast_price_update_last_price_update)r(   namer_   quantity_totalra   market_value_chfportfolio_share_pctwallet_countrf   rh   coingecko_url)listrK   get_crypto_coin_summaryrQ   r   r<   r5   r6   rL   r   appendr
   r   r   intr   rW   )	r'   rF   total	positionsr=   r(   	price_rowr   shares	            r$   list_crypto_positionsrx   H   sY   6tMMMNNDT""E&(I 
 
swwz**Ycggk.B.BYcggfVXFYFYZZLL|K
 
 (** 	  ):!;!;<< %

1O!,,--3778R0011+CGGM,B,BCC/0D0D  1MP\H]H]  1M  yB  cLbklsbtbt  HL  N  N!6ua!@!@$0$:$: !3!3!8q99)#''.*A*A*VSWWXEVEVWW"%''*=">">"g#''J^B_B_"gcg,S11  	
 	
 	
 	
 r&   r   c                   t          fdt          |           D             d           }|t          dd          g }|                     df                                          }t          |           }t          j        |r|d         nd          }|D ]}t          j        |d                   }||z  }	|                    t          t          |d	                   t          |d
                   t          |          t          |	d                               d t          | dd          D             }
t          dd          t          dd          t          dd          t          dd          t          dd          t          dd          t          ddd          g}t          di |                                |t#          |           ||
ddS ) Nc              3  2   K   | ]}|j         k    |V  d S N)r(   )rM   pr(   s     r$   rN   z&get_crypto_position.<locals>.<genexpr>g   s/      VV1qzX?U?UQ?U?U?U?UVVr&     zCrypto position not foundstatus_codedetailz
        SELECT w.wallet_id, w.wallet_name, h.quantity
        FROM crypto_holdings h
        JOIN crypto_wallets w ON w.wallet_id = h.wallet_id
        WHERE h.asset_id = ?
        ORDER BY w.wallet_name
        rc   rO   quantity	wallet_idwallet_namerd   )r   walletr   rl   c           
         g | ]a}t          t          |d          pd          t          |d                   pdt          |d         pd          |d         |d                   bS )		timestampr]   rc   rO   rB   rA   providersource_quality)dater   rB   r   quality_status)r   r   r   )rM   rs     r$   
<listcomp>z'get_crypto_position.<locals>.<listcomp>   s        	AkN0b119NqQXz9Z9Z9a^alopqr|p}  qG  BG  mH  mH  ST  U_  S`  qr  sC  qD  	E  	E  	E  r&   rA   <   )rB   limitzVerlauf anzeigenT)labelenabledzBestand korrigierenu   Bestand erhöhenzBestand reduzierenzAuf 0 setzenTransferu   Live-Modus späterFzBOptional vorbereitet; Default aus, kein Persistieren, kein Trading)r   r   reasonu   Live-Modus optional vorbereitet; Preview/Confirm/Audit aktiv für manuelle Crypto-Bestandsaktionen inklusive Transfer; kein Trading.)wallet_allocationscoingecko_infoavailable_actionsprice_historyread_only_note )nextrx   r   r5   fetchallrE   rK   rL   rr   r   r   r   r   r   r   r   
model_dumpr@   )r'   r(   positionallocationsrF   latest_pricerc   r=   r   r   r   actionss    `          r$   get_crypto_positionr   f   s{   VVVV 5d ; ;VVVX\]]H4OPPPP*,K<<	 
	 	 hjj 	 (h77LlK\'22LLE 

 

!#C
O445 c+.//3}-..%h//!6ua!@!@	  	
 	
 	
 	
 (x%rRRR  M
 	+T:::.===+T:::-t<<<666T222-u  FJ  	K  	K  	KG    c  c("5"5"7"7  cK  iC  DH  JR  iS  iS  gn  ~K  \b  c  c  c  c  cr&   list[WalletSummary]c                8   t          |           }|                     d                                          }g }|D ]\}t          |d                   fd|j                                        D             }t          d          }g }|D ]X\  }}	t          | |          }
|                    |
r|
d         nd           ||	t          j
        |
r|
d         nd          z  z  }Yt          d |D                       rdn|r|d	         nd
}|                    t          t          |d                   t          |d                   t          |d         pd          t          |          t          |d          t          |                               ^|S )NzSSELECT wallet_id, wallet_name, wallet_type FROM crypto_wallets ORDER BY wallet_namer   c                P    g | ]"\  \  }}}|k    |j         d k    ||j         f#S )r   )r   )rM   widr(   holdingr   s       r$   r   z list_wallets.<locals>.<listcomp>   sz      h  h  h<TOS(W|  DM  }M  }M  RY  Rb  fg  Rg  RgHg&67  Rg  Rg  Rgr&   rO   r   missingrc   c              3  "   K   | ]
}|d k    V  dS )r   Nr   )rM   ss     r$   rN   zlist_wallets.<locals>.<genexpr>   s&      !C!CQ!y.!C!C!C!C!C!Cr&   r   unknownr   wallet_typer]   rd   )r   rj   r   r   
coin_countrl   rg   )r   r5   r   r   wallet_holdingsitemsr   rE   rr   rK   rL   anyr   lenr   r   )r'   holdingswallet_rows	summariesr=   r   r   statusesr(   r   rv   rg   r   s               @r$   list_walletsr      s   (..H,,tuu~~  A  AK%'I 
 
K())	 h  h  h  hX`XpXvXvXxXx  h  h  h "1 	[ 	[Hh,T8<<IOO9SI&677)TTTX 0y1Y71C1CVY Z ZZZEE!!C!C(!C!C!CCCqYaJp(ST++gp#]+,,M 233S/5266//!6ua!@!@#F++  
	
 
	
 
	
 
	
 r&   r   r   c                2   t          fdt          |           D             d           }|t          dd          t          |           }|                     df                                          }g }|D ]}t          |d                   }|j                            |f          }|r|j	        nt          d          }	t          | |          }
|	t          j        |
r|
d         nd          z  }|                    t          |t          |d	                   t          |d
                   t!          |	          t#          |d          t%          |
r|
d         nd                               t'          di |                                d|iS )Nc              3  2   K   | ]}|j         k    |V  d S r{   )r   )rM   wr   s     r$   rN   zget_wallet.<locals>.<genexpr>   s/      MMAK94L4L14L4L4L4LMMr&   r}   zWallet not foundr~   z
        SELECT a.asset_id, a.coin_name, a.symbol
        FROM crypto_holdings h
        JOIN crypto_assets a ON a.asset_id = h.asset_id
        WHERE h.wallet_id = ?
        GROUP BY a.asset_id, a.coin_name, a.symbol
        ORDER BY a.coin_name
        r(   rO   rc   	coin_namer_   rd   r   r   )r(   rj   r_   r   rl   rg   coinsr   )r   r   r   r   r5   r   r   r   r<   r   r   rE   rK   rL   rr   r   r   r   r   r   r   )r'   r   r   r   rF   r   r=   r(   r   quantity_decrv   r   s    `          r$   
get_walletr      s   MMMMl400MMMtTTF~4FGGGG(..H<<	 

 
 hjj 	 !E 
 
s:''+//H0EFF,4Fx(('#,,(x88	~/i0X	'0B0BUXYYY![)**3x=))%l33!6ua!@!@#9$[I.>$?$?R[\\  		
 		
 		
 		
 ;;&++--;;U;;;;r&   )r   r   r   r   )r'   r   r(   r   r   r)   )rA   )r'   r   r(   r   rB   r   )rF   rG   r   r   )r=   rR   r   r   )r'   r   r   rX   )r'   r   r(   r   r   r   )r'   r   r   r   )r'   r   r   r   r   r   ))
__future__r   decimalr   r7   urllib.parser   sqlite3r   fastapir   $jarvis_finance.api.schemas.positionsr   r	   r
   r   r   r   r   r   r   jarvis_finance.crypto.holdingsr   jarvis_finance.dashboardr   rK    jarvis_finance.market_data.cacher   #jarvis_finance.services.api_helpersr   r   r   r%   r@   rE   rQ   rW   rx   r   r   r   r   r&   r$   <module>r      s   " " " " " "        ! ! ! ! ! !       ! ! ! ! ! ! x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x D D D D D D ; ; ; ; ; ; D D D D D D a a a a a a a a a a      *
 
 
 
 
] ] ] ]; ; ; ;   <)c )c )c )cX   8!< !< !< !< !< !<r&   