U
    xh]                    @   s  d Z ddlZddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZ e  ddlZddlmZ ddlmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ejejdejddde gd eeZe eZ!e Z"eeZi Z#G dd dZ$e!j%dgdedddZ&e!j%dgdedddZ'e!j%dgdedddZ(e!j%dgdedddZ)e!j%d gdedd!d"Z*e!j+d#d$ d%d&d' Z,e!j%d(gdedd)d*Z-e!j%d+gdedd,d-Z.e!j%d.gd/edd0d1Z/e!j%d2gd/edd3d4Z0e1ee1ef e2d5d6d7Z3e1e	e1 d8d9d:Z4e1e	e1 d8d;d<Z5e1ee d8d=d>Z6e1ee d8d?d@Z7e1ee1 d8dAdBZ8dee1ef e9e9e1dCdDdEZ:e1e1d8dFdGZ;e<e1dHdIdJZ=e!j%dKd$ d%eddLdMZ>dNdO Z?e!j+dPd$ d%dQdR Z@e!j+dSd$ d%dTdU ZAe!j+dVd$ d%dWdX ZBe!j+dYd$ d%dZd[ ZCe!j+d\d$ d%d]d^ ZDe9e1d_d`daZEe9dbdcddZFe9dbdedfZGe9dbdgdhZHe!j+did$ d%djdk ZIe!j+dld$ d%dmdn ZJe!j+dod$ d%dpdq ZKe!j+drd$ d%dsdt ZLe!j+dud$ d%dvdw ZMe9e9dxdydzZNe!j+d{d$ d%d|d} ZOe!j+d~d$ d%dd ZPe!j+dd$ d%dd ZQe9e1e9dddZRedkre?  dS )u   
AI-КАЛОРИЯ - Telegram бот для отслеживания калорий с использованием OpenAI GPT
    Ndatetime)OptionalDictAnyList)load_dotenv)types)MessageInlineKeyboardMarkupInlineKeyboardButton)	BOT_TOKENOPENAI_API_KEY)DatabaseManager)OpenAIClientz4%(asctime)s - %(name)s - %(levelname)s - %(message)szai_calories_bot.logzutf-8)encoding)levelformathandlersc                   @   s   e Zd ZdZdZdS )	UserStateZwaiting_for_food_infoZ
processingN)__name__
__module____qualname__WAITING_FOR_FOOD_INFO
PROCESSING r   r   O/var/www/u0236315/data/www/consultsolution.ru/ai-calories-app/./telegram_bot.pyr   .   s   r   start)Zcommandsmessagec                 C   s   | j j}| j jp| j j}t }|tdddtddd |tdddtdd	d | j jp`d
}d| d}tj| ||dd t	
d| d| d dS )u*   Обработчик команды /start   📊 Статистика
menu_statscallback_data   🍽️ Рацион	menu_diet'   🗑️ Очистить историю
menu_clear   ℹ️ Помощь	menu_helpu   Пользовательu>   🍎 <b>Добро пожаловать в AI-КАЛОРИЯ, u	  !</b>

Я помогу вам отслеживать калории с помощью искусственного интеллекта.

📝 <b>Как пользоваться:</b>
• Отправьте голосовое сообщение с описанием того, что вы съели
• Например: <i>"Съел тарелку гречки 300 грамм"</i>
• Я проанализирую и добавлю в ваш дневник питания

🎯 <b>Выберите действие:</b>HTMLreply_markup
parse_mode   Пользователь  (u   ) запустил ботаN)	from_useridusername
first_namer   rowr   botreply_tologgerinfo)r   user_idr2   keyboardZ	user_nameZwelcome_textr   r   r   send_welcome2   s    



r;   helpc                 C   s   d}t | | dS )u)   Обработчик команды /helpu  
🤖 AI-КАЛОРИЯ - Помощь

📱 Как пользоваться:
1. Отправьте голосовое сообщение с описанием еды
2. Укажите что съели и в каком количестве
3. Получите красивый отчет с калориями

💡 Примеры сообщений:
• "Съел тарелку гречки 300 грамм"
• "Выпил стакан молока 250 мл"
• "Съел яблоко среднего размера"
• "Пицца Маргарита 2 куска"

⚠️ Важно:
• Указывайте количество (граммы, миллилитры, штуки)
• Будьте конкретны в описании
• Если информации недостаточно, я попрошу уточнить

📊 Команды:
/stats - Ваша статистика
/history - История записей
/clear - Очистить историю
Nr5   r6   )r   	help_textr   r   r   	send_helpT   s    r?   statsc                 C   s   | j j}zpt|}|s*t| d W dS d|d  d|d dd|d	 dd
|d  dt|d  d}t| | W nD tk
r } z&t	d| d|  t| d W 5 d}~X Y nX dS )u*   Обработчик команды /statsu   📊 У вас пока нет записей о питании.
Отправьте голосовое сообщение с описанием еды!Nu`   
📊 Ваша статистика питания

📅 Записей за все время: Ztotal_recordsu!   
🔥 Общие калории: total_calories.0fu-    ккал
📈 Среднее за день: Zavg_calories_per_dayu0    ккал
📆 Последняя запись: Zlast_record_dateu"   

🏆 Топ продуктов:
	top_foods
u\   Ошибка при получении статистики для пользователя : ua   ❌ Ошибка при получении статистики. Попробуйте позже.)
r0   r1   
db_managerZget_user_statsr5   r6   format_top_foods	Exceptionr7   error)r   r9   r@   Z
stats_texter   r   r   
send_statsr   s"    
	
rK   historyc              
   C   s  | j j}ztj|dd}|s.t| d W dS d}|D ]j}|d d}|d| d	7 }|d
|d  d	7 }|d|d  d|d  d	7 }|d|d dd7 }q6t|dkr|dd d }t| | W nF tk
r } z&t	
d| d|  t| d W 5 d}~X Y nX dS )u,   Обработчик команды /history
   limitu   📝 У вас пока нет записей о питании.
Отправьте голосовое сообщение с описанием еды!Nu'   📝 Последние записи:


created_atz%d.%m.%Y %H:%Mu   🕐 rD   u   🍽️ 	food_nameu   ⚖️ amount unitu   🔥 caloriesrB   u    ккал

i  u7   
... (показаны последние записи)uV   Ошибка при получении истории для пользователя rE   u[   ❌ Ошибка при получении истории. Попробуйте позже.)r0   r1   rF   Zget_user_historyr5   r6   strftimelenrH   r7   rI   )r   r9   rL   Zhistory_textrecorddate_strrJ   r   r   r   send_history   s&    rZ   clearc                 C   sX   | j j}t }tjdd| d}tjdd| d}||| tj| d|d dS )	u*   Обработчик команды /clearu   ✅ Да
clear_yes_r"   u
   ❌ НетZ	clear_no_u   ⚠️ Вы уверены, что хотите удалить всю историю записей?
Это действие нельзя отменить!r,   N)r0   r1   r	   r   r   addr5   r6   )r   r9   r:   Z
yes_buttonZ	no_buttonr   r   r   clear_history   s    r_   c                 C   s   | j dS )NZclear_data
startswithcallr   r   r   <lambda>       re   )funcc              
   C   s   | j j}| jdd }|dkrz4t| t| jd td| j	j
j| j	j W q tk
r } z(td| d|  t| jd W 5 d	}~X Y qX nt| jd
 d	S )uN   Обработчик callback для подтверждения очистки_   Zyesu"   ✅ История очищена!u@   ✅ История записей успешно очищена!uR   Ошибка при очистке истории для пользователя rE   u5   ❌ Ошибка при очистке историиNu   ❌ Отменено)r0   r1   ra   splitrF   Zclear_user_historyr5   answer_callback_queryedit_message_textr   chat
message_idrH   r7   rI   rd   r9   actionrJ   r   r   r   handle_clear_callback   s    
 "rq   dietc                 C   sv   | j j}t }|tdddtddd |tdddtdd	d |td
ddtddd tj| d|d dS )u(   Показать меню рациона   📅 Сегодня
diet_todayr"      📅 Вчераdiet_yesterday   📅 Выбрать датуdiet_select_date   📊 За неделю	diet_week   📋 Все записиZdiet_all_records#   🗑️ Удалить записьdiet_deleteO   🍽️ Выберите период для просмотра рациона:r]   N)r0   r1   r   r4   r   r5   r6   )r   r9   r:   r   r   r   show_diet_menu   s    





r   recordsc           
      C   s  | j j}zRtj|ddd}|d s6t| d W dS d|d d	  d
|d d  d}t|d dD ]R\}}|d d}|| d|d  d|d  d|d  d|d  d| d7 }qft }g }|d d r|	t
dd|d d	 d  d |d d r&|	t
dd|d d	 d  d |r6|j|  |t
dd d tj| ||d!d" W n@ tk
r }	 z td#|	  t| d$ W 5 d}	~	X Y nX dS )%u<   Показать все записи с пагинациейri   rM   pageZper_pager   8   📝 У вас пока нет записей о еде.N/   📋 **Все записи** (страница 
paginationcurrent_page/total_pages)

rP   %H:%M. **rQ   ** - rR   rS   rT   r/   rU       ккал) 🕐 rD   has_prev   ⬅️ Назадrecords_page:r"   has_next   Вперед ➡️   🏠 Главное меню	menu_backMarkdownr+   u@   Ошибка при получении всех записей: u[   ❌ Ошибка при получении записей. Попробуйте позже.)r0   r1   rF   get_user_records_paginatedr5   r6   	enumeraterV   r   appendr   r4   rH   r7   rI   )
r   r9   ra   textirX   time_strr:   nav_buttonsrJ   r   r   r   show_all_records   s.    ">$$
r   voice)Zcontent_typesc              
   C   s:  | j j}| j jp| j j}td| d| d zztj	t|< t
| d}t
| jj}t
|j}t|}|st
d| jj|j W W dS td|  t|}td|  |r|d	sH|d
d}td|  t|}	|	r t
jd|  d| jj|j|	d nt
d| d| jj|j W W dS t||}
|
rt|}	|	rt
jd|  d| jj|j|	d W W dS tj|||d |d |d |d d}t|||}t }| t!dd| dt!dd| d zt"|d }|rZt#j$%|rZt&|d}t
j'| jj|||dd W 5 Q R X t
(| jj|j nt
j|| jj|j|dd W nL t)k
r } z,t*d |  t
j|| jj|jdd! W 5 d}~X Y nX td"| d#|  W nF t)k
r" } z&t*d$| d%|  t
| d& W 5 d}~X Y nX W 5 t|d X dS )'u:   Обработчик голосовых сообщенийuU   Получено голосовое сообщение от пользователя r/   )NuM   🎤 Обрабатываю ваше голосовое сообщение...u~   ❌ Не удалось распознать речь. Попробуйте записать сообщение еще раз.u%   Распознанный текст: *   Результат анализа еды: successr   T   Не удалось проанализировать информацию о еде.$   Ошибка анализа еды: /   🤔 Уточните, какой именно     вы имели в виду:r]      ❌    

Попробуйте быть более конкретным, например:
• 'Съел тарелку гречки 300 грамм'
• 'Выпил стакан молока 250 мл'rQ   rR   rT   rU   r9   r2   rQ   rR   rT   rU      ✏️ Изменитьedit_record:r"      🗑️ Удалитьdelete_record:rbr*   chat_idphotoZcaptionr,   r-   r+   =   Ошибка при отправке изображения: r-   /   Успешно добавлена запись !    для пользователя um   Ошибка при обработке голосового сообщения от пользователя rE   r   ❌ Произошла ошибка при обработке сообщения. Попробуйте позже.)+r0   r1   r2   r3   r7   r8   user_statespopr   r   r5   r6   Zget_filer   Zfile_idZdownload_fileZ	file_pathopenai_clientZspeech_to_textrl   rm   rn   analyze_food_intakegetwarningcreate_food_variants_keyboardlowershould_ask_for_clarificationrF   add_food_recordformat_food_recordr   r4   r   get_food_imageospathexistsopen
send_photodelete_messagerH   rI   )r   r9   r2   processing_msg	file_infoZ
voice_filer   	food_info	error_msgvariants_keyboardshould_show_variants	record_idresponse_textr:   
image_pathr   rJ   r   r   r   handle_voice_message  s    

 
 

 
*"r   r   c              
   C   sT	  | j j}| j }|dr dS td| d|  |tkrLt| }t|t	r|
ddkr|
d}|rt|||}t|t	r|
drtj| jj|d	 |d
 dd t|d nt| | dS t|t	r|
ddkr|
d}|r| d| }td| d|  t|d zpz"tjt|< t| d}t|}	td|	  |	rp|	
ds|	
dd}
td|
  td|
 d| jj|j W W dS | j jp| j j}tj|||	d |	d |	d |	d d}t|	d }|r.tjd|	d  d| jj|j|d W W pdS t|	||}t }|t d d!| d"t d#d$| d" zt!|	d }|rt"j#$|rt%|d%}tj&| jj|||dd& W 5 Q R X t'| jj|j ntj|| jj|j|dd W nL t(k
r4 } z,t)d'|  tj|| jj|jdd( W 5 d}~X Y nX td)| d*|  W nF t(k
r } z&t)d+| d|  t| d, W 5 d}~X Y nX W 5 t|d X dS t|t	rL|
dd-krL|
d.}|rL| d| }td/| d|  t|d z.ztjt|< t| d}t|}	td|	  |	rR|	
ds|	
dd}
td|
  td|
 d| jj|j W W dS | j jp| j j}tj|||	d |	d |	d |	d d}t|	||}t }|t d d!| d"t d#d$| d" zt!|	d }|rlt"j#$|rlt%|d%}tj&| jj|||dd& W 5 Q R X t'| jj|j ntj|| jj|j|dd W nL t(k
r } z,t)d'|  tj|| jj|jdd( W 5 d}~X Y nX td)| d*|  W nF t(k
r4 } z&t)d+| d|  t| d, W 5 d}~X Y nX W 5 t|d X dS zztjt|< t| d}t|}	td|	  |	r|	
ds|	
dd}
td|
  t*|}|rtjd0|+  d1| jj|j|d ntd|
 d2| jj|j W W 8dS t,||	}|r\t*|}|r\tjd0|+  d1| jj|j|d W W dS | j jpl| j j}tj|||	d |	d |	d |	d d}t|	d }|rtjd|	d  d| jj|j|d W W pdS t|	||}t }|t d d!| d"t d#d$| d" zt!|	d }|rtt"j#$|rtt%|d%}tj&| jj|||dd& W 5 Q R X t'| jj|j ntj|| jj|j|dd W nL t(k
r } z,t)d'|  tj|| jj|jdd( W 5 d}~X Y nX td)| d*|  W nF t(k
	r< } z&t)d+| d|  t| d, W 5 d}~X Y nX W 5 t|d X dS )3u:   Обработчик текстовых сообщенийr   NuU   Получено текстовое сообщение от пользователя rE   rp   edit_caloriesr   r   r   r:   r*   r+   waiting_for_quantityselected_foodrS   uB   Пользователь указал количество для u;   📝 Анализирую информацию о еде...r   r   r   r   r   u   

Попробуйте быть более конкретным, например:
• '200 грамм', '1 порция', '2 штуки'rQ   rR   rT   rU   r      🍽️ Добавлено: N   

🤔 Хотите добавить гарнир или дополнение?r]   r   r   r"   r   r   r   r   r   r   r   r   um   Ошибка при обработке текстового сообщения от пользователя r   waiting_for_side_dish_quantityselected_side_dishuQ   Пользователь указал количество для гарнира r   r   r   )-r0   r1   r   striprb   r7   r8   r   
isinstancedictr   handle_calories_editr5   send_messagerm   r   r6   r   r   r   r   r   rl   rn   r2   r3   rF   r   create_side_dishes_keyboardr   r   r4   r   r   r   r   r   r   r   r   rH   rI   r   r   r   )r   r9   r   Z
state_infor   resultr   Zfull_descriptionr   r   r   r2   side_dishes_keyboardr   r:   r   r   rJ   r   r   r   r   r   r   handle_text_message  s   








 
*"




 
*"

 

 
*"r   )r   r   returnc              
   C   s   zld}d|  d| dd d}tjjjjtjd d|d	d
|d	gddd}|jd jj	
  }|dkW S  tk
r } z$td|  t| dk	 W Y S d}~X Y nX dS )ui   Определяет, нужно ли спрашивать уточнения у пользователяu  
Ты - помощник по анализу запросов о еде. Твоя задача - определить, нужно ли уточнение у пользователя.

ПРАВИЛА:
1. Если продукт слишком общий и имеет много вариантов - нужны варианты уточнения
2. Если продукт конкретный и понятный - варианты не нужны
3. Если калории 0 и продукт может иметь варианты - нужны варианты уточнения

ПРИМЕРЫ НУЖНЫХ УТОЧНЕНИЙ:
- "кофе" (может быть американо, капучино, латте и т.д.)
- "печенье" (может быть овсяное, шоколадное и т.д.)
- "каша" (может быть овсяная, манная, пшенная и т.д.)
- "суп" (может быть куриный, овощной и т.д.)
- "салат" (может быть цезарь, греческий и т.д.)
- "мясо" (может быть говядина, свинина, курица и т.д.)

ПРИМЕРЫ НЕ НУЖНЫХ УТОЧНЕНИЙ:
- "овсянка" (конкретный продукт)
- "вода" (конкретный продукт)
- "яблоко" (конкретный продукт)
- "банан" (конкретный продукт)
- "гречка с молоком" (конкретное блюдо)

Отвечай ТОЛЬКО "да" или "нет".
u+   Нужно ли уточнение для 'u   ' с калориями rU   r   ?modelsystem)ZrolecontentuserrM   g?)r   ZmessagesZ
max_tokensZtemperatureu   даuZ   Ошибка при определении необходимости уточнения: N)r   r   Zclientrm   ZcompletionsZcreateconfigchoicesr   r   r   r   rH   r7   rI   r   )r   r   Zsystem_promptZuser_promptZresponseZanswerrJ   r   r   r   r     s     


r   )rQ   r   c                    sx  ddddddgddddddgdddddd	gdddddd
gd
dddddgddddddgdddd	ddgddd	dddgdddd	ddgd
ddddd	gd
ddddd	gddddddgdd	ddddgdd d!dd"d#gd$}|    | D ]\}}| kr|  S qt fd%d&d'D r|d( S t fd)d&d*D r4|d+ S t fd,d&d-D rT|d. S t fd/d&d0D rt|d1 S t fd2d&d3D r|d4 S t fd5d&d6D r|d7 S t fd8d&d9D r|d: S t fd;d&d<D r|d= S t fd>d&d?D r|d@ S t fdAd&dBD r4|dC S t fdDd&dED rT|dF S t fdGd&dHD rt|dI S g S )Ju^   Получает популярные гарниры и дополнения для блюдаu   с картофелемu   с рисомu   с гречкойu   с макаронамиu   с овощамиu   с салатомu   с лимономu   с зеленьюu   с соусомu   с хлебомu   с сухарикамиu   со сметанойu   с чеснокомu   с молокомu   с масломu   с сахаромu   с фруктамиu   с ягодамиu   с орехамиu   с сыромu   с мясомu   с грибамиu   с морепродуктамиu   с рыбойu   с бекономu   с вареньемu   с медомu   с творогомu   с оливкамиu   с перцемu   с соевым соусомu   с васабиu   с имбиремu   с супомu   с чаем)   мясо   рыба   курицаu   котлета   суп   каша   макароныu   рис   картофель
   салат   яйца
   блины
   пицца
   роллыc                 3   s   | ]}| kV  qd S Nr   .0Zword
food_lowerr   r   	<genexpr>  s     z0get_side_dishes_and_additions.<locals>.<genexpr>)u   говядинаu   свининаu   баранинаu   телятинаr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   лососьu   трескаu
   окуньu   карпu   щукаr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   куринаяu   индейкаu   уткаu   гусьr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   борщu   щиu   солянкаu
   харчоr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   овсянаяu   маннаяu   пшеннаяu   перловаяu   ячневаяu   кукурузнаяr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   спагеттиu
   пастаu
   лапшаu   вермишельr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   жареныйu   вареныйu   печеныйu   пюреr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   цезарьu   греческийu   оливьеu   винегретr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   жареныеu   вареныеu
   омлетu   глазуньяr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   сладкиеu   соленыеu   с начинкойr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   маргаритаu   пепперониu   четыре сыраu   гавайскаяr   c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r     s     )u   филадельфияu   калифорнияu   драконu   аляскаr   )r   itemsany)rQ   side_disheskeyZsidesr   r   r   get_side_dishes_and_additions  s    													t
r   c                 C   s  ddddddgddd	d
ddgddddddgddddddgddddddgdd d!d"d#d$gd%d&d'd(d)d*gd+d,d-d.d/d0gd1d2d3d4d5d6gd7d8d9d:d;d<gd=d>d?d@dAdBgdCdDdEdFdGdHgdIdJdKdLdMdNgdOdPdQdRdSdTgdUdVdWdXdYdZgd[d\d]d^d_d`gdadbdcdddedfgdgdhdidjdkdlgdmdndodpdqdrgdsdtdudvdwdxgdydzd{d|d}d~gddddddgddddddgddddddgddddddgddddddgd}|   }| D ]$\}}||kr|dd   S qg S )uG   Получает популярные варианты продуктаu   печенье овсяноеu#   печенье шоколадноеu   печенье сахарноеu   печенье песочноеu   печенье имбирноеu   печенье с изюмомu   кофе американоu   кофе капучиноu   кофе латтеu   кофе эспрессоu   кофе моккоu   кофе флэт вайтu   чай черныйu   чай зеленыйu   чай травянойu   чай с лимономu   чай с молокомu   чай с сахаромu   сок апельсиновыйu   сок яблочныйu   сок виноградныйu   сок томатныйu   сок гранатовыйu   сок мультифруктu#   йогурт натуральныйu    йогурт с фруктамиu   йогурт греческийu   йогурт питьевойu   йогурт с ягодамиu%   йогурт обезжиренныйu   сыр российскийu   сыр чеддерu   сыр моцареллаu   сыр пармезанu   сыр фетаu   сыр творожныйu   хлеб белыйu   хлеб черныйu   хлеб ржанойu%   хлеб цельнозерновойu   хлеб с отрубямиu   хлеб бородинскийu   мясо говядинаu   мясо свининаu   мясо курицаu   мясо индейкаu   мясо баранинаu   мясо телятинаu   каша овсянаяu   каша маннаяu   каша пшеннаяu   каша перловаяu   каша ячневаяu   каша кукурузнаяu   салат овощнойu   салат цезарьu   салат греческийu   салат оливьеu   салат винегретu   салат капустныйu$   сметана 15% 1 ст.ложкаu$   сметана 20% 2 ст.ложкиu$   сметана 25% 1 ст.ложкаu   сметана 15% 100гu   сметана 20% 150гu1   сметана домашняя 1 ст.ложкаu-   масло сливочное 1 ч.ложкаu/   масло сливочное 1 ст.ложкаu"   масло сливочное 10гu3   масло растительное 1 ч.ложкаu/   масло оливковое 1 ст.ложкаu3   масло подсолнечное 1 ч.ложкаu   творог 5% 100гu   творог 9% 150гu+   творог обезжиренный 200гu#   творог домашний 100гu"   творог с изюмом 150гu&   творог с фруктами 200гu   молоко 1% 1 стаканu   молоко 2.5% 250млu    молоко 3.2% 1 стаканu-   молоко обезжиренное 200млu   молоко козье 250млu(   молоко соевое 1 стаканu   кефир 1% 1 стаканu   кефир 2.5% 250млu   кефир 3.2% 1 стаканu+   кефир обезжиренный 200млu!   кефир бифидок 250млu-   кефир с фруктами 1 стаканu"   ряженка 2.5% 1 стаканu   ряженка 4% 250млu    ряженка 6% 1 стаканu/   ряженка обезжиренная 200млu*   ряженка с фруктами 250млu.   ряженка домашняя 1 стаканu   майонез 1 ч.ложкаu    майонез 1 ст.ложкаu   майонез 15гu-   майонез легкий 1 ст.ложкаu/   майонез домашний 1 ч.ложкаu3   майонез оливковый 1 ст.ложкаu&   сосиски молочные 1 штu$   сосиски куриные 2 штu$   сосиски говяжьи 1 штu$   сосиски детские 2 штu,   сосиски диетические 1 штu&   сосиски копченые 1 штu4   колбаса докторская 2 ломтикаu.   колбаса сервелат 1 ломтикu,   колбаса салями 2 ломтикаu.   колбаса вареная 3 ломтикаu.   колбаса копченая 1 ломтикu6   колбаса диетическая 2 ломтикаu'   макароны отварные 100гu$   макароны с сыром 150гu$   макароны с мясом 200гu(   макароны с овощами 150гu3   макароны цельнозерновые 100гu&   макароны с соусом 180гu*   картофель отварной 1 штu(   картофель жареный 2 штu!   картофель пюре 150гu.   картофель запеченный 1 штu   картофель фри 100гu'   картофель тушеный 200гu   яйцо куриное 1 штu   яйца 2 штu   яйца 3 штu&   яйцо перепелиное 5 штu   яйца всмятку 2 штu   яйца вкрутую 1 штu'   курица запеченная 150гu!   курица жареная 200гu#   курица отварная 180гu   курица гриль 170гu!   курица тушеная 160гu#   курица копченая 100гu.   шоколад молочный 1 долькаu*   шоколад темный 2 долькиu   конфеты 3 штu   печенье 2 штu   торт 1 кусокu   пирожное 1 штu   яблоко 1 штu   банан 1 штu   апельсин 1 штu   груша 1 штu   персик 1 штu   виноград 100гu   помидоры 2 штu   огурцы 1 штu   морковь 1 штu   капуста 100гu   лук 1 штu   перец 1 шт)u   печеньеu   кофеu   чайu   сокu   йогуртu   сырu   хлебr   r   r   u   сметанаu
   маслоu   творогu   молокоu
   кефирu   ряженкаu   майонезu   сосискиu   колбасаr   r   r   r   u   сладостиu   фруктыu
   овощиN   )r   r   )rQ   variantsr   r   Zvariants_listr   r   r   get_popular_food_variants  s|   										                                                                  
r  c                 C   s   t | }|sdS t }tdt|dD ]T}g }tdD ]8}|| t|k r6|||  }|t|d| d q6|j|  q&|tdd|  d |S )uU   Создает клавиатуру с гарнирами и дополнениямиNr      
side_dish:r   r#   u$   ✅ Оставить как естьkeep_as_is:)r   r   rangerW   r   r   r4   )rQ   r   r:   r   r4   j	side_dishr   r   r   r   F  s&    
r   c                 C   s   t | }|sdS t }tdt|dD ]T}g }tdD ]8}|| t|k r6|||  }|t|d| d q6|j|  q&|tdd|  d |S )uN   Создает клавиатуру с вариантами продуктовNr   r  food_variant:r  u   Другой вариантfood_other:)r  r   r  rW   r   r   r4   )rQ   r  r:   r   r4   r	  Zvariantr   r   r   r   c  s&    
r   c           	   
   C   s  zt jt jtd}t j|s4t | W dS |  dddd}||dd|  dd|  g}dd	d
ddg}|D ]>}|D ]4}t j|| | }t j|r|    W S qqW dS  t	k
r } z t
d|  d|  W Y dS d}~X Y nX dS )uH   Получает путь к изображению еды из базыZimagesNrS   rh   u   ёu   е z.jpgz.jpegz.pngz.gifz.webpu?   Ошибка при поиске изображения для rE   )r   r   joindirname__file__r   makedirsr   replacerH   r7   rI   )	rQ   Z
images_dirZnormalized_nameZpossible_names
extensionsnameextr   rJ   r   r   r   r     s*    

r   )r   r   r9   r   c                 C   s   | d   }d}|r<zt|}|dd}W n   Y nX d| d| d  d| d  }t| }|rx|d	| 7 }|d
| d dd7 }|dkr|d|dd7 }|S )uT   Форматирует запись о еде в красивое сообщениеrQ   r   rA   uP   🍽️ Добавлено в дневник питания

Продукт: <b>u   </b>
Количество: rR   rS   rT   u.   

📊 Детализация калорий:
u   

✚ rU   rB   	    ккалu    [Сегодня u
    ккал])
capitalizerF   get_daily_statsr   get_calories_breakdownr   )r   r   r9   rQ   Zdaily_caloriesdaily_statsr   Zcalories_breakdownr   r   r   r     s,    
r   c              E   C   s   ddddddddd	d
ddddddddddddddddddddddddddd d!d"d"d#d$d%d%d%d%d&d'd(d)d*d*d*d*d+d+d,d,d-d-d.d.d/d/d0d0d1d1d2D}| | d3S )4ua   Возвращает детализацию калорий для комплексных блюдuG   🥧 Пирог с яблоком: 250 ккал
☕ Чай: 50 ккалu5   🍰 Торт: 350 ккал
☕ Кофе: 50 ккалu@   🍪 Печенье: 150 ккал
🥛 Молоко: 50 ккалu=   🥐 Круассан: 200 ккал
☕ Кофе: 50 ккалu7   🍩 Пончик: 150 ккал
☕ Чай: 50 ккалu:   🧁 Кекс: 250 ккал
🥛 Молоко: 50 ккалuA   🥔 Картофель: 200 ккал
🥩 Мясо: 200 ккалu5   🍚 Рис: 150 ккал
🥩 Мясо: 200 ккалu=   🍝 Макароны: 200 ккал
🧀 Сыр: 100 ккалu;   🌾 Гречка: 150 ккал
🥩 Мясо: 200 ккалu8   🥕 Овощи: 50 ккал
🥩 Мясо: 200 ккалu8   🥗 Салат: 30 ккал
🥩 Мясо: 200 ккалu5   🍲 Суп: 100 ккал
🥩 Мясо: 100 ккалu7   🍲 Борщ: 120 ккал
🥩 Мясо: 130 ккалu5   🍚 Рис: 200 ккал
🥩 Мясо: 200 ккалuA   🥔 Картофель: 150 ккал
🥩 Мясо: 200 ккалu9   🥕 Овощи: 100 ккал
🥩 Мясо: 200 ккалu;   🍳 Завтрак: 350 ккал
☕ Кофе: 50 ккалu8   🍽️ Обед: 400 ккал
🍲 Суп: 100 ккалu<   🍽️ Ужин: 300 ккал
🥗 Салат: 100 ккалu9   🍎 Перекус: 100 ккал
☕ Чай: 50 ккалu:   🍰 Полдник: 150 ккал
🧃 Сок: 50 ккалum   🥟 Хачапури по аджарски (1 шт): 400 ккал
🥟 Хинкали (6 шт): 400 ккалuW   🥟 Хачапури (1 шт): 300 ккал
🥟 Хинкали (5 шт): 350 ккалuW   🥟 Хинкали (5 шт): 400 ккал
🥟 Хачапури (1 шт): 300 ккалuK   🍣 Роллы (6 шт): 300 ккал
🍣 Суши (4 шт): 200 ккалuK   🍣 Суши (4 шт): 200 ккал
🍣 Роллы (6 шт): 300 ккалu;   🍝 Паста: 400 ккал
🥗 Салат: 100 ккалuJ   🍕 Пицца (2 куска): 500 ккал
🥗 Салат: 100 ккалu?   🍚 Ризотто: 350 ккал
🥗 Салат: 100 ккалuK   🥟 Пельмени (10 шт): 300 ккал
🥗 Салат: 100 ккалuJ   🥟 Вареники (8 шт): 250 ккал
🥗 Салат: 100 ккалuH   🥞 Блины (3 шт): 300 ккал
🥩 Начинка: 200 ккалuE   🥩 Шашлык (200г): 400 ккал
🥕 Овощи: 100 ккалuC   🥩 Мясо (200г): 300 ккал
🍚 Гарнир: 200 ккалuC   🐟 Рыба (200г): 250 ккал
🍚 Гарнир: 200 ккалuZ   🍔 Бургер (300г): 450 ккал
🍟 Картошка фри (150г): 150 ккалuM   🥤 Кола (250мл): 105 ккал
🍔 Бургер (300г): 450 ккалu   🥤 Кола (250мл): 105 ккал
🍔 Бургер (300г): 450 ккал
🍟 Картошка фри (150г): 150 ккалuv   🥤 Кола (250мл): 105 ккал
🍔 Бургер (300г): 450 ккал
🧁 Мафины (2 шт): 200 ккалu   🥤 Кола (250мл): 105 ккал
🍟 Картошка фри (150г): 150 ккал
🍔 Бургер (300г): 450 ккалuf   🥟 Хинкали (5 шт): 300 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккалu   🥟 Чапильгаш (1 шт): 200 ккал
🥟 Хинкали (4 шт): 240 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккалuh   🥟 Хачапури (1 шт): 300 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккалuh   🥟 Пельмени (8 шт): 300 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккалuh   🥟 Вареники (6 шт): 250 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккалub   🥞 Блины (3 шт): 300 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккалub   🍣 Роллы (6 шт): 300 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккалu`   🍣 Суши (4 шт): 200 ккал
☕ Чай: 50 ккал
🥐 Круассан: 200 ккал)Du(   пирог с яблоком и чаемu   торт с кофеu    печенье с молокомu   круассан с кофеu   пончик с чаемu   кекс с молокомu    картофель с мясомu   рис с мясомu   макароны с сыромu   гречка с мясомu   овощи с мясомu   салат с мясомu   суп с мясомu   борщ с мясомu   пловu   жаркоеu   рагуu'   тушеные овощи с мясомu   завтрак с кофеu   обед с супомu   ужин с салатомu   перекус с чаемu   полдник с сокомu8   хачапури по аджарски и хинкалиuC   хачапури по аджарски и хинкали 7 штукu"   хачапури и хинкалиu"   хачапури с хинкалиu"   хинкали и хачапуриu"   хинкали с хачапуриu   роллы и сушиu   роллы с сушиu   суши с ролламиu   паста с салатомu   пицца с салатомu    ризотто с салатомu"   пельмени с салатомu"   вареники с салатомu   блины с начинкойu   шашлык с овощамиu   шашлык и овощиu   мясо с гарниромu   рыба с гарниромu"   бургер с картошкойu$   бургер с картофелемu   бургер с фриu+   бургер с картофелем фриu   кола и бургерu)   кола бургер и картошкаu'   кола бургер и 2 мафинаu   кола фри и бургер2   хинкали плюс чай и круассанr  u2   хинкали с чаем и круассаномu,   хинкали и чай и круассанuH   чапильгаш и хинкали плюс чай и круассанuH   чапильгаш с хинкали плюс чай и круассанu4   хачапури плюс чай и круассанu4   хачапури с чаем и круассаномu4   пельмени плюс чай и круассанu4   пельмени с чаем и круассаномu4   вареники плюс чай и круассанu4   вареники с чаем и круассаномu.   блины плюс чай и круассанu.   блины с чаем и круассаномu.   роллы плюс чай и круассанu.   роллы с чаем и круассаномu,   суши плюс чай и круассанu,   суши с чаем и круассаномr  )r   )rQ   Zbreakdown_rulesr   r   r   r    s    Nr  )rC   r   c                 C   sN   | sdS d}t | dd dD ]*\}}|| d|d  d|d	  d
7 }q|S )u0   Форматирует топ продуктовu   Нет данныхr  N   ri   . rQ    - countu    раз
)r   )rC   r   r   Zfoodr   r   r   rG     s    $rG   c                 C   s   dS )NTr   r   r   r   r   re   $  rf   c                 C   s   t | d dS )u>   Обработчик неизвестных сообщенийu   🤔 Я не понимаю это сообщение.

Отправьте голосовое сообщение с описанием еды или используйте команды:
/help - помощь
/stats - статистикаNr=   r   r   r   r   handle_unknown_message$  s    r   c                  C   s   t d zz~t  t d tt	ddt	ddt	ddt	d	d
t	ddt	ddg t d t d tj
ddd W n4 tk
r }  zt d|    W 5 d} ~ X Y nX W 5 zt  W n   Y nX X dS )u7   Основная функция запуска ботаu*   Запуск AI-КАЛОРИЯ бота...u6   База данных инициализированаr   r   r@   u(   📊 Статистика питанияrr   u'   🍽️ Просмотр рационаr   r{   r[   r&   r<   r(   u.   Команды бота установленыu4   Бот запущен и готов к работе!rM   r  )timeoutZlong_polling_timeoutuD   Критическая ошибка при запуске бота: N)r7   r8   r   closerF   Zinit_databaser5   Zset_my_commandsr	   Z
BotCommandZinfinity_pollingrH   rI   )rJ   r   r   r   main-  s,    









r#  c                 C   s   | j dS )Nr  r`   rc   r   r   r   re   O  rf   c              
   C   s  z| j j}| j jp| j j}| jddd }td| d|  t	d| d| j
jj| j
j t| j
jjd| d}t|}|r|dstd| d	 t|}|rtj	d
| d| j
jj|j|d n0t	d
| d| j
jj|j tjd|dt|< W dS tj|||d |d |d |d d}t|d }|rttj	d|d  d| j
jj|j|d W dS t|||}t }	|	tdd| dtdd| d zt|d }
|
rtj|
rt |
d }tj!| j
jj|||	dd W 5 Q R X t"| j
jj|j ntj	|| j
jj|j|	dd W nP t#k
r } z0t$d |  tj	|| j
jj|j|	dd W 5 d}~X Y nX td!| d"|  W nB t#k
r } z"t$d#|  t%| jd$ W 5 d}~X Y nX dS )%uC   Обработчик выбора варианта продукта:ri   r.   u    выбрал вариант:    🍽️ Обрабатываю ...r   u5   Не удалось проанализировать u%   , предлагаем гарнирыu   🍽️ Выбрано: r   r]      

📏 Пожалуйста, укажите количество:
• Например: '200 грамм', '1 порция', '2 штуки'r   )staterp   r   NrQ   rR   rT   rU   r   r   r   r   r"   r   r   r   r*   r   r+   r   r   r   1   Ошибка при обработке callback: H   ❌ Произошла ошибка. Попробуйте еще раз.)&r0   r1   r2   r3   ra   rj   r7   r8   r5   rl   r   rm   rn   r   r   r   r   r   r   r   r   r   rF   r   r   r   r4   r   r   r   r   r   r   r   r   rH   rI   rk   )rd   r9   r2   rQ   r   r   r   r   r   r:   r   r   rJ   r   r   r   handle_food_variant_callbackO  s    






 
 r+  c                 C   s   | j dS )Nr  r`   rc   r   r   r   re     rf   c              
   C   s   zf| j j}| jddd }td| d|  td| d| jj	j| jj
 tjd|dt|< W n@ tk
r } z"td	|  t| jd
 W 5 d}~X Y nX dS )u0   Обработчик выбора гарнираr$  ri   r.   u    выбрал гарнир: u#   🍽️ Выбран гарнир: r'  r   )r(  rp   r   u7   Ошибка при обработке гарнира: *   ❌ Ошибка при обработкеN)r0   r1   ra   rj   r7   r8   r5   rl   r   rm   rn   r   r   r   rH   rI   rk   )rd   r9   r
  rJ   r   r   r   handle_side_dish_callback  s     
r-  c                 C   s   | j dS )Nr  r`   rc   r   r   r   re     rf   c              
   C   s  z@| j j}| j jp| j j}| jddd }td| d|  t	d| d| j
jj| j
j t| j
jjd| d}t|}|r|ds|dd	}t	d
| | j
jj|j W dS tj|||d |d |d |d d}t|||}t }	|	tdd| dtdd| d tj	|| j
jj|j|	dd W nB tk
r }
 z"td|
  t| jd W 5 d}
~
X Y nX dS )uD   Обработчик кнопки 'Оставить как есть'r$  ri   r.   u!    оставил как есть: r%  r&  r   r   r   r   NrQ   rR   rT   rU   r   r   r   r"   r   r   r*   r+   uK   Ошибка при обработке 'оставить как есть': r,  )r0   r1   r2   r3   ra   rj   r7   r8   r5   rl   r   rm   rn   r   r   r   r   rF   r   r   r   r4   r   rH   rI   rk   )rd   r9   r2   rQ   r   r   r   r   r   r:   rJ   r   r   r   handle_keep_as_is_callback  sV    




r.  c                 C   s   | j dS )Nr  r`   rc   r   r   r   re   '  rf   c                 C   s   zr| j ddd }tj| jjj| jjdd td|	  d|	  d|	  d|	  d		| jjj| jj W n@ t
k
r } z"td
|  t| jd W 5 d}~X Y nX dS )u?   Обработчик кнопки 'Другой вариант'r$  ri   N)r   rn   r,   uE   💬 Пожалуйста, уточните, какой именно u6    вы имели в виду.

Например:
• 'u    с сахаром'
• 'u    без сахара'
• 'u    200 грамм'r)  r*  )ra   rj   r5   Zedit_message_reply_markupr   rm   r1   rn   rl   r   rH   r7   rI   rk   )rd   rQ   rJ   r   r   r   handle_food_other_callback'  s    ,r/  c                 C   s   | j dS )NZdiet_r`   rc   r   r   r   re   @  rf   c              
   C   s   z| j j}| jddd }|dkr2t| |d nv|dkrHt| |d n`|dkr\t| | nL|dkrpt| | n8|d	krt| | n$|d
krt| |d nt	
| jd W n@ tk
r } z"td|  t	
| jd W 5 d}~X Y nX dS )u3   Обработчик callback для рационаrh   ri   Ztoday   сегодняZ	yesterday
   вчераZselect_dateZweekdeleteZall_recordsu+   ❌ Неизвестное действиеu6   Ошибка при обработке diet callback: #   ❌ Произошла ошибкаN)r0   r1   ra   rj   show_diet_for_dateshow_date_selectionshow_week_dietshow_delete_menushow_all_records_pager5   rk   rH   r7   rI   ro   r   r   r   handle_diet_callback@  s&    r9  )r9   	date_descc                 C   s4  zddl m }m} |dkr*|  }n,|dkrJ| |dd  }n|  }t||}|std| d| jj	j
| jj W d	S td
d |D }d| d|d d}t|dD ]X\}	}
||	 d|
d  d|
d  d|
d  d|
d  d
7 }|d|
d d d7 }q|d| d7 }t }t|d	d dD ]6\}	}
|td|	 d|
d  d |
d!  d" qBt|dkr|td#d$d" |td%d&d" |td'd(d" tj|| jj	j
| jj|d) W nR tk
r. } z2td*| d+|  td,| jj	j
| jj W 5 d	}~X Y nX d	S )-u@   Показать рацион за конкретную датуr   r   	timedeltar0  r1  ri   Zdaysu   📅 Рацион за u	    пустNc                 s   s   | ]}|d  V  qdS rU   Nr   r   rX   r   r   r   r   r  s     z%show_diet_for_date.<locals>.<genexpr>u   🍽️ Рацион за r/   %d.%m.%Yr   r  rQ   r  rR   rS   rT   rU       ккал)
u      ⏰ rP   r   z

u   📊 Всего: r  rM      🗑️ r   r1   r"   u   📄 Показать ещеZ	diet_more   🔙 Назад	diet_backr   r   r]   u5   Ошибка при показе рациона за rE   u7   ❌ Ошибка при загрузке рациона)r   r<  nowdaterF   get_user_records_by_dater5   rl   r   rm   r1   rn   sumrV   r   r   r4   r   rW   rH   r7   rI   )rd   r9   r:  r   r<  target_dater   rA   r   r   rX   r:   rJ   r   r   r   r4  Z  sF    
6 r4  )r9   c              
   C   s\  zddl m }m} t }tdD ]}| ||d }|d}|dkrXd| d}nR|dkrnd	| d}n<d
ddddddd}	|	|d|d}
|
 d| d}|t|d|	  d q"|tddd |tddd t
jd| jjj| jj|d W nL tk
rV } z,td|  t
d| jjj| jj W 5 d}~X Y nX dS )u$   Показать выбор датыr   r;     r=  z%d.%m   Сегодня (r   ri      Вчера (u   Понедельникu   Вторникu
   Средаu   Четвергu   Пятницаu   Субботаu   Воскресенье)ZMondayZTuesdayZ	WednesdayZThursdayZFridayZSaturdayZSunday%Ar/   
diet_date:r"   rC  rD  r   r   uH   📅 Выберите дату для просмотра рациона:r]   u8   Ошибка при показе выбора даты: u/   ❌ Ошибка при загрузке датN)r   r<  r   r  rE  rV   r   r4   r   rF  r5   rl   r   rm   r1   rn   rH   r7   rI   )rd   r9   r   r<  r:   r   rF  rY   Z
date_labelZweekdays_ruZ
weekday_rurJ   r   r   r   r5    sF    
	

r5  c              
   C   sL  zddl m }m} i }d}tdD ]H}| ||d  }t||}|r$|||< |tdd |D 7 }q$|st	d| j
jj| j
j W dS d	}	t| d
dD ]}|| }tdd |D }
|d}||  krd| d}n@|| |dd  krd| d}n|d d| d}|	d| d|
 d7 }	|dd D ]$}|	d|d  d|d  d7 }	qLt|dkr|	dt|d  d7 }	|	d7 }	q|	d| d 7 }	t }|td!d"d# |td$d%d# tj	|	| j
jj| j
j|d& W nL tk
rF } z,td'|  t	d(| j
jj| j
j W 5 d}~X Y nX dS ))u/   Показать рацион за неделюr   r;  rJ  r=  c                 s   s   | ]}|d  V  qdS r>  r   r?  r   r   r   r     s     z!show_week_diet.<locals>.<genexpr>u,   📊 Рацион за неделю пустNu%   📊 Рацион за неделю

T)reversec                 s   s   | ]}|d  V  qdS r>  r   r?  r   r   r   r     s     r@  rK  r   ri   rL  rM  r/   u   📅 rE   
    ккал
   u      • rQ   rU   rA  u      • ... и еще u    записей
rD   u#   📊 Всего за неделю: r  rC  rD  r"   r   r   r]   uF   Ошибка при показе недельного рациона: uL   ❌ Ошибка при загрузке недельного рациона)r   r<  r  rE  rF  rF   rG  rH  r5   rl   r   rm   r1   rn   sortedkeysrV   rW   r   r4   r   rH   r7   rI   )rd   r9   r   r<  Zweek_recordsrA   r   rF  r   r   Zday_caloriesrY   Z	day_labelrX   r:   rJ   r   r   r   r6    sR    
"
 r6  c                 C   sF  zt j|dd}|s2td| jjj| jj W dS d}t }t	|dD ]j\}}|| d|d  d	|d
  d|d  d|d  d
7 }|
td| d|d  d|d  d qF|
tddd |
tddd tj|| jjj| jj|d W nL tk
r@ } z,td|  td| jjj| jj W 5 d}~X Y nX dS )u9   Показать меню удаления записейrM   rN   u5   🗑️ Нет записей для удаленияNu@   🗑️ Выберите запись для удаления:

ri   r  rQ   r  rR   rS   rT   r/   rU   rA  rB  r   r1   r"   rC  rD  r   r   r]   u<   Ошибка при показе меню удаления: 7   ❌ Ошибка при загрузке записей)rF   Zget_user_recent_recordsr5   rl   r   rm   r1   rn   r   r   r4   r   rH   r7   rI   )rd   r9   r   r   r:   r   rX   rJ   r   r   r   r7    s.    6
 r7  c                 C   s   | j dS )Nr   r`   rc   r   r   r   re     rf   c              
   C   s  z| j j}t| jddd }t||}|rt| jd t	 }|
tdddtddd |
td	d
dtddd |
tddd tjd| jjj| jj|dd nt| jd W n@ tk
r } z"td|  t| jd W 5 d}~X Y nX dS )u2   Обработчик удаления записиr$  ri   u   ✅ Запись удаленаr    r!   r"   r$   r%   r&   r'   r(   r)   r   r   u/   ✅ Запись успешно удалена!r*   r+   $   ❌ Запись не найденаu3   Ошибка при удалении записи: u(   ❌ Ошибка при удаленииN)r0   r1   intra   rj   rF   Zdelete_food_recordr5   rk   r   r4   r   rl   r   rm   rn   rH   r7   rI   )rd   r9   r   r   r:   rJ   r   r   r   handle_delete_record  s6    



rW  c                 C   s   | j dS )NrN  r`   rc   r   r   r   re   @  rf   c              
   C   s   zL| j j}| jddd }ddlm} ||d }t| ||d W n@ t	k
r } z"t
d|  t| jd W 5 d	}~X Y nX d	S )
u?   Обработчик выбора конкретной датыr$  ri   r   r   z%Y-%m-%dr@  u>   Ошибка при обработке выбора даты: u1   ❌ Ошибка при загрузке датыN)r0   r1   ra   rj   r   strptimerF  r4  rV   rH   r7   rI   r5   rk   )rd   r9   rY   r   rI  rJ   r   r   r   handle_diet_date@  s    rY  c                 C   s
   | j dkS )NrD  ra   rc   r   r   r   re   Q  rf   c              
   C   s   zpt  }|tdddtddd |tdddtdd	d |td
dd tjd| jjj| jj|d W n@ t	k
r } z"t
d|  t| jd W 5 d}~X Y nX dS )u.   Обработчик кнопки 'Назад'rs   rt   r"   ru   rv   rw   rx   ry   rz   r|   r}   r~   r]   u2   Ошибка при возврате в меню: u(   ❌ Ошибка при возвратеN)r   r4   r   r5   rl   r   rm   r1   rn   rH   r7   rI   rk   )rd   r:   rJ   r   r   r   handle_diet_backQ  s,    





r[  c                 C   s   | j dS )Nr   r`   rc   r   r   r   re   n  rf   c              
   C   st   z.| j j}t| jddd }t| || W n@ tk
rn } z"td|  t	
| jd W 5 d}~X Y nX dS )u6   Обработчик пагинации записейr$  ri   uH   Ошибка при обработке страницы записей: u9   ❌ Ошибка при загрузке страницыN)r0   r1   rV  ra   rj   r8  rH   r7   rI   r5   rk   )rd   r9   r   rJ   r   r   r   handle_records_pagen  s    r\  c                 C   s   | j dS )Nview_record:r`   rc   r   r   r   re   {  rf   c              
   C   s^  z| j j}t| jddd }t||}|sFt| jd W dS |d 	d}d| d}|d	|d
  d7 }|d|d  d|d  d7 }|d|d  d7 }|d| d7 }t
 }|tdd| dtdd| d |tddd tj|| jjj| jj|dd W nB tk
rX } z"td|  t| jd W 5 d}~X Y nX dS )uG   Обработчик просмотра отдельной записиr$  ri   rU  NrP   r   u   📋 **Запись #z**

u   🍽️ **Продукт:** rQ   rD   u   📏 **Количество:** rR   rS   rT   u   🔥 **Калории:** rU   rP  u   🕐 **Время:** r   r   r"   r   r   u!   ⬅️ Назад к спискуzrecords_page:1r   r+   u5   Ошибка при просмотре записи: u7   ❌ Ошибка при просмотре записи)r0   r1   rV  ra   rj   rF   get_record_by_idr5   rk   rV   r   r4   r   rl   r   rm   rn   rH   r7   rI   )rd   r9   r   rX   r   r   r:   rJ   r   r   r   handle_view_record{  s:    
r_  )r9   r   c                 C   s6  zt j||dd}|d s:td| jjj| jj W dS d|d d  d	|d d
  d}t|d dD ]R\}}|d 	d}|| d|d  d|d  d|d  d|d  d| d7 }qjt
 }t|d dd dD ]>\}}|t| d|d  d|d  dd|d  d qt|d dkrD|td d!| d g }	|d d" rz|	td#d$|d d d  d |d d% r|	td&d$|d d d  d |	r|j|	  |td'd(d tj|| jjj| jj|d)d* W nB tk
r0 }
 z"td+|
  t| jd, W 5 d}
~
X Y nX dS )-uB   Показать страницу со всеми записямиrM   r   r   r   Nr   r   r   r   r   r   ri   rP   r   r   rQ   r   rR   rS   rT   r/   rU   r   rD   r  r  r  r  r]  r1   r"   u   📋 Показать ещеzshow_more_records:r   r   r   r   r   r   r   r   r+   uB   Ошибка при показе страницы записей: rT  )rF   r   r5   rl   r   rm   r1   rn   r   rV   r   r4   r   rW   r   rH   r7   rI   rk   )rd   r9   r   ra   r   r   rX   r   r:   r   rJ   r   r   r   r8    sN    ">
$$

r8  c                 C   s   | j dS )NZmenu_r`   rc   r   r   r   re     rf   c           
   
   C   s  zt| j j}| jddd }|dkrzt|}|dd}|dd}d|dd	| d
t 	d d}t
 }|tddd tj|| jjj| jj|dd W n@ tk
r } z"td|  t| jd W 5 d}~X Y nX n|dkrvt
 }|tdddtddd |tdddtddd |tddd |tddd tjd | jjj| jj|d! n|d"krt
 }|td#d$| dtd%dd tjd&| jjj| jj|dd n|d'krd(}	t
 }|tddd tj|	| jjj| jj|dd nf|d)krtt
 }|td*d+dtd,d-d |td.d/dtd0d1d tjd2| jjj| jj|dd W nB tk
r } z"td3|  t| jd4 W 5 d}~X Y nX dS )5u.   Обработчик главного менюrh   ri   r@   rA   r   records_countuU   📊 **Ваша статистика за сегодня**

🔥 **Калории:** rB   u#    ккал
📝 **Записей:** u   
📅 **Дата:** r@  u   

💡 **Советы:**
• Норма для взрослого: 2000-2500 ккал/день
• Пейте больше воды
• Ешьте регулярноu   🔙 Главное менюr   r"   r   r+   u=   Ошибка при получении статистики: u=   ❌ Ошибка при загрузке статистикиNrr   rs   rt   ru   rv   rw   rx   ry   rz   r|   r}   r~   r]   r[   u   ✅ Да, очиститьr\      ❌ Отменаu   ⚠️ **Вы уверены, что хотите удалить всю историю записей?**

Это действие нельзя отменить!r<   u?  ℹ️ **Помощь по AI-КАЛОРИЯ**

📝 **Как пользоваться:**
• Отправьте голосовое сообщение о том, что съели
• Или напишите текстом: "Съел тарелку гречки 300 грамм"
• Я проанализирую и добавлю в ваш дневник питания

🎯 **Доступные команды:**
• /start - Главное меню
• /stats - Статистика питания
• /diet - Просмотр рациона
• /clear - Очистка истории

💡 **Примеры запросов:**
• "Съел тарелку гречки 300 грамм"
• "Выпил стакан молока"
• "Капучино"
• "Овсянка с молоком"

🚀 **Готов к работе!**Zbackr    r!   r$   r%   r&   r'   r(   r)   a   🍎 **AI-КАЛОРИЯ - Главное меню**

🎯 **Выберите действие:**uB   Ошибка при обработке главного меню: r3  )r0   r1   ra   rj   rF   r  r   r   rE  rV   r   r4   r   r5   rl   r   rm   rn   rH   r7   rI   rk   )
rd   r9   rp   r  rA   r`  r   r:   rJ   r>   r   r   r   handle_main_menu  s    

 
$








 





rc  c                 C   s   | j dS )Nr   r`   rc   r   r   r   re   _  rf   c              
   C   s   z| j j}t| jddd }t||}|sDt| jd W dS d|d  d|d  d	|d
  d|d  d	}t	 }|
tddd tj| jjj||dd tjd|dt|< W n@ tk
r } z"td|  t| jd W 5 d}~X Y nX dS )u4   Обработчик изменения записиr$  ri   rU  NuN   ✏️ <b>Изменение записи</b>

🍽️ <b>Продукт:</b> rQ   u#   
📏 <b>Количество:</b> rR   rS   rT   u,   
🔥 <b>Текущие калории:</b> rU   u;   ккал

💡 <b>Варианты изменения:</b>
• Введите новое количество калорий (например: 150, 200, 300)
• Или опишите изменения текстом (например: "увеличить до 250 калорий", "сделать меньше")ra  edit_cancelr"   r*   r+   r   )r(  rp   r   u5   Ошибка при изменении записи: u*   ❌ Ошибка при изменении)r0   r1   rV  ra   rj   rF   r^  r5   rk   r   r4   r   r   r   rm   r   r   r   rH   r7   rI   )rd   r9   r   rX   r   r:   rJ   r   r   r   handle_edit_record_  s>    
	re  c                 C   s
   | j dkS )Nrd  rZ  rc   r   r   r   re     rf   c              
   C   s   zt| j j}t|d t }|tdddtddd |tdddtd	d
d tjd| j	j
j| j	j|dd W n@ tk
r } z"td|  t| jd W 5 d}~X Y nX dS )u4   Обработчик отмены измененияNr    r!   r"   r$   r%   r&   r'   r(   r)   rb  r   r+   u5   Ошибка при отмене изменения: u$   ❌ Ошибка при отмене)r0   r1   r   r   r   r4   r   r5   rl   r   rm   rn   rH   r7   rI   rk   )rd   r9   r:   rJ   r   r   r   handle_edit_cancel  s,    




rf  )r9   r   r   c                 C   s  zt || }|sW dS zLt| }|dk r8W W dS |dkrHW W dS t || |}|sbW W dS W n tk
r"   zdt||}|dkrW Y W dS d	|krd
|kr|d	 }|d	 }|d
 }	d|d  krd|	ddksd|	ddkrtd|d  kr0|d }d|d  krr|d7 }nBd|d  krf|d }d|d  krr|d7 }n|	| | }n|	| | }n|	| | }t
|d|d
< td| d| d|	 d|  t || |}|sW Y W dS W n> tk
r }
 ztd|
  W Y Y W dS d}
~
X Y nX Y nX t || }t|d |d	 |d |d
 d|| }t }|tdd| dtd d!| d d"||d#W S  tk
r }
 ztd$|
  W Y d%S d}
~
X Y nX dS )&u?   Обработка умного изменения записиrU  r   u[   ❌ Количество калорий не может быть отрицательнымi'  u^   ❌ Количество калорий слишком большое (максимум 10000)u9   ❌ Ошибка при обновлении записиNu   ❌ Не удалось понять ваше изменение. Попробуйте ввести число или более четкое описание.rR   rU   u    и rQ   u   штrT   r  u   штукu   хинкалиP   u   хачапуриi,  i  ri   u!   Пересчет калорий: z -> z, u=   Ошибка при умном редактировании: u{   ❌ Ошибка при обработке изменения. Попробуйте ввести число калорий.)rQ   rR   rT   rU   r   r   r"   r   r   T)r   r   r:   uH   Ошибка при обработке изменения записи: uJ   ❌ Произошла ошибка при изменении записи)rF   r^  floatr   Zupdate_record_calories
ValueErrorr   Zsmart_record_editr   r   roundr7   r8   Zupdate_recordrH   rI   r   r   r4   r   )r9   r   r   Zcurrent_recordZnew_caloriesr   ZchangesZ
old_amountZ
new_amountZold_caloriesrJ   Zupdated_recordr   r:   r   r   r   r     s    
"

"" r   __main__)N)S__doc__loggingr   Zjsonr   typingr   r   r   r   dotenvr   Ztelebotr	   Ztelebot.typesr
   r   r   r   r   r   Zdatabaser   r   r   basicConfigINFOFileHandlerStreamHandler	getLoggerr   r7   ZTeleBotr5   rF   r   r   Zmessage_handlerr;   r?   rK   rZ   r_   Zcallback_query_handlerrq   r   r   r   r   strboolr   r   r  r   r   r   rV  r   r  listrG   r   r#  r+  r-  r.  r/  r9  r4  r5  r6  r7  rW  rY  r[  r\  r_  r8  rc  re  rf  r   r   r   r   r   <module>   s   

!
)x  Z2  $!T"
x

A

50:!
%



(<
~
,
h
