U
    vhm=                     @   s   d 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	 ddl
mZmZ ddlmZ ddlZddlmZmZ dd	lmZ ejejd
d eeZG dd dZdd Zedkree  dS )uq   
Скрипт для получения аналитики использования AI-КАЛОРИЯ бота
    N)datetime	timedelta)DictAnyList)defaultdict)create_enginefunc)sessionmaker)Base
FoodRecord)Configz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatc                   @   s   e Zd ZdZdd Zdd Zeeef dddZ	d!e
eeeef  d
ddZd"e
eeeef  d
ddZd#e
eeeef  dddZeeeef  dddZeeef dddZd$e
eeef dddZd%e
dddZd&ee
ddd ZdS )'BotAnalyticsu@   Класс для получения аналитики ботаc                 C   s,   t  }t|d | _tdd| jd| _dS )u-   Инициализация аналитикиurlF)Z
autocommitZ	autoflushbindN)r   Zget_database_configr   Zenginer
   SessionLocal)selfZ	db_config r   J/var/www/u0236315/data/www/consultsolution.ru/ai-calories-app/analytics.py__init__   s    zBotAnalytics.__init__c                 C   s   |   S )u5   Получение сессии базы данных)r   )r   r   r   r   get_session#   s    zBotAnalytics.get_session)returnc           	   	   C   s  |   }z|tttj }|ttj	 }|t
tj pTd}|ttj  }|ttj  }|dkr|| nd}|dkr|| nd}||t|t|dt|d|r|jdnd|r|jdnddW S |  X dS )u2   Получение общей статистикиr      z%d.%m.%Y %H:%MN)total_userstotal_recordstotal_caloriesavg_records_per_useravg_calories_per_recordfirst_record_datelast_record_date)r   closequeryr	   countdistinctr   user_idZscalaridsumcaloriesorder_by
created_atZascfirstdescfloatroundstrftime)	r   sessionr   r   r   first_recordlast_recordr   r   r   r   r   get_general_stats'   s$    

zBotAnalytics.get_general_stats
   )limitr   c              
   C   s   |   }z|tjtjttj	dt
tj	dttj	dttj	dtjtjttj | }dd |D W S |  X dS )uN   Получение топ пользователей по активностиrecords_countr   r2   r3   c              
   S   s`   g | ]X}|j |jpd |j  |j|jr0t|jnd|jd|jd|j|j jd dqS )Zuser_r   %d.%m.%Y   )r&   usernamer7   r   r2   r3   days_active)	r&   r:   r7   r   r.   r2   r0   r3   days).0userr   r   r   
<listcomp>Z   s   


z.BotAnalytics.get_top_users.<locals>.<listcomp>N)r   r"   r#   r   r&   r:   r	   r$   r'   labelr(   r)   minr+   maxgroup_byr*   r-   r6   all)r   r6   r1   usersr   r   r   get_top_usersH   s*    

zBotAnalytics.get_top_users   c                 C   sz   |   }zb|tjttjdt	tj
dtjttj | }dd |D W S |  X dS )u,   Получение топ продуктовr$   avg_caloriesc                 S   s2   g | ]*}|j |j|jr&tt|jd nddqS )r   r   )	food_namer$   rH   )rI   r$   rH   r/   r.   )r=   foodr   r   r   r?   w   s
   z.BotAnalytics.get_top_foods.<locals>.<listcomp>N)r   r"   r#   r   rI   r	   r$   r'   r@   avgr)   rC   r*   r-   r6   rD   )r   r6   r1   Zfoodsr   r   r   get_top_foodsi   s"    

	zBotAnalytics.get_top_foods   )r<   r   c              	   C   s6  |   }zt t|d }|ttj|k	 }t
dd }|D ]R}|j d}|| d  d7  < || d  |j7  < || d |j qHg }t|D ]v}	t t||	 d d  }
|
d}||d	d	t d
}||
d|d tt|d dt|d d q|W S |  X dS )u5   Получение активности по днямr<   c                   S   s   ddt  dS )Nr   recordsr)   rE   )setr   r   r   r   <lambda>       z1BotAnalytics.get_daily_activity.<locals>.<lambda>z%Y-%m-%drP   r9   r)   rE   r   rO   r8   r   )dater7   r   active_usersN)r   r"   r   utcnowr   r#   r   filterr+   rD   r   rT   r0   r)   addr&   rangegetrQ   appendr/   r.   len)r   r<   r1   Z
start_daterP   Zdaily_statsrecordZdate_keyresultirT   statsr   r   r   get_daily_activity   s2    



zBotAnalytics.get_daily_activityc                 C   s   |   }zr|t }tt}|D ]}|jj}||  d7  < q$g }t	dD ]$}|
|dd||dd qN|W S |  X dS )u7   Получение активности по часамr9      Z02dz:00r   )hourr7   N)r   r"   r#   r   rD   r   intr+   rc   rY   r[   rZ   )r   r1   rP   Zhourly_statsr]   rc   r^   r   r   r   get_hourly_activity   s    


z BotAnalytics.get_hourly_activityc                 C   s   |   }z|tjttjdt	tjdt
tttjdtj }|stdddddW zS tdd |D }t|| }tdd |D t| }t|||t|d	t|dkrt|t| d
 d	nddW S |  X dS )uZ   Получение статистики по удержанию пользователейr2   r3   active_daysr   )r   returning_usersone_time_usersavg_active_daysc                 s   s$   | ]}|j |j jd krdV  qdS )r   r9   N)r3   r2   r<   r=   ur   r   r   	<genexpr>   s      z2BotAnalytics.get_user_retention.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S )N)rf   rj   r   r   r   rl      s     r   d   )r   rg   rh   ri   returning_rateN)r   r"   r#   r   r&   r	   rA   r+   r@   rB   r$   r%   rT   rC   rD   r(   r\   r/   )r   r1   rE   rg   rh   ri   r   r   r   get_user_retention   s4    
$
zBotAnalytics.get_user_retentionc              	   C   sV   t d t d||  |  | d| d| 	|| 
 d}t d |S )u2   Получение полной аналитикиu   Сбор аналитики...z%d.%m.%Y %H:%M:%Sr5   rG   )generated_atperiod_daysgeneral_statsuser_retention	top_users	top_foodsdaily_activityhourly_activityu0   Аналитика собрана успешно)loggerinfor   rV   r0   r4   ro   rF   rL   ra   re   )r   r<   	analyticsr   r   r   get_full_analytics   s    

zBotAnalytics.get_full_analyticsrN   c              
   C   sT  |  |}td td td td|d   td|d  d td	 td
 td |d }td|d   td|d   td|d dd td|d   td|d dd |d rtd|d   |d rtd|d   td	 td td |d }td|d   td |d!  d"|d# d$d% td&|d'   td(|d)   td	 td* td t|d+ d,D ]T\}}t| d-|d.  d/|d0  d1 td2|d3  d4|d dd5|d6   qtd	 td7 td t|d8 d,D ]8\}}t| d-|d9  d:|d;  d<|d= dd> qtd	 td? td |d@ }|rtdAdB |D nd,}	|D ]P}
|	dCkrt|
d3 |	 dD ndC}dE| }t|
dF  d:| dG|
d3   qtd	 tdH td |dI dJdK }|D ]8}t|dL  dM|d3  dN|dO  dP|d dd qtd dKS )Qu/   Вывод аналитики в консольzQ
================================================================================u2   📊 АНАЛИТИКА AI-КАЛОРИЯ БОТАzP================================================================================u   Дата генерации: rp   u   Период анализа: rq   u	    днейzQ
--------------------------------------------------------------------------------u$   📈 ОБЩАЯ СТАТИСТИКАzP--------------------------------------------------------------------------------rr   u,   👥 Всего пользователей: r   u    📝 Всего записей: r   u    🔥 Всего калорий: r   z,.0fu	    ккалu@   📊 Средние записи на пользователя: r   u:   🍽️  Средние калории на запись: r   z.0fr    u    📅 Первая запись: r!   u&   📅 Последняя запись: u2   🔄 УДЕРЖАНИЕ ПОЛЬЗОВАТЕЛЕЙrs   u#   🔁 Возвращающихся: rg   z (rn   z.1fz%)u   1️⃣  Разовых: rh   u/   📅 Среднее активных дней: ri   u:   🏆 ТОП-10 АКТИВНЫХ ПОЛЬЗОВАТЕЛЕЙrt   r9   z. r:   z (ID: r&   )u      📝 Записей: r7   u    | 🔥 Калорий: u'    | 📅 Дней активности: r;   u%   🍽️  ТОП-20 ПРОДУКТОВru   rI   z: r$   u    раз (сред. rH   u
    ккал)u(   ⏰ АКТИВНОСТЬ ПО ЧАСАМrw   c                 s   s   | ]}|d  V  qdS )r7   Nr   )r=   hr   r   r   rl   +  s     z/BotAnalytics.print_analytics.<locals>.<genexpr>r   (   u   █rc    uG   📅 АКТИВНОСТЬ ПО ДНЯМ (последние 7 дней)rv   iNrT   u   : 📝 u    записей | 👥 rU   u#    пользователей | 🔥 )r{   print	enumeraterB   rd   )r   r<   rz   r`   Z	retentionr_   r>   rJ   ZhourlyZmax_recordsZ	hour_dataZ
bar_lengthZbarZrecent_daysdayr   r   r   print_analytics   sl    
 ",2"$6zBotAnalytics.print_analyticsNfilenamer<   c              	   C   sv   |dkrdt  d d}| |}t|ddd}tj||dd	d
 W 5 Q R X td|  t	d|  |S )u8   Сохранение аналитики в файл JSONNZ
analytics_z%Y%m%d_%H%M%Sz.jsonwzutf-8)encodingFr   )ensure_asciiindentu3   Аналитика сохранена в файл: u8   
✅ Аналитика сохранена в файл: )
r   rV   r0   r{   openjsondumprx   ry   r   )r   r   r<   rz   fr   r   r   save_analytics_to_file>  s    
z#BotAnalytics.save_analytics_to_file)r5   )rG   )rM   )rM   )rM   )NrM   )__name__
__module____qualname____doc__r   r   r   strr   r4   rd   r   rF   rL   ra   re   ro   r{   r   r   r   r   r   r   r      s   !!%!Kr   c               
   C   s   ddl } | jdd}|jdtddd |jd	d
dd |jdtdd | }z0t }|j|jd |j	r||j
|j|jd W nF tk
r } z(td|  td|  W Y dS d}~X Y nX dS )u   Главная функцияr   Nu-   Аналитика AI-КАЛОРИЯ бота)descriptionz--daysrM   uQ   Количество дней для анализа (по умолчанию: 30))typedefaulthelpz--save
store_trueu6   Сохранить аналитику в JSON файл)actionr   z--outputu?   Имя файла для сохранения (если --save))r   r   rN   r   u;   Ошибка при получении аналитики: u   
❌ Ошибка: r9   )argparseArgumentParseradd_argumentrd   r   
parse_argsr   r   r<   saver   output	Exceptionrx   errorr   )r   parserargsrz   er   r   r   mainN  s     r   __main__)r   loggingr   r   typingr   r   r   collectionsr   Z
sqlalchemyr   r	   Zsqlalchemy.ormr
   r   Zdatabaser   r   configr   basicConfigINFO	getLoggerr   rx   r   r   exitr   r   r   r   <module>   s(   
  6