
    i$                        d dl Z d dlZd dlmZ  e             d ZddedefdZ	 	 	 ddeded	eded
edefdZ	dededefdZ
dededz  dedefdZdedefdZdded
edeeef         fdZded
eddfdZded
eddfdZdS )    N)load_dotenvc            
         t          j        t          j        dd          t	          t          j        dd                    t          j        dd          t          j        dd          t          j        d	d
          d          S )NDB_HOST	localhostDB_PORTi  DB_USER	msmharbi2DB_PASSWORDz8vGi)aiRm72WtH06DB_NAMEmy_mediautf8mb4)hostportuserpassworddatabasecharset)pymysqlconnectosgetenvint     )/var/www/html/my_media/telegram_bot/db.pyget_connectionr      sr    ?Yy+..9d++,,Yy+..=*<==9j11   r   urltelegram_user_idc                    t                      }	 |                    t          j        j                  5 }|r|                    d| |f           n|                    d| f           |                                cddd           |                                 S # 1 swxY w Y   	 |                                 dS # |                                 w xY w)zFReturns the existing row if URL already saved by this user, else None.z<SELECT * FROM links WHERE url = %s AND telegram_user_id = %sz"SELECT * FROM links WHERE url = %sN)r   cursorr   cursors
DictCursorexecutefetchoneclose)r   r   conncurs       r   check_duplicater(      s
   D[[344 	" JR*+   
 @3&III<<>>	" 	" 	" 	" 	" 	" 	" 	

	" 	" 	" 	" 	" 	" 	" 	" 	" 	



s/   $B= AB:B= BB= "B#B= =C        	link_typedescriptionfile_size_mbreturnc           	      l   t                      }	 |                                5 }|                    d| ||||f           |                                 |j        cddd           |                                 S # 1 swxY w Y   	 |                                 dS # |                                 w xY w)z,Insert into links table. Returns new row id.zfINSERT INTO links (url, type, description, telegram_user_id, file_size_mb) VALUES (%s, %s, %s, %s, %s)Nr   r    r#   commit	lastrowidr%   )r   r*   r+   r   r,   r&   r'   s          r   	save_linkr2   (   s     D
[[]] 	!cKK.i.>M  
 KKMMM=	! 	! 	! 	! 	! 	! 	! 	

	! 	! 	! 	! 	! 	! 	! 	! 	! 	



s.   B 6A;B ;A??B A?B B3link_id	file_pathc                 f   t                      }	 |                                5 }|                    d| |f           |                                 |j        cddd           |                                 S # 1 swxY w Y   	 |                                 dS # |                                 w xY w)z,Insert into media table. Returns new row id.z6INSERT INTO media (link_id, file_path) VALUES (%s, %s)Nr/   )r3   r4   r&   r'   s       r   
save_mediar6   >   s    D	[[]] 	!cKKH)$   KKMMM=	! 	! 	! 	! 	! 	! 	! 	

	! 	! 	! 	! 	! 	! 	! 	! 	! 	



s.   B 3A8B 8A<<B ?A< B B0tg_idusername
first_namec                    t                      }	 |                    t          j        j                  5 }|                    d| ||pdf           |j        dk    }|r~|                    d           |                                }|r|d         nd}|r|d         nd}|r|d	         nd
}	|                    d| |||	f           |                    d| f           |                                 |cddd           |	                                 S # 1 swxY w Y   	 |	                                 dS # |	                                 w xY w)z
    Register Telegram user if not exists.
    Assigns Free plan automatically.
    Returns True if newly registered, False if already existed.
    z^INSERT IGNORE INTO telegram_users (telegram_user_id, username, first_name) VALUES (%s, %s, %s) r   zgSELECT id, storage_limit_mb, file_limit FROM subscription_plans WHERE price = 0 ORDER BY id ASC LIMIT 1id   storage_limit_mb   
file_limit2   zINSERT INTO telegram_subscriptions (telegram_user_id, plan_id, storage_limit_mb, file_limit, expires_at, status) VALUES (%s, %s, %s, %s, NULL, 'active')zDINSERT IGNORE INTO user_storage_stats (telegram_user_id) VALUES (%s)N)
r   r    r   r!   r"   r#   rowcountr$   r0   r%   )
r7   r8   r9   r&   r'   is_newplanplan_id
storage_mbr@   s
             r   ensure_telegram_userrG   O   s    D%[[344 "	KK&*"23  
 \A%F >   ||~~:>EtDzzA;?Ht$677S
;?GtL11R
 > GZ<	   ZH  
 KKMMME"	 "	 "	 "	 "	 "	 "	H 	

I"	 "	 "	 "	 "	 "	 "	 "	 "	H 	



s/   $D3 B<D0D3 DD3 DD3 3E	c           	         t                      }	 |                    t          j        j                  5 }|                    d| f           |                                }|s*dddddddd	cddd           |                                 S t          |d
                   |d
<   |cddd           |                                 S # 1 swxY w Y   	 |                                 dS # |                                 w xY w)z
    Returns current quota and usage for a Telegram user.
    Keys: plan_name, storage_limit_mb, file_limit, file_count,
          storage_used_mb, expires_at, sub_status
    a  
                SELECT
                    sp.name                                AS plan_name,
                    ts.storage_limit_mb,
                    ts.file_limit,
                    ts.expires_at,
                    ts.status                              AS sub_status,
                    COALESCE(uss.file_count,      0)       AS file_count,
                    COALESCE(uss.storage_used_mb, 0)       AS storage_used_mb
                FROM telegram_subscriptions ts
                JOIN subscription_plans sp ON sp.id = ts.plan_id
                LEFT JOIN user_storage_stats uss
                  ON uss.telegram_user_id = ts.telegram_user_id
                WHERE ts.telegram_user_id = %s
                ORDER BY ts.id DESC
                LIMIT 1
                Freer?   rA   r   r)   Nnone)	plan_namer>   r@   
file_countstorage_used_mb
expires_at
sub_statusrM   )	r   r    r   r!   r"   r#   r$   r%   float)r7   r&   r'   rows       r   get_user_quotarR      sg    D$[[344 !	KK" %  ( ,,..C 	(.(+(*()(+(,(. /!	 !	 !	 !	 !	 !	 !	F 	

 &+3/@+A%B%BC!"C!	 !	 !	 !	 !	 !	 !	F 	

G!	 !	 !	 !	 !	 !	 !	 !	 !	F 	



s:   $C( 7C+C( C%C( C

C( C
C( (C>c                 j   t          |           }|d         dk    rdS |d         |z   |d         k    rOt          |d         d          }|d         }t          |d          }d| d| d	}|d
k    r	|d| d	z  }|dz  }d|fS |d         )|d         |d         k    rdd|d          d|d          dfS dS )zX
    Check if user can upload.
    Returns (True, '') or (False, 'reason message').
    rO   expired)FuP   ⚠️ انتهى اشتراكك. تواصل مع المسؤول للتجديد.rM   r>   r=   u?   ❌ لا توجد مساحة كافية!

💾 التخزين: zMB / zMB
r   u   📦 حجم الملف: u<   
تواصل مع المسؤول لزيادة المساحة.Fr@   NrL   u?   ❌ وصلت إلى حد الملفات!

📁 الملفات: z / u0   

تواصل مع المسؤول للترقية.)Tr;   )rR   round)r7   r,   qusedlimitsizemsgs          r   
can_uploadr[      s4   
 	uA 	)##hh 		l*Q/A-BBBa)*A..$%lA&&;$(; ;/4; ; ; 	 !8d8888CNNcz 	"q!L/'I'I>$%lO> >89,> > >
 	
 8r   c                 0   t                      }	 |                                5 }|                    d| ||f           |                                 ddd           n# 1 swxY w Y   |                                 dS # |                                 w xY w)z@Increment file count and storage used after a successful upload.zINSERT INTO user_storage_stats (telegram_user_id, file_count, storage_used_mb) VALUES (%s, 1, %s) ON DUPLICATE KEY UPDATE   file_count      = file_count + 1,   storage_used_mb = storage_used_mb + %sNr   r    r#   r0   r%   r7   r,   r&   r'   s       r   record_uploadr_      s    D[[]] 
	cKK; l3   KKMMM
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 	



s.   A? .AA? A""A? %A"&A? ?Bc                 .   t                      }	 |                                5 }|                    d|| f           |                                 ddd           n# 1 swxY w Y   |                                 dS # |                                 w xY w)z7Decrement file count and storage used after a deletion.zUPDATE user_storage_stats SET   file_count      = GREATEST(0, file_count - 1),   storage_used_mb = GREATEST(0, storage_used_mb - %s) WHERE telegram_user_id = %sNr]   r^   s       r   record_deletera      s    D[[]] 	cKK. u%   KKMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	



s.   A> -AA> A!!A> $A!%A> >B)N)NNr)   )r)   )r   r   dotenvr   r   strr   r(   rP   r2   r6   boolrG   dictrR   tupler[   r_   ra   r   r   r   <module>rg      s   				                ,   	  	
  	   ,      ", ,sTz ,s ,t , , , ,b+# +$ + + + +\! !c ! !tSy9I ! ! ! !L E d    & E d      r   