U
    {zhL                     @   s`   d Z ddlZddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
 eeZG dd dZdS )uK   
Модуль аналитики для AI-Иллюстратор бота
    N)datetime	timedelta)DictListAnyOptionalc                   @   s  e Zd ZdZd$edddZdd Zd%eeeed	d
dZd&eeee	dddZ
eeef dddZd'eeeeef  dddZ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d)eeeeef  dd d!Zedd"d#ZdS )*BotAnalyticsu?   Класс для работы с аналитикой ботаbot_illustrator.db)db_pathc                 C   s"   || _ |   td|  dS )u:   Инициализация модуля аналитикиuI   📊 Инициализирована аналитика бота, БД: N)r
   init_databaseloggerinfo)selfr
    r   >/var/www/u0236315/data/www/consultsolution.ru/bot_analytics.py__init__   s    zBotAnalytics.__init__c              
   C   s   znt | j}| }|d |d |d |d |d |d |  |  td W n4 t	k
r } zt
d|   W 5 d	}~X Y nX d	S )
u3   Создание таблиц базы данныхa  
                CREATE TABLE IF NOT EXISTS users (
                    user_id INTEGER PRIMARY KEY,
                    username TEXT,
                    first_name TEXT,
                    last_name TEXT,
                    first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    last_activity TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    is_subscribed INTEGER DEFAULT 1,
                    total_generations INTEGER DEFAULT 0
                )
            a  
                CREATE TABLE IF NOT EXISTS generations (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    user_id INTEGER,
                    generation_type TEXT,
                    prompt TEXT,
                    success INTEGER DEFAULT 1,
                    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    FOREIGN KEY (user_id) REFERENCES users (user_id)
                )
            a  
                CREATE TABLE IF NOT EXISTS hourly_activity (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    user_id INTEGER,
                    activity_hour INTEGER,
                    activity_date DATE,
                    count INTEGER DEFAULT 1,
                    FOREIGN KEY (user_id) REFERENCES users (user_id)
                )
            zJCREATE INDEX IF NOT EXISTS idx_generations_user_id ON generations(user_id)zNCREATE INDEX IF NOT EXISTS idx_generations_timestamp ON generations(timestamp)zUCREATE INDEX IF NOT EXISTS idx_hourly_activity_date ON hourly_activity(activity_date)uI   ✅ База данных инициализирована успешноuC   ❌ Ошибка инициализации базы данных: N)sqlite3connectr
   cursorexecutecommitcloser   r   	Exceptionerror)r   connr   er   r   r   r      s    





zBotAnalytics.init_databaseN)user_idusername
first_name	last_namec           	   
   C   s   zt | j}| }|d|f | }|rV|d||||f td|  n,|d||||f td| d| d |	  |
  W n8 tk
r } ztd| d	|  W 5 d
}~X Y nX d
S )uK   Регистрация или обновление пользователяz+SELECT user_id FROM users WHERE user_id = ?z
                    UPDATE users 
                    SET username = ?, first_name = ?, last_name = ?, 
                        last_activity = CURRENT_TIMESTAMP
                    WHERE user_id = ?
                u*   Обновлен пользователь z
                    INSERT INTO users (user_id, username, first_name, last_name)
                    VALUES (?, ?, ?, ?)
                uG   ✅ Зарегистрирован новый пользователь z (@)uA   ❌ Ошибка регистрации пользователя z: N)r   r   r
   r   r   fetchoner   debugr   r   r   r   r   )	r   r   r   r   r   r   r   existsr   r   r   r   register_userS   s$    

zBotAnalytics.register_user T)r   generation_typepromptsuccessc           	   
   C   s   zt | j}| }|d||||r*dndf |rD|d|f t }|d||j| f |	  |
  td| d| d|  W n2 tk
r } ztd	|  W 5 d
}~X Y nX d
S )u@   Логирование генерации изображенияz
                INSERT INTO generations (user_id, generation_type, prompt, success)
                VALUES (?, ?, ?, ?)
               r   z
                    UPDATE users 
                    SET total_generations = total_generations + 1,
                        last_activity = CURRENT_TIMESTAMP
                    WHERE user_id = ?
                z
                INSERT INTO hourly_activity (user_id, activity_hour, activity_date)
                VALUES (?, ?, ?)
                ON CONFLICT DO NOTHING
            u"   📊 Логирование: user=z, type=z
, success=u<   ❌ Ошибка логирования генерации: N)r   r   r
   r   r   r   nowhourdater   r   r   r   r   r   )	r   r   r&   r'   r(   r   r   r*   r   r   r   r   log_generationu   s&     zBotAnalytics.log_generation)returnc              
   C   s  zt | j}| }|d | d }|d | d }|d | d }|d | d }|dkr~|| nd}|d | d }|d | d }	|  ||||t|d||	d	W S  tk
r }
 zt	
d
|
  i  W Y S d}
~
X Y nX dS )u2   Получение общей статистикиzSELECT COUNT(*) FROM usersr   z2SELECT COUNT(*) FROM generations WHERE success = 1z
                SELECT COUNT(DISTINCT user_id) FROM generations 
                WHERE timestamp >= datetime('now', '-1 day')
            z
                SELECT COUNT(DISTINCT user_id) FROM generations 
                WHERE timestamp >= datetime('now', '-7 days')
            z!SELECT MIN(first_seen) FROM usersz&SELECT MAX(timestamp) FROM generations   )total_userstotal_generationsactive_users_24hactive_users_7davg_generations_per_userfirst_registrationlast_activityuE   ❌ Ошибка получения общей статистики: N)r   r   r
   r   r   r!   r   roundr   r   r   )r   r   r   r0   r1   r2   r3   Zavg_generationsr5   r6   r   r   r   r   get_general_stats   s8    






zBotAnalytics.get_general_stats
   )limitr.   c              
   C   s   z~t | j}| }|d|f | }|  g }|D ]<}||d |d pTd|d p^d|d |d |d	 d
 q<|W S  tk
r } zt	
d|  g  W Y S d}~X Y nX dS )ua   Получение топ пользователей по количеству генерацийa\  
                SELECT 
                    u.user_id,
                    u.username,
                    u.first_name,
                    u.total_generations,
                    u.first_seen,
                    u.last_activity
                FROM users u
                ORDER BY u.total_generations DESC
                LIMIT ?
            r   r)      Неизвестноr/   u   Пользователь         )r   r   r   r1   Z
first_seenr6   uG   ❌ Ошибка получения топ пользователей: Nr   r   r
   r   r   fetchallr   appendr   r   r   )r   r:   r   r   results	top_usersrowr   r   r   r   get_top_users   s,    


	zBotAnalytics.get_top_usersc              
   C   s   zRt | j}| }|d | }|  i }|D ]}|d ||d < q8|W S  tk
r } zt	d|  i  W Y S d}~X Y nX dS )uJ   Получение статистики по типам генерацийz
                SELECT generation_type, COUNT(*) as count
                FROM generations
                WHERE success = 1
                GROUP BY generation_type
                ORDER BY count DESC
            r)   r   uX   ❌ Ошибка получения статистики типов генераций: N)
r   r   r
   r   r   r@   r   r   r   r   )r   r   r   rB   ZstatsrD   r   r   r   r   get_generation_types_stats   s    
z'BotAnalytics.get_generation_types_stats   )daysr.   c              
   C   s   zdt | j}| }|d|f | }|  g }|D ]"}||d |d |d d q<|W S  tk
r } zt	
d|  g  W Y S d}~X Y nX dS )u5   Получение активности по днямa  
                SELECT 
                    DATE(timestamp) as date,
                    COUNT(*) as generations_count,
                    COUNT(DISTINCT user_id) as active_users
                FROM generations
                WHERE timestamp >= datetime('now', '-' || ? || ' days')
                  AND success = 1
                GROUP BY DATE(timestamp)
                ORDER BY date DESC
            r   r)   r/   )r,   generations_countactive_usersuI   ❌ Ошибка получения дневной активности: Nr?   )r   rH   r   r   rB   ZactivityrD   r   r   r   r   get_daily_activity  s&    

zBotAnalytics.get_daily_activityc           	   
   C   s   zt | j}| }|d | }|  dd tdD }|D ]8}|d }|d }d|  krndk rFn qF||| d< qF|W S  tk
r } zt	
d|  g  W Y S d	}~X Y nX d	S )
u7   Получение активности по часамa  
                SELECT 
                    CAST(strftime('%H', timestamp) AS INTEGER) as hour,
                    COUNT(*) as count
                FROM generations
                WHERE success = 1
                GROUP BY hour
                ORDER BY hour
            c                 S   s   g | ]}|d dqS )r   )r+   countr   ).0ir   r   r   
<listcomp>K  s     z4BotAnalytics.get_hourly_activity.<locals>.<listcomp>   r   r)   rL   uM   ❌ Ошибка получения почасовой активности: N)r   r   r
   r   r   r@   r   ranger   r   r   )	r   r   r   rB   Zhourly_statsrD   r+   rL   r   r   r   r   get_hourly_activity7  s     

z BotAnalytics.get_hourly_activityc              
   C   s   zt | j}| }|d|f | }|  g }|D ]F}|t|d dkrh|d dd d n|d |d |d d q<|W S  t	k
r } zt
d	|  g  W Y S d}~X Y nX dS )
u8   Получение популярных промптовa<  
                SELECT 
                    prompt,
                    COUNT(*) as count,
                    generation_type
                FROM generations
                WHERE success = 1 AND prompt != ''
                GROUP BY prompt
                ORDER BY count DESC
                LIMIT ?
            r   d   Nz...r)   r/   )r'   rL   typeuK   ❌ Ошибка получения популярных промптов: )r   r   r
   r   r   r@   r   rA   lenr   r   r   )r   r:   r   r   rB   ZpromptsrD   r   r   r   r   get_popular_promptsY  s&    
*
z BotAnalytics.get_popular_promptsc              
   C   s  z|   }| d}|  }| d}|  }| d}d}|d7 }|d|dd d7 }|d	|d
d d7 }|d|dd d7 }|d|dd d7 }|d|dd d7 }|r|d7 }dddddd}| D ]*\}	}
||	|	}|d| d|
 d7 }q|d7 }|r|d7 }t|dD ]L\}}|d dkrTd |d  n|d! }|| d"| d|d
  d#7 }q0|d7 }|r|d$7 }|d%d D ]>}t	
|d& d'd(}|| d|d)  d*|d+  d,7 }q|d7 }|rPt|d-d. d/d0d%d1 }|d27 }|D ]2}|d3 dkr||d4 d5d6|d3  d#7 }q|d7 }|r|d77 }t|d%d1 dD ],\}}|| d8|d9  d:|d3  d;7 }qp|d<t	 d= 7 }|W S  tk
r } ztd>|  W Y d?S d%}~X Y nX d%S )@uS   Форматирование аналитики для отправки в Telegramr>   rG   uC   📊 <b>АНАЛИТИКА AI-ИЛЛЮСТРАТОР БОТА</b>

u-   📈 <b>ОБЩАЯ СТАТИСТИКА:</b>
u/   👥 Всего пользователей: <b>r0   r   z</b>
u'   🎨 Всего генераций: <b>r1   u6   📊 Среднее на пользователя: <b>r4   u$   🔥 Активных за 24ч: <b>r2   u*   📅 Активных за 7 дней: <b>r3   z</b>

u)   🎯 <b>ТИПЫ ГЕНЕРАЦИЙ:</b>
u   📝 Текстu   📸 Одно фотоu   🖼 Альбомu   🎤 Голосu   🔄 Модификация)textZphotoZalbumZvoiceZmodificationz  z: <b>
u1   🏆 <b>ТОП-5 ПОЛЬЗОВАТЕЛЕЙ:</b>
r)   r   r;   @r   z. u   </b> генераций
u2   📅 <b>АКТИВНОСТЬ ЗА 7 ДНЕЙ:</b>
Nr,   z%Y-%m-%dz%d.%m.%YrI   u   </b> генераций (rJ   u    польз.)
c                 S   s   | d S )NrL   r   )xr   r   r   <lambda>      z7BotAnalytics.format_analytics_message.<locals>.<lambda>T)keyreverser<   u$   ⏰ <b>ПИКОВЫЕ ЧАСЫ:</b>
rL   r+   Z02dz	:00 - <b>u0   ✨ <b>ПОПУЛЯРНЫЕ ПРОМПТЫ:</b>
z. "r'   z" - <b>zx</b>
u   
🕐 Обновлено: z%d.%m.%Y %H:%M:%SuB   ❌ Ошибка форматирования аналитики: u<   ❌ Ошибка формирования аналитики)r8   rE   rF   rK   rR   rV   getitems	enumerater   strptimestrftimesortedr*   r   r   r   )r   Zgeneral_statsrC   Zgeneration_typesZdaily_activityZhourly_activityZpopular_promptsmessageZ
type_namesZgen_typerL   Ztype_displayrN   userr   Zdayr,   Z
peak_hoursZ	hour_dataZprompt_datar   r   r   r   format_analytics_message|  sl    


$"&"&z%BotAnalytics.format_analytics_message)r	   )NNN)r%   T)r9   )rG   )r9   )__name__
__module____qualname____doc__strr   r   intr$   boolr-   r   r   r8   r   rE   rF   rK   rR   rV   rg   r   r   r   r   r      s.   :     #    &7'#"#r   )rk   r   jsonZloggingr   r   typingr   r   r   r   Z	getLoggerrh   r   r   r   r   r   r   <module>   s   
