o
    "i2U                     @   sX  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	 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dedefddZdedefddZdedefddZ dede!e"eef  fddZ#dededede!e fddZ$dededefddZ%dedede!e"ee&eef  fdd Z'ded!e!e"ee&eef  dededef
d"d#Z(ded$e!e dededed%edefd&d'Z)dedededed%edefd(d)Z*e+ej,-ed*efd+d,Z.e+ej,-ed*efd-d.Z/e+ej,-ed*efd/d0Z0e+ej,-ed*efd1d2Z1e+ej,-ed*efd3d4Z2dS )5    N)RouterF)CallbackQueryInlineKeyboardMarkupInlineKeyboardButton)
FSMContext)get_user_languageget_language_textget_user_balanceDATA_DBMENU_DBproduct_handlers)nameztag:z	district:z	delivery:zdelivery_info:zback_to_product:langreturnc              
   C      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e r%   X/var/www/www-root/data/www/app.magazinbotpanel.site/bots/01/handlers/product_handlers.pyget_button9_text   *   
 r'   c              
   C   r   )Nu   🚗 Доставкаz,SELECT button11 FROM language WHERE name = ?r   z!get_button11_text error for lang=r   r   r   r%   r%   r&   get_button11_text    r(   r)   city_idc              
   C   s   z0t t}| }|d| f | }|  |r.|d r.t|d  	 }|dkW S W dS  t
yN } ztd|  d|  W Y d}~dS d}~ww )uM   Проверяет доступна ли доставка для городаz+SELECT delivery FROM city WHERE city_id = ?r   yesFz+get_city_delivery_status error for city_id=r   N)r   r   r   r   r   r   r   r   r   lowerr   r   r   )r*   r!   r"   r#   delivery_statusr$   r%   r%   r&   get_city_delivery_status.   s   

r.   c           
   
   C   s  zjt t}| }|d | s|  g W S |d | }|  g }|D ]<}|rg|d rg|d rg|d rgt|d 	 
d}t| |v rgt|d 	 }t|d 	 }|rg|rg|||f q+|W S  ty }	 ztd|  d|	  g W  Y d	}	~	S d	}	~	ww )
uU   Получает опции доставки для указанного городаzh
            SELECT name FROM sqlite_master 
            WHERE type='table' AND name='delivery'
        z(SELECT city_id, name, text FROM deliveryr         ,z,get_city_delivery_options error for city_id=r   N)r   r   r   r   r   r   r   fetchallr   r   splitappendr   r   r   )
r*   r!   r"   rowsoptionsr#   delivery_city_idsr   textr$   r%   r%   r&   get_city_delivery_optionsB   s4   


r9   
product_id	tag_indexc                 C   s  zt t}| }d| }|d dd | D }||v r\|d| d|f | }|r\|d r\zt|d }|	t
| g }	|	rP|  |	W W S W n
 tjy[   Y nw d| }
|
|vrl|  g W S |d|
 d|f | }|r|d s|  g W S t
|d  }|s|  g W S |d	}t|d
kr|d  }|rdd |dD }g }|D ]}t|| r|| q|  |W S |  g W S  ty } ztd|  d| d| d|  g W  Y d}~S d}~ww )uq   Получает список районов для города с использованием маппингаproduct_districtsPRAGMA table_info(products)c                 S      g | ]}|d  qS r/   r%   .0colr%   r%   r&   
<listcomp>q       z&get_city_districts.<locals>.<listcomp>SELECT # FROM products WHERE product_id = ?r   product_tagsr1      r0   c                 S   s   g | ]
}|  r|  qS r%   r   )rA   dr%   r%   r&   rC      s    -z%get_city_districts error for city_id=z, product_id=z, tag_index=r   N)r   r   r   r   r   r2   r   jsonloadsgetr   r   JSONDecodeErrorr   r3   lenis_district_in_cityr4   r   r   r   )r*   r:   r;   r!   r"   district_columncolumnsr#   district_mapping	districts
tag_columntag_datapartsdistricts_strall_districtsfiltered_districtsdistrictr$   r%   r%   r&   get_city_districtsf   sh   






"r]   r\   c           
      C   s  zbt t}| }|d | }|  |D ]F}|sqt|dkr*t|d nd}|r_dd |	dD }t||v r_t
ddD ]}t||kr^|| r^t||  | kr^  W d	S qCqW d
S  ty }	 ztd|  d| d|	  W Y d}	~	d
S d}	~	ww )u{   Проверяет принадлежит ли район городу (для обратной совместимости)zSELECT * FROM districtsr/    c                 S      g | ]}|  qS r%   rI   )rA   cidr%   r%   r&   rC      rD   z'is_district_in_city.<locals>.<listcomp>r1   r0      TFz'is_district_in_city error for district=
, city_id=r   N)r   r   r   r   r   r2   r   rP   r   r3   ranger   r   r   r   )
r\   r*   r!   r"   r5   r#   city_ids_strcity_idsir$   r%   r%   r&   rQ      s.   

(
rQ   c                 C   s  g }zt t}| }ddlm} ||}|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 q2 ty   Y q2w q2|  |jdd d |W S  ty } ztd|  d| d|  g W  Y d}~S d}~ww )u   Получает теги товара с ценами в валюте города и сортирует по цене (от меньшей к большей)r   )get_city_currencyr=   c                 S   r>   r?   r%   r@   r%   r%   r&   rC      rD   z$get_product_tags.<locals>.<listcomp>r/   3   rG   rE   rF   c                 S   r_   r%   rI   )rA   pr%   r%   r&   rC      rD   r1   r0   c                 S   s   | d S )Nr/   r%   )xr%   r%   r&   <lambda>   s    z"get_product_tags.<locals>.<lambda>)keyz"get_product_tags error product_id=rb   r   N)r   r   r   r   handlers.payment_handlersrg   r   r2   rc   r   r   r   r3   rP   floatr4   
ValueErrorr   sortr   r   r   )r:   r*   tagsr!   r"   rg   currency_infocurrencyexchange_raterS   rf   tag_colr#   rW   rX   tag_name
base_pricefinal_pricer$   r%   r%   r&   get_product_tags   sL   


ry   rq   c                 C   s   g }|D ]5\}}}}|  rt| }	n|d}	| d|	 d| }
|t|
t | d| d| d| dg qt | d| }|tt| |dg t|dS )um   Строит клавиатуру с тегами товара ОТСОРТИРОВАННЫМИ ПО ЦЕНЕz.2fz -  :r8   callback_datainline_keyboard)
is_integerintr4   r   TAG_CB_PREFIXBACK_TO_PRODUCT_PREFIXr'   r   )r   rq   r:   r*   r5   rv   pricers   r;   	price_strbutton_textback_to_product_cbr%   r%   r&   build_product_tags_keyboard   s   
r   rU   rv   c                 C   s   g }t |}|r$t| }|t|t | d| d| d| d	dg |D ]}	|t|	t | d| d| d| d|	 
dg q&t | d| }
|tt| |
dg t|dS )uB   Строит клавиатуру с районами городаr{   	:deliveryr|   r~   )	r.   r)   r4   r   DELIVERY_CB_PREFIXDISTRICT_CB_PREFIXr   r'   r   )r   rU   r:   r*   r;   rv   r5   delivery_availablebutton11_textr\   r   r%   r%   r&   build_districts_keyboard  s    
"
r   c           
      C   s   g }t |}|D ]\}}|t|t | d| d| d| d| 
dg qt | d| }	|tt| |	dg t|dS )uD   Строит клавиатуру с опциями доставкиr{   r|   r~   )r9   r4   r   DELIVERY_INFO_CB_PREFIXr   r'   r   )
r   r:   r*   r;   rv   r5   delivery_optionsoption_nameoption_textr   r%   r%   r&   build_delivery_info_keyboard-  s   "
r   cbc                    sV  | j j}t|}| jttd }z|dd\}}}}t|}t|}	t|}
W n ty>   | j	dddI dH  Y dS w z
| j
 I dH  W n	 tyR   Y nw t|dpYd}t|	||
}|sd	}t | d|	 }ttt||d
ggd}| j
j	||dI dH  | 	 I dH  dS t||||	|
|}| j
j	||dI dH  | 	 I dH  dS )u[   Обработчик выбора тега товара - показывает районыNr{   rH   u*   Ошибка выбора вариантаT
show_alerttext7u-   Выберите район доставки:ul   Для выбранного варианта в вашем городе районы не настроеныr|   r~   reply_markup)	from_useridr   datarP   r   r3   r   r   answermessagedeleter	   r]   r   r   r   r'   r   )r   user_idr   payloadpid_strcid_strtag_index_strrv   r:   r*   r;   text7_contentrU   
error_textr   kbr%   r%   r&   on_tag_clicked>  sB   r   c                    s   | j j}t|}| jttd }z|dd\}}}}}t|}	t|}
t|}W n ty?   | j	dddI dH  Y dS w z
| j
 I dH  W n	 tyS   Y nw t|dpZd}t||	|
||}| j
j	||d	I dH  | 	 I dH  dS )
u   Обработчик выбора доставки - показывает опции доставки ДЛЯ ВЫБРАННОГО ГОРОДАNr{      u*   Ошибка выбора доставкиTr   text33u/   Выберите способ доставки:r   )r   r   r   r   rP   r   r3   r   r   r   r   r   r	   r   )r   r   r   r   r   r   r   rv   delivery_typer:   r*   r;   text33_contentr   r%   r%   r&   on_delivery_clickedj  s,   r   c              	      s<  | j j}t|}| jttd }z|dd\}}}}}t|}	t|}
t|}W n ty?   | j	dddI dH  Y dS w z
| j
 I dH  W n	 tyS   Y nw t|
}d}|D ]\}}||krh|} nq\|smd}t |	 d|
 d| d| d		}ttt||d
ggd}| j
j	||dI dH  | 	 I dH  dS )u   Обработчик выбора опции доставки - показывает текст доставки в сообщенииNr{   r   u5   Ошибка выбора опции доставкиTr   r^   u<   Информация о доставке не найденаr   r|   r~   r   )r   r   r   r   rP   r   r3   r   r   r   r   r   r9   r   r   r   r'   )r   r   r   r   r   r   r   rv   r   r:   r*   r;   r   r   r   r8   back_to_delivery_cbr   r%   r%   r&   on_delivery_info_clicked  sD    r   c                    s   | j j}t|}| jttd }z|dd\}}}}}t|}	t|}
t|}W n ty?   | j	dddI dH  Y dS w z
| j
 I dH  W n	 tyS   Y nw t|dpZd}d	d
lm} |||	|
||||}| j
j	||dI dH  | 	 I dH  dS )u]   Обработчик выбора района - показывает опции оплатыNr{   r   u&   Ошибка выбора районаTr   text10u+   Выберите способ оплаты:r   )build_payment_keyboardr   )r   r   r   r   rP   r   r3   r   r   r   r   r   r	   rm   r   )r   r   r   r   r   r   r   rv   r\   r:   r*   r;   text10_contentr   r   r%   r%   r&   on_district_clicked  s.   r   c              
      sZ  | 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 z
| j
 I dH  W n	 tyL   Y nw ddlm}m}	m}
m}m} dd	lm} ||}|	|}|sw| j	d
ddI dH  dS d|p{d }d|dd }|dd}|rd| nd}t|dpd}|rd| nd}||g}|r|| |r|| d|}|
||}|||||}|dd}|r||\}}|rz"|r| j
j|||dI dH  W dS | j
j||||dI dH  W dS  ty } ztd|  W Y d}~nd}~ww | j
j	||dI dH  | 	 I dH  dS )u\   Обработчик возврата к карточке товара из product_handlersNr{   r/   u   Ошибка возвратаTr   r   )get_product_detailsget_city_namery   r   resolve_image_path)FSInputFileu   Товар не найденu   🏙️ Город: u   Не указанu   📦 Товар: product_nameu   Без названияproduct_descriptionr^   u   📝 text6
product_image)photocaptionr   zFailed to send photo: r   )r   r   r   r   rP   r   r3   r   r   r   r   r   handlers.catalogr   r   ry   r   r   aiogram.types.input_filer   rN   r	   r4   joinanswer_photor   r   )r   r   r   r   r   r   r:   r*   r   r   ry   r   r   r   product	city_name	city_line	name_linedescription	desc_linetext6_content
text6_linemessage_partscaption_textrq   r   
image_pathis_urlresolved_pathr$   r%   r%   r&    on_back_to_product_from_handlers  s|   



r   )3loggingr   rL   aiogramr   r   aiogram.typesr   r   r   aiogram.fsm.contextr   dbr   r	   r
   r   r   router	getLogger__name__r   r   r   r   r   r   r   r'   r)   r   boolr.   listtupler9   r]   rQ   rn   ry   r   r   r   callback_queryr   
startswithr   r   r   r   r   r%   r%   r%   r&   <module>   sD    

$J&./*"+)