
    %xEi                    &   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddl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lmZmZmZ  G d dej<                        Z G d dej<                        Z  G d dejB                        Z"y)z4Views for payment deposit and withdrawal operations.    )annotations)Decimal)transaction)timezone)OpenApiResponseextend_schema)permissionsstatusviewsets)action)Response)Transaction   )DepositPaymentAddressWithdrawalRequest)DepositSerializerPaymentAddressSerializerWithdrawalRequestSerializerc                      e Zd ZdZej
                  j                         ZeZ	e
j                  gZd Z edeed       eddgd	      d
               Zy)PaymentAddressViewSetz#View and request deposit addresses.c                    t         j                  j                  | j                  j                  t         j
                        j                  d      S )N)userr
   z-created_at)r   objectsfilterrequestr   STATUS_ACTIVEorder_byselfs    D/home/cursorai/projects/telegram-earn/backend/apps/payments/views.pyget_querysetz"PaymentAddressViewSet.get_queryset   sB    %%,,""!// - 
 (=
!	"    payment_addresses_get_or_create)      operation_id	responsesFpostzget-or-create)detailmethodsurl_pathc                   |j                   j                  dd      j                         }|dvrt        ddit        j
                        S t        j                  j                  |j                  |t        j                        j                         }|r6| j                  |      }t        |j                   t        j                        S dd	l}dd	l}|j                  j                    d
| d
t#        |j                                }|j%                  |j'                               j)                         d	d }|dk(  rd| }	nd| }	t        j                  j+                  |j                  |d|	t        j                  d|j                  j,                   ddd      }
| j                  |
      }t        |j                   t        j.                        S )z
        Get or create a deposit address for the specified blockchain.
        
        For now, this creates a placeholder address. In production, this would
        call the payment gateway API to generate a real address.
        
blockchaintron)r0   bnberrorz,Only 'tron' and 'bnb' networks are supportedr
   )r   r/   r
   r   N_*   T0xUSDTzDeposit address for systemT)generated_byplaceholder)r   r/   assetaddressr
   labelmetadata)datagetlowerr   r
   HTTP_400_BAD_REQUESTr   r   r   r   r   firstget_serializerHTTP_200_OKhashlibtimeidintsha256encode	hexdigestcreate
first_nameHTTP_201_CREATED)r    r   r/   existing
serializerrG   rH   r;   address_hashr=   payment_addresss              r!   get_or_create_addressz+PaymentAddressViewSet.get_or_create_address%   s    \\%%lF;AAC
_,HI22  "))00!!// 1 
 %'	 	 ,,X6JJOOF4F4FGG 	 !):,aDIIK8H7IJ~~k&8&8&:;EEGL,(G<.)G(0077!!//()@)@(AB&.tD 8 
 ((9

0G0GHHr#   N)__name__
__module____qualname____doc__r   r   nonequerysetr   serializer_classr	   IsAuthenticatedpermission_classesr"   r   r   rU    r#   r!   r   r      sr    -%%**,H/%556" 6))
 56(_E3I F3Ir#   r   c                  h    e Zd ZdZej
                  j                         ZeZ	e
j                  gZd Zy)DepositViewSetzView deposit history.c                    t         j                  j                  | j                  j                        j                  d      S )Nr   z-detected_at)r   r   r   r   r   r   r   s    r!   r"   zDepositViewSet.get_querysetj   s/    %%4<<+<+<%=FF~VVr#   N)rV   rW   rX   rY   r   r   rZ   r[   r   r\   r	   r]   r^   r"   r_   r#   r!   ra   ra   c   s2    ##%H(%556Wr#   ra   c                      e Zd ZdZej
                  j                         ZeZ	e
j                  gZg dZd Z ede ed      d       fd	       Z ed
 ed       ed       ed      d      d        Z xZS )WithdrawalRequestViewSetz$Create and view withdrawal requests.)rA   r*   deletec                    t         j                  j                  | j                  j                        j                  d      S )Nrc   z-requested_at)r   r   r   r   r   r   r   s    r!   r"   z%WithdrawalRequestViewSet.get_querysetv   s2     ((//T\\5F5F/GPPQ`aar#   withdrawal_requests_createz=Validation error (insufficient balance, invalid amount, etc.))description)r&     r'   c                *    t        |   |g|i |S )z/Create a withdrawal request and deduct balance.)superrN   )r    r   argskwargs	__class__s       r!   rN   zWithdrawalRequestViewSet.createy   s     w~g7777r#   withdrawal_requests_cancel!Withdrawal cancelled successfullyz*Cannot cancel withdrawal in current statuszWithdrawal not found)r%   rj   i  c                   | j                         }|j                  t        j                  k7  r+t	        dd|j                   dit        j
                        S t        j                         5  |j                  j                  j                  j                         j                  |j                  j                        }t        j                  j                         j                  |j                        }|j                  j                  dd      }|j                  }|xj                  t!        |      z  c_        |j#                  dg	       |j                  r=t$        j&                  |j                  _        |j                  j#                  d
dg	       t$        j                  j)                  |t$        j*                  t!        |      t$        j&                  ||j                  |j,                  dd       t        j&                  |_        t/        j0                         |_        |j#                  d
dg	       ddd       t	        ddit        j4                        S # 1 sw Y   &xY w)z7Cancel a pending withdrawal request and refund balance.r2   z&Cannot cancel withdrawal with status ''r3   )pktotal_deduction0credit_balance)update_fieldsr
   
updated_atzUser cancelled withdrawal)withdrawal_idreason)r   transaction_typeamountr
   balance_beforebalance_afterr@   processed_atNmessagerq   )
get_objectr
   r   STATUS_REQUESTEDr   rC   r   atomicr   ro   r   select_for_updaterA   rt   r?   rw   r   saver   STATUS_CANCELLEDrN   TYPE_WITHDRAWALrI   r   nowr   rF   )	r    r   rm   rn   
withdrawaluser_lockedwithdrawal_lockedru   r~   s	            r!   destroyz WithdrawalRequestViewSet.destroy   s    __&
  1 B BBB:CTCTBUUVWX22 
 !$//33;;MMOSSWaWfWfWiWiSjK 1 9 9 K K M Q QU_UbUb Q c 088<<=NPSTO )77N&&'/*BB&,<+=> !,,7B7S7S!--4!--22(LAY2Z && !,!<!</"33-)88%6%9%99 '  (9'I'I$-5\\^*""(N1K"LG "J ;<%%
 	
K "!s   -GI##I,)rV   rW   rX   rY   r   r   rZ   r[   r   r\   r	   r]   r^   http_method_namesr"   r   r   rN   r   __classcell__)ro   s   @r!   re   re   n   s    . ((--/H2%5561b 1, [
88 1 -PQ -YZ -CD
3
3
r#   re   N)#rY   
__future__r   decimalr   	django.dbr   django.utilsr   drf_spectacular.utilsr   r   rest_frameworkr	   r
   r   rest_framework.decoratorsr   rest_framework.responser   apps.transactions.modelsr   modelsr   r   r   serializersr   r   r   ReadOnlyModelViewSetr   ra   ModelViewSetre   r_   r#   r!   <module>r      su    : "  ! ! @ 8 8 , , 0 > > HIH99 HIVWX22 WS
x44 S
r#   