o
    2eiAd                     @   sf  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
 d dlmZ d dlmZmZ d dlmZ d dlmZmZmZmZmZ edd	Ze eZd
ZdZdZdZdZ G dd deZ!de"de"fddZ#de"defddZ$de"de%defddZ&de"de%de%defddZ'de(e)e%e"f  fddZ*de"de(e)e%e"f  fd d!Z+de%de"dB fd"d#Z,de%de"dB fd$d%Z-de%de.dB fd&d'Z/de%de(e)e%e"f  fd(d)Z0de"d*e(e)e%e"f  defd+d,Z1de"d-e(e)e%e"f  de%defd.d/Z2d0e"de)e3e"dB f fd1d2Z4de%de)e"e5f dB fd3d4Z6de%de%de(e)e"e5e"e%f  fd5d6Z7de"d7e(e)e"e5e"e%f  de%de%def
d8d9Z8e9ej:d:kd;ed<efd=d>Z;e<e!j=d?e
d<efd@dAZ>e9ej:?ed;efdBdCZ@e9ej:?ed;efdDdEZAe9ej:?ed;efdFdGZBe9ej:?e d;efdHdIZCe9ej:ekd;ed<efdJdKZDdS )L    N)RouterF)CallbackQueryInlineKeyboardMarkupInlineKeyboardButtonMessage)FSInputFile)StatesGroupState)
FSMContext)get_user_languageget_language_textset_user_languageMENU_DBDATA_DBcatalog)namezmenu:button9zcity:zprod:zback_to_product:zback_to_city:c                   @   s   e Zd Ze ZdS )CatalogStatesN)__name__
__module____qualname__r
   	wait_city r   r   C/var/www/www-root/data/www/magazinbotpanel.site/handlers/catalog.pyr      s    
r   langreturnc              
   C   s   d}z:t t}| }|d| f | }|  |r4|d r7t|d  r:t|d  }W |S W |S W |S W |S  t	yZ } zt
d|  d|  W Y d }~|S d }~ww )Nu   ⬅️ Назадz+SELECT button9 FROM language WHERE name = ?r   z get_button9_text error for lang=: )sqlite3connectr   cursorexecutefetchoneclosestrstrip	Exceptionloggererror)r   labelconncurrower   r   r   get_button9_text   s*   
 r-   c                 C   s   t tt| tdggdS )Ntextcallback_datainline_keyboard)r   r   r-   BACK_CB)r   r   r   r   build_back_keyboard'   s   r4   city_idc                 C   s"   t tt| t | dggdS )uj   Строит клавиатуру с кнопкой назад к списку товаров городаr.   r1   )r   r   r-   BACK_TO_CITY_PREFIX)r   r5   r   r   r   build_back_to_city_keyboard,   s   
r7   
product_idc                 C   s(   t tt| t | d| dggdS )uN   Строит клавиатуру с кнопкой назад к товару:r.   r1   )r   r   r-   BACK_TO_PRODUCT_PREFIX)r   r8   r5   r   r   r   build_back_to_product_keyboard7   s   r;   c               
   C   sv   zt t} |  }|d | }|   dd |D W S  ty: } zt	d|  g W  Y d}~S d}~ww )uA   Загружает все города из базы данныхz#SELECT city_id, city_name FROM cityc                 S   s@   g | ]}|r|d  dur|d rt |d  t|d  fqS )r   N   )intr#   r$   ).0rr   r   r   
<listcomp>J   s   @ z#load_all_cities.<locals>.<listcomp>zload_all_cities error: N)
r   r   r   r   r    fetchallr"   r%   r&   r'   )r)   r*   rowsr,   r   r   r   load_all_citiesB   s   

rC   prefixc                    s@   | pd     sg S t } fdd|D }t|dd dS )u>   Находит города по префиксу (поиск) c                    s&   g | ]\}}|   r||fqS r   )lower
startswith)r>   cidr   qr   r   r@   U   s   & z)find_cities_by_prefix.<locals>.<listcomp>c                 S   s   | d   S Nr<   )rF   xr   r   r   <lambda>V   s    z'find_cities_by_prefix.<locals>.<lambda>key)r$   rF   rC   sorted)rD   citiesmatchesr   rI   r   find_cities_by_prefixO   s   rT   c              
   C   s   z@t t}| }|d dd | D }d|v r:|d| f | }|  |r:|d r:t|d 	 W S |  W dS  t
y^ } ztd|  d	|  W Y d}~dS d}~ww )
uB   Получает язык для указанного городаzPRAGMA table_info(city)c                 S      g | ]}|d  qS r<   r   r>   colr   r   r   r@   _       z%get_city_language.<locals>.<listcomp>city_languagez0SELECT city_language FROM city WHERE city_id = ?r   Nz$get_city_language error for city_id=r   )r   r   r   r   r    rA   r!   r"   r#   r$   r%   r&   r'   )r5   r)   r*   columnsr+   r,   r   r   r   get_city_languageX   s$   

r\   c              
   C   s   z*t t}| }|d| f | }|  |r(|d r(t|d  W S dW S  t	yE } zt
d|  W Y d}~dS d}~ww )u6   Получает название города по IDz,SELECT city_name FROM city WHERE city_id = ?r   Nzget_city_name error: )r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   )r5   r)   r*   r+   r,   r   r   r   get_city_nameo   s   
$r]   c              
   C   s   zPt t}| }|d| f | }|  |sW dS t|d |d r/t|d 	 nd|d r<t|d 	 nd|d rLt|d 	 d	W S dd	W S  t
yn } ztd
|  d|  W Y d}~dS d}~ww )uH   Получает детальную информацию о товареz
        SELECT product_id, product_name, product_description, product_image 
        FROM products WHERE product_id = ?
        Nr   r<      Без названия   rE      )r8   product_nameproduct_descriptionproduct_imagezget_product_details error id=r   )r   r   r   r   r    r!   r"   r=   r#   r$   r%   r&   r'   )r8   r)   r*   r+   r,   r   r   r   get_product_details|   s,   

rd   c           	   
   C   s   zTt t}| }|dd|  df | }|  g }|D ]#}|rD|d durD|d rDt|d }t|d 	 }|
||f q!tdt| d|   |W S  typ } ztd|  g W  Y d}~S d}~ww )	u   
    Находит товары для указанного города
    Возвращает список кортежей: (product_id, product_name)
    z
            SELECT product_id, product_name 
            FROM products 
            WHERE product_city LIKE ? 
            ORDER BY product_name
        %r   Nr<   zFound z products for city_id=zfind_products_for_city error: )r   r   r   r   r    rA   r"   r=   r#   r$   appendr&   infolenr%   r'   )	r5   r)   r*   rB   productsr+   r8   ra   r,   r   r   r   find_products_for_city   s,   
rj   rR   c                 C   sP   g }|D ]\}}| t|t | dg q| tt| tdg t|dS )u5   Строит клавиатуру с городамиr.   r1   )rf   r   CITY_CB_PREFIXr-   r3   r   )r   rR   rB   rH   r   r   r   r   build_cities_keyboard   s
   
rl   ri   c              	   C   sv   g }|D ]%\}}|}t |dkr|dd d }|t|t | d| dg q|tt| tdg t|dS )u5   Строит клавиатуру с товарами   N   z...r9   r.   r1   )rh   rf   r   PROD_CB_PREFIXr-   r3   r   )r   ri   r5   rB   r8   ra   button_textr   r   r   build_products_keyboard   s   
rq   raw_pathc                 C   s   | sdS |   }| drd|fS |d| d| d| d| d| g}|D ]}tj|}tj|rFtj|rFd	|f  S q,dS )
uW   Определяет путь к изображению (локальный или URL))FN)zhttp://zhttps://Tz./z../zupload/z	./upload/z
../upload/F)r$   rF   rG   ospathnormpathexistsisfile)rr   p
candidates	candidate	norm_pathr   r   r   resolve_image_path   s$   	r|   c              
   C   s   z_t t}| }|d| f | }|r|d s"|  W dS t|d  	 }|d| d | }|  |r]|d r]zt
|d }| |fW W S  ty\   Y W dS w W dS  ty} } ztd|  d|  W Y d}~dS d}~ww )u6   Получает валюту города и курсz*SELECT valyuta FROM city WHERE city_id = ?r   NSELECT z FROM kurs LIMIT 1z$get_city_currency error for city_id=r   )r   r   r   r   r    r!   r"   r#   r$   rF   floatupper
ValueErrorr%   r&   r'   )r5   r)   r*   r+   currencykurs_rowexchange_rater,   r   r   r   get_city_currency   s2   
r   c                 C   sv  g }zt t}| }t|}|s|W S |\}}|d dd | D }tddD ]]}	d|	 }
|
|v r|d|
 d| f | }|r|d	 rt	|d	 
 }|rd
d |dD }t|dkr|d	 }zt|d }|| }|||||	f W q, ty   Y q,w q,|  |jdd d |W S  ty } ztd|  d| d|  g W  Y d}~S d}~ww )u   Получает теги товара с ценами в валюте города и сортирует по цене (от меньшей к большей)zPRAGMA table_info(products)c                 S   rU   rV   r   rW   r   r   r   r@     rY   z$get_product_tags.<locals>.<listcomp>r<   3   product_tagsr}   z# FROM products WHERE product_id = ?r   c                 S   s   g | ]}|  qS r   )r$   )r>   rx   r   r   r   r@   +  rY   ,r_   c                 S   s   | d S rK   r   rL   r   r   r   rN   9  s    z"get_product_tags.<locals>.<lambda>rO   z"get_product_tags error product_id=z
, city_id=r   N)r   r   r   r   r   r    rA   ranger!   r#   r$   splitrh   r~   rf   r   r"   sortr%   r&   r'   )r8   r5   tagsr)   r*   currency_infor   r   r[   itag_colr+   tag_datapartstag_name
base_pricefinal_pricer,   r   r   r   get_product_tags  sJ   


r   r   c                 C   s   g }|D ]4\}}}}|  rt| }	n|d}	| d|	 d| }
|t|
d| d| d| d| dg q|tt| t | dg t|dS )um   Строит клавиатуру с тегами товара ОТСОРТИРОВАННЫМИ ПО ЦЕНЕz.2fz -  ztag:r9   r.   r1   )
is_integerr=   rf   r   r-   r6   r   )r   r   r8   r5   rB   r   pricer   	tag_index	price_strrp   r   r   r   build_product_tags_keyboardA  s   


r   zmenu:button1cbstatec                    s   | j j}t|}t|dpd}z
| j I dH  W n	 ty#   Y nw | jj|t|dI dH }|	t
jI dH  |j|jdI dH  |  I dH  dS )uZ   Обработчик открытия каталога - запрашивает городtext2u,   Введите название городаNreply_markup)prompt_msg_id)	from_useridr   r   messagedeleter%   answerr4   	set_stater   r   update_data
message_id)r   r   user_idr   r   
prompt_msgr   r   r   open_catalog]  s   r   r   c                    s  | j j}t|}| jpd }z	|  I dH  W n	 ty"   Y nw z| I dH }|d}|r?| j	j
| jj|dI dH  W n	 tyI   Y nw t|}|rot|dpVd}t||}	| j||	dI dH  | I dH  dS t|dpud	}
| j|
t|dI dH  dS )
uG   Обработчик ввода города пользователемrE   Nr   )chat_idr   text4u   Найдены городаr   text3u>   Город не найден. Попробуйте снова.)r   r   r   r/   r$   r   r%   get_datagetbotdelete_messagechatrT   r   rl   r   clearr4   )r   r   r   r   	user_textdata	prompt_idrS   r   kbr   r   r   r   handle_city_inputn  s6   

r   c                    sb  | j j}t|}zt| jttd }W n ty*   | jdddI dH  Y dS w t	|}|rS||krSt
||}|rKtd| d| d|  ntd|  |pX|pXd	}z
| j I dH  W n	 tyl   Y nw t|}|rt|pxd
}t|dpd| d}	| jj|	t|||dI dH  nt|dpd}
| jj|
t|dI dH  |  I dH  dS )u   Обработчик выбора города - показывает товары для этого города и меняет языкNu&   Ошибка выбора городаT
show_alertzChanged language for user z to z based on city z#Failed to change language for user u   Русский!   неизвестный городtext5   Товары в городе r9   r   text6    Товары не найдены)r   r   r   r=   r   rh   rk   r   r   r\   r   r&   rg   r'   r   r   r%   rj   r]   r   rq   r4   )r   r   current_langr5   rZ   successr   ri   	city_namer   r   r   r   r   on_city_clicked  s:   
 r   c              
      sv  | j j}t|}| jttd }z|dd\}}t|}t|}W n ty8   | j	dddI dH  Y dS w t
|}t|}	|sO| j	dddI dH  dS d|	pSd	 }
d
|dd }|dd}|rld| nd}t|dptd}|r|d| nd}|
|g}|r|| |r|| d|}t||}t||||}z
| j I dH  W n	 ty   Y nw |dd}|r't|\}}|rz*|r| jj|||dI dH  n| jjt|||dI dH  td| d|  W n@ ty } ztd| d|  | jj	||dI dH  W Y d}~nd}~ww | jj	||dI dH  n| jj	||dI dH  | 	 I dH  dS )u   Обработчик выбора товара - показывает детальную информацию с картинкой и тегамиNr9   r<   u&   Ошибка выбора товараTr      Товар не найден   🏙️ Город:    Не указан   📦 Товар: ra   r^   rb   rE      📝 r   
rc   photocaptionr   z$Successfully sent photo for product r   !Failed to send photo for product r   )r   r   r   r   rh   ro   r   r=   r%   r   rd   r]   r   r   rf   joinr   r   r   r   r|   answer_photor   r&   rg   r'   r   r   r   payloadpid_strcid_strr8   r5   productr   	city_line	name_linedescription	desc_linetext6_content
text6_linemessage_partscaption_textr   r   
image_pathis_urlresolved_pathr,   r   r   r   on_product_clicked  sz   



"r   c              
      s`  | j j}t|}| jttd }z|dd\}}t|}t|}W n ty8   | j	dddI dH  Y dS w t
|}t|}	|sO| j	dddI dH  dS d|	pSd	 }
d
|dd }|dd}|rld| nd}t|dptd}|r|d| nd}|
|g}|r|| |r|| d|}t||}t||||}z
| j I dH  W n	 ty   Y nw |dd}|rt|\}}|rz|r| jj|||dI dH  n| jjt|||dI dH  W n@ ty } ztd| d|  | jj	||dI dH  W Y d}~nd}~ww | jj	||dI dH  n| jj	||dI dH  | 	 I dH  dS )uF   Обработчик возврата к карточке товараNr9   r<      Ошибка возвратаTr   r   r   r   r   ra   r^   rb   rE   r   r   r   rc   r   r   r   r   )r   r   r   r   rh   r:   r   r=   r%   r   rd   r]   r   r   rf   r   r   r   r   r   r|   r   r   r&   r'   r   r   r   r   on_back_to_product  sz   



"r   c                    s  | j j}t|}zt| jttd }W n ty*   | jdddI dH  Y dS w z
| j	
 I dH  W n	 ty>   Y nw t|}|rft|pJd}t|dpUd| d}| j	j|t|||d	I dH  nt|d
pld}| j	j|t|d	I dH  |  I dH  dS )uQ   Обработчик возврата к списку товаров городаNr   Tr   r   r   r   r9   r   r   r   )r   r   r   r=   r   rh   r6   r   r   r   r   r%   rj   r]   r   rq   r4   )r   r   r   r5   ri   r   r   r   r   r   r   on_back_to_cityh  s,    r   c                    sz   | j j}t|}z
| j I dH  W n	 ty   Y nw ddlm} || j||I dH  | I dH  | 	 I dH  dS )u^   Обработчик кнопки Назад - возвращает в главное менюNr   )show_main_menu)
r   r   r   r   r   r%   handlers.menu_handlersr   r   r   )r   r   r   r   r   r   r   r   on_back_button  s   r   )Eloggingrs   r   aiogramr   r   aiogram.typesr   r   r   r   aiogram.types.input_filer   aiogram.fsm.stater	   r
   aiogram.fsm.contextr   dbr   r   r   r   r   router	getLoggerr   r&   r3   rk   ro   r:   r6   r   r#   r-   r4   r=   r7   r;   listtuplerC   rT   r\   r]   dictrd   rj   rl   rq   boolr|   r~   r   r   r   callback_queryr   r   r   r   r   rG   r   r   r   r   r   r   r   r   r   <module>   s^    

	""&&".3
,XT