
    Di;/              	      *   d Z ddlmZ ddlZddlmZ ddlmZ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 ddlmZ ddlmZmZmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&  ejN                  e(      Z)d*dZ* ee"e# ed       ed      dd       edg       eeg      d                      Z+ ee"e# ed       ed       ed      dd       edg       eeg      d                      Z, eejZ                  e# ed        ed!      d"d#       edg       eeg      d$                      Z. G d% d&ej^                        Z0e eejZ                  e%e%d'd(       edg       eeg      d)                             Z1y)+z+API views for Telegram-only authentication.    )annotationsN)OpenApiTypes)OpenApiResponseextend_schema)statusviewsets)api_viewpermission_classesaction)AllowAny)Response)RefreshToken)settings)csrf_exempt)TelegramDataValidationErrorinit_data_debug_snapshotsend_telegram_messagevalidate_telegram_init_data   )User)TelegramAuthRequestSerializerTelegramAuthResponseSerializer#TelegramAuthenticatedUserSerializer!TelegramWebhookResponseSerializerUserWalletSerializerc                R   	 t        | t        j                        }|j                  d      }|st	        ddit        j                        S |j                  d      |j                  dd      |j                  d	      |j                  d
      |j                  d      d}t        j                  j                  ||      \  }}|s_g }|j                         D ]6  \  }	}
|
	t        ||	      |
k7  st        ||	|
       |j!                  |	       8 |r|j#                  |       |r`|j$                  sT	 t        j                  j                  |      }|j&                  |j&                  k7  r||_        |j#                  dg       t-        j.                  |      }t	        t        |j0                        t        |      |j&                  |j2                  |j4                  |j6                  |j8                  |j:                  |j<                  t        |j>                        t        |j@                        |jB                  |j$                  dd      S # t        $ r0}t	        dt        |      it        j                        cY d}~S d}~ww xY w# t        j*                  $ r Y w xY w)z@Shared logic for authenticating a user from an initData payload.errorr   NidzInvalid user datausername
first_name 	last_namelanguage_code	photo_url)r    r!   r#   r$   r%   )telegram_user_iddefaults)update_fields)referral_codereferred_byr   r&   r    r!   r#   r$   r%   credit_balancebonus_balancer)   r*   accessrefreshuser)"r   r   TELEGRAM_BOT_TOKENr   r   strr   HTTP_401_UNAUTHORIZEDgetHTTP_400_BAD_REQUESTr   objectsget_or_createitemsgetattrsetattrappendsavereferred_by_idr   r*   DoesNotExistr   for_useraccess_tokenr&   r    r!   r#   r$   r%   r,   r-   r)   )	init_datastart_param	user_dataexcr&   r'   r1   createdchanged_fieldsfieldvaluereferrerr0   s                A/home/cursorai/projects/telegram-earn/backend/apps/users/views.py_authenticate_with_init_datarL   $   s]   	
/''
	 !}}T*)*..
 	
 MM*-mmL"5]];/"7]];/H LL..) / MD' $&$NN,LE5 WT5%9U%BeU+%%e, - IINI3 4..	||''k'BH{{dgg%#+ 			8 ##D)G'../7|gg$($9$9 MM"oo!^^!%!3!3!^^"%d&9&9":!$T%7%7!8!%!3!3#22	
 a ' 
c#h//
 	

V    		s0   I 4AJ 	J%JJJJ&%J&z(Missing or invalid init_data/start_param)descriptionz$Telegram signature validation failed)       z@Authenticate a user via Telegram WebApp initData and issue JWTs.)request	responsesrM   POSTc                    | j                   j                  d      }| j                   j                  d      }|st        ddit        j                        S t        ||      S )zN
    Authenticate a user using Telegram Web App initData and return JWTs.
    rB   rC   r   init_data is requiredr   )datar5   r   r   r6   rL   )rQ   rB   rC   s      rK   authenticate_telegramrW   p   s]       -I,,""=1K-...
 	

 (	;??    zMissing init_datazSignature validation failedzDev auth disabled)rN   rO   rP     zDevelopment-only Telegram auth helper. Validates a signed initData payload and returns JWTs plus signature debug info. Only available when DEBUG=True and ENABLE_DEV_TELEGRAM_AUTH=True.c                X   t         j                  rt        t         dd      st        t        j
                        S | j                  j                  d      }| j                  j                  d      }|st        ddit        j                        S t        |t         j                        }t        j                  d|j                  d	      |j                  d
             t        ||      }|j                  t        j                  k(  r!t!        |j                        }||d<   ||_        |S )zT
    Dev-only helper endpoint to test Telegram auth flows without the Mini App.
    ENABLE_DEV_TELEGRAM_AUTHFr   rB   rC   r   rU   z<Dev Telegram auth debug: provided_hash=%s calculated_hash=%sprovided_hashcalculated_hashdebug)r   DEBUGr:   r   r   HTTP_404_NOT_FOUNDrV   r5   r6   r   r2   loggerinforL   status_codeHTTP_200_OKdict)rQ   rB   rC   
debug_inforesponsepayloads         rK   authenticate_telegram_devri      s    ( NNwx1KUSv8899  -I,,""=1K-...
 	

 *##J KKF'() ,I{CHv111x}}%%OrX   zMissing usernamez#User not found or Dev auth disabled)rN   rO   rY   zDevelopment-only helper to switch the authenticated user by username. Only available when DEBUG=True and ENABLE_DEV_TELEGRAM_AUTH=True.c                :   t         j                  rt        t         dd      st        t        j
                        S | j                  j                  d      }|st        ddit        j                        S 	 t        j                  j                  |      }t        j                  |      }t        t        |j                        t        |      |j                   |j"                  |j$                  |j&                  |j(                  |j*                  |j,                  t        |j.                        t        |j0                        |j2                  |j4                  d
d      S # t        j                  $ r$ t        dd| d	it        j
                        cY S w xY w)z=
    Dev-only helper to switch user context by username.
    r[   Fr   r    r   zusername is required)r    zUser with username 'z' not foundr+   r.   )r   r_   r:   r   r   r`   rV   r5   r6   r   r7   r?   r   r@   r3   rA   r   r&   r    r!   r#   r$   r%   r,   r-   r)   r>   )rQ   r    r1   r0   s       rK   switch_user_devrk      sZ   $ NNwx1KUSv8899||
+H,-..
 	


||2 ##D)G'../7|gg$($9$9 MM"oo!^^!%!3!3!^^"%d&9&9":!$T%7%7!8!%!3!3#22	
   
,XJkBC,,
 	

s   7 E# #4FFc                      e Zd ZdZ edeid      d        Z ed ed      id       ed	d
g      d               Z	y)	MeViewSetz/Endpoints for current user profile and wallets.rN   z*Retrieve the authenticated user's profile.)rR   rM   c                V    t        |j                        }t        |j                        S )z4GET /api/users/me/ returns the current user profile.)r   r1   r   rV   )selfrQ   
serializers      rK   listzMeViewSet.list   s!     9F

((rX   Tmanyz8Retrieve all wallet balances for the authenticated user.Fr5   )detailmethodsc                    |j                   }dd|j                  ddd|j                  dg}t        |d      }t	        |j
                        S )z7GET /api/users/me/wallets/ returns all wallet balances.Primaryr,   )nametypebalanceBonusbonusTrr   )r1   r,   r-   r   r   rV   )ro   rQ   r1   walletsrp   s        rK   r}   zMeViewSet.wallets  sR     ||(8TEXEXYg$:L:LM
 *'=

((rX   N)
__name__
__module____qualname____doc__r   r   rq   r   r   r}    rX   rK   rm   rm      se    9;<@)	)
 ,$78N 55'*) +	
)rX   rm   )rN     zbWebhook for Telegram bot updates. Returns ok/forbidden depending on the configured webhook secret.c                   t         j                  }| j                  j                  d      }|r||k7  rt	        dddd      S | j
                  xs i }|j                  d      xs |j                  d      }|j                  d	      }d
}d}|r(|j                  d      }|j                  dd      xs d}n>|r<|j                  d      xs i }|j                  d      }|j                  dd      xs d}|rd|vrt	        ddi      S |d   }d
}	|j                  d      r6|j                  d      }
t        |
      dkD  r|
d   j                         nd
}	n|r|j                  d      r|d   }	t        t         dd      }|}|r|	rd|v rdnd}| | d|	 }|rdd|idggddd}d}nd
}d}t        t         j                  |||      }|st        j                  d |       t	        ddi      S )!zV
    Receive Telegram webhook updates and handle /start deep links for referrals.
    zX-Telegram-Bot-Api-Secret-TokenF	forbidden)okr   r   r   messageedited_messagecallback_queryNr"   chattextrV   r   r   Tz/startr   )maxsplitTELEGRAM_WEBAPP_URL?&z	startapp=zOpen appurl)r   web_app)keyboardresize_keyboardone_time_keyboardzLTap the button below to open the app. Referral code is passed automatically.z2App URL is not configured. Please try again later.)	bot_tokenchat_idr   reply_markupz2Failed to reply to Telegram webhook for chat_id=%s)r   TELEGRAM_WEBHOOK_SECRETheadersr5   r   rV   
startswithsplitlenstripr:   r   r2   ra   warning)rQ   secret_tokenheader_secretupdater   r   r   r   r   rC   partsweb_app_url
button_url	separatorr   
reply_textsents                    rK   telegram_webhookr     s"   $ 33LOO''(IJM5u{;CHH\\RFjj#Cvzz2B'CGZZ 01N DD{{6"{{62&,"	 $$Y/52{{6"!!&"-34t#t%%4jG"Kx 

A
&*-e*q.eAhnn&d	N..v6$V,($92>KJ{+-C3	#}YKyF
 
 !+$):#6  $!&
5 	
 I
 --!	D KWUT4L!!rX   )rB   r3   rC   z
str | None)2r   
__future__r   loggingdrf_spectacular.typesr   drf_spectacular.utilsr   r   rest_frameworkr   r   rest_framework.decoratorsr	   r
   r   rest_framework.permissionsr   rest_framework.responser   rest_framework_simplejwt.tokensr   django.confr   django.views.decorators.csrfr   utils.telegramr   r   r   r   modelsr   serializersr   r   r   r   r   	getLoggerr~   ra   rL   rW   ri   OBJECTrk   ViewSetrm   r   r   rX   rK   <module>r      s   1 "  . @ + J J / , 8   4    
		8	$IX )+)ST)OP
 S 
6(XJ@   @  )+)<=)FG)<=		= 
6(XJ      F +);<)NO	L 
6(XJ*   *Z)   )8 ..
	%
 
6(XJI"   
 I"rX   